在Android中反转视频

And*_*per 13 video android video-capture video-processing mp4parser

我在我的应用程序中录制了一个来自摄像头的视频并保存在设备存储中.现在我想要反转视频,使其从后向播放.如果视频是10秒,那么第10帧的最后一帧将成为第一帧,它从那里开始播放到第一个第二帧.我想将反转的视频保存在一个文件中.我该怎么办呢?

Mic*_*ick 6

如果你准备使用ffmpeg,你可以使用这种方法 - 它基本上将视频分成帧,然后以相反的顺序再次构建它:

有几种方法可以在Android中使用ffmpeg,但"包装"方法是我发现了一种合理的性能和易用性.一些示例Android ffmpeg包装器:

值得注意的是,这对移动设备来说非常耗时 - 如果您能够上传到服务器并在那里进行逆转,那么它可能会更快.


And*_*per 4

感谢 Mick 给了我一个使用 ffmpeg 倒车视频的想法。

\n

我已经在github上发布了用于反转视频以及使用 ffmpeg 执行其他视频编辑操作的代码,并在我的博客文章中发布了完整的教程

\n

正如我的博客文章中所写,

\n
\n

对于倒车视频,首先我们需要将视频分成持续时间为 10 秒或更短的片段,因为除非您的设备有 32 GB RAM,否则 ffmpeg 的倒车视频命令将无法用于长时间视频。

\n

因此,要反转视频-

\n

1.将视频分成持续时间不超过10秒的片段。

\n

2.反转分段视频

\n

3.以相反的顺序连接反向分段视频。

\n

要将视频分割为持续时间为 6 秒的片段,我们可以使用\n以下命令-

\n

String[] complexCommand = {"-i", inputFileAbsolutePath, "-c:v",\n"libx264", "-crf", "22", "-map", "0", "-segment_time", " 6", "-g", "9",\n"-sc_threshold", "0", "-force_key_frames", "expr:gte(t,n_forced*6)",\n"-f", "段", 输出文件绝对路径};

\n

这里,

\n

-c:v libx264

\n

使用 libx264 对所有视频流进行编码

\n

-crf

\n

设置恒定质量模式的质量。

\n

-segment_time

\n

视频每个片段的时间

\n

-G

\n

图像组大小

\n

-sc_阈值

\n

设置场景变化阈值。

\n

-force_key_frames expr:gte(t,n_forced*n)

\n

每 n 秒强制一个关键帧

\n

分割视频后,我们需要反转分割的视频。为此,我们需要运行一个循环,\n每个分割的视频文件都将被反转。

\n

要反转带有音频的视频(不删除其音频),我们可以使用\n以下命令-

\n

String command[] = {"-i", inputFileAbsolutePath, "-vf", "reverse",\n"-af", "areverse", outputFileAbsolutePath};

\n

要反转带有音频的视频并删除其音频,我们可以使用以下\n命令-

\n

String command[] = {"-i", inputFileAbsolutePath, "-an", "-vf",\n"reverse", outputFileAbsolutePath};

\n

要反转没有音频的视频,我们可以使用以下命令-

\n

String command[] = {"-i",inputFileAbsolutePath, "-vf", "reverse",\noutputFileAbsolutePath};

\n

反转分段视频后,我们需要以相反的顺序连接反转的分段视频。为此,我们使用 Arrays.sort(files,LastModifiedFileComparator.LASTMODIFIED_REVERSE) 根据上次修改的文件对视频进行排序。

\n

然后,要连接反向分段视频(与音频),我们可以使用下面的\n命令-

\n

字符串命令[] =\n{"-i",inputFile1AbsolutePath,"-i",inputFile2AbsolutePath\n.....,"-i",inputFileNAbsolutePath,"-filter_complex","[0:v0] [0: a0]\n[1:v1] [1:a1]...[N:vN] concat=n=N:v=1:a=1 [v]\n[a],"-map"," [v]","-map","[a]",outputFileAbsolutePath};

\n

要连接反向分段视频(无音频),我们可以使用下面的\n命令-

\n

字符串命令[] =\n{"-i",inputFile1AbsolutePath,"-i",inputFile2AbsolutePath\n.....,"-i",inputFileNAbsolutePath,"-filter_complex","[0:0] [1: 0]\n[2:0]...[N:0] concat=n=N:v=1:a=0",outputFileAbsolutePath};

\n

这里,

\n

-filter_complex [0:v0] [0:a0] [1:v1] [1:a1]\xe2\x80\xa6[N:vN] 告诉 ffmpeg 将哪些流发送到 concat 过滤器。在上述情况下,视频来自输入 0 的流 0\n[0:v0] 和音频流 0 [0:a0],来自输入 1 的视频流 1 [1:v1]\n 和音频流 1 [1:v1] 等等。

\n

concat 过滤器用于连接音频和视频流,\n将它们一个接一个地连接在一起。过滤器接受以下\n选项:

\n

n

\n

设置段数。默认值为 2。

\n

v

\n

设置输出视频流的数量,即每个分段中\n视频流的数量。默认值为 1。

\n

A

\n

设置输出音频流的数量,即每个分段中\n音频流的数量。默认值为 0。

\n
\n