我已经在我的应用程序中录制了来自相机的视频并保存在设备存储中。现在我想反转视频,使其从后播放。即如果视频是 10 秒,那么第 10 秒的最后一帧将成为第一帧并且它从那里开始播放到第一帧的第一秒。我想将反转的视频保存在一个文件中。我应该如何继续?
2 回答
如果您准备使用 ffmpeg,则可以使用这种方法 - 它基本上将视频分成帧,然后以相反的顺序再次构建:
在 Android 中有几种使用 ffmpeg 的方法,但我发现“包装器”方法是性能和易用性的合理结合。一些示例 Android ffmpeg 包装器:
- http://hiteshsondhi88.github.io/ffmpeg-android-java/
- https://github.com/guardianproject/android-ffmpeg
值得一提的是,这在移动设备上会很耗时——如果您有幸能够上传到服务器并在那里进行反转,它可能会更快。
感谢 Mick 给了我一个使用 ffmpeg 反转视频的想法。
我已经在github上发布了用于反转视频以及使用 ffmpeg 执行其他视频编辑操作的代码,并在我的博客文章中完成了教程。
正如我的博文中所写,
对于反转视频,首先我们需要将视频分成持续时间为 10 秒或更短的片段,因为 ffmpeg 的反转视频命令不适用于长时间的视频,除非您的设备有 32 GB 的 RAM。
因此,要反转视频-
1.将视频分成持续时间为 10 秒或更短的片段。
2.反转分割的视频
3.以相反的顺序连接反向分段视频。
要将视频划分为持续时间为 6 秒的片段,我们可以使用以下命令 -
String[] complexCommand = {“-i”,inputFileAbsolutePath,“-c:v”,“libx264”,“-crf”,“22”,“-map”,“0”,“-segment_time”,“6” , “-g”, “9”, “-sc_threshold”, “0”, “-force_key_frames”, “expr:gte(t,n_forced*6)”, “-f”, “segment”, outputFileAbsolutePath};
这里,
-c:v libx264
使用 libx264 编码所有视频流
-crf
为恒定质量模式设置质量。
-segment_time
每段视频的时间
-G
GOP 大小
-sc_threshold
设置场景变化阈值。
-force_key_frames expr:gte(t,n_forced*n)
每 n 秒强制一个关键帧
分割视频后,我们需要反转分割的视频。为此,我们需要运行一个循环,每个分割的视频文件将被反转。
要反转带有音频的视频(不删除其音频),我们可以使用以下命令 -
字符串命令[] = {"-i", inputFileAbsolutePath, "-vf", "reverse", "-af", "areverse", outputFileAbsolutePath};
要反转带有音频的视频删除其音频,我们可以使用以下命令 -
字符串命令[] = {"-i", inputFileAbsolutePath, "-an", "-vf", "reverse", outputFileAbsolutePath};
要反转没有音频的视频,我们可以使用以下命令 -
字符串命令[] = {"-i",inputFileAbsolutePath, "-vf", "reverse", outputFileAbsolutePath};
反转分段视频后,我们需要以相反的顺序连接反转的分段视频。为此,我们使用 Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_REVERSE) 根据上次修改的文件对视频进行排序。
然后,要连接反向分段视频(带音频),我们可以使用以下命令 -
字符串命令[] = {"-i",inputFile1AbsolutePath,"-i",inputFile2AbsolutePath .....,"-i",inputFileNAbsolutePath,"-filter_complex","[0:v0] [0:a0] [1 :v1] [1:a1]...[N:vN] concat=n=N:v=1:a=1 [v] [a],"-map","[v]","-map ","[a]", 输出文件绝对路径};
要连接反向分段视频(无音频),我们可以使用以下命令 -
字符串命令[] = {"-i",inputFile1AbsolutePath,"-i",inputFile2AbsolutePath .....,"-i",inputFileNAbsolutePath,"-filter_complex","[0:0] [1:0] [2 :0]...[N:0] concat=n=N:v=1:a=0",outputFileAbsolutePath};
这里,
-filter_complex [0:v0] [0:a0] [1:v1] [1:a1]...[N:vN] 告诉 ffmpeg 哪些流要发送到 concat 过滤器。在上述情况下,视频流 0 [0: v0] 和音频流 0 [0:a0] 来自输入 0,视频流 1 [1:v1] 和音频流 1 [1:v1] 来自输入 1,依此类推。
concat 过滤器用于连接音频和视频流,将它们一个接一个地连接在一起。过滤器接受以下选项:
n
设置段数。默认值为 2。
v
设置输出视频流的个数,也就是每个段的视频流个数。默认值为 1。
一个
设置输出音频流的数量,也就是每段的音频流数量。默认值为 0。