在android中反转视频

Posted

技术标签:

【中文标题】在android中反转视频【英文标题】:Reverse video in android 【发布时间】:2016-01-18 17:42:54 【问题描述】:

我在我的应用程序中录制了来自相机的视频并保存在设备存储中。现在我想反转视频,使其从反向播放。即如果视频为 10 秒,那么第 10 秒的最后一帧将成为第一帧,并从那里开始播放到第 1 秒的第一帧。我想将反转的视频保存在文件中。我应该如何继续?

【问题讨论】:

@MohanadKholy 它的 gud 文章..但我找不到在其中反转视频的方法? 这与android无关这是与videolibrary有关的东西,可以反转你的视频 @raj 我想反转在我的 android 应用中录制的视频并在我的 android 应用中显示反转的视频.. 是否有任何库? 另一个选项是OpenCV。 【参考方案1】:

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

https://***.com/a/8137637/334402

在 Android 中使用 ffmpeg 有多种方法,但我发现“包装器”方法是性能和易用性的合理结合。一些示例 Android ffmpeg 包装器:

http://hiteshsondhi88.github.io/ffmpeg-android-java/ https://github.com/guardianproject/android-ffmpeg

值得注意的是,这在移动设备上会很耗时 - 如果您有幸能够上传到服务器并在那里进行反转,它可能会更快。

【讨论】:

以前我使用此依赖项compile 'com.github.hiteshsondhi88.libffmpeg:FFmpegAndroid:0.2.5' 擦洗视频。我应该继续使用此依赖项来反转视频吗? 理论上使用包装器方法,如果一个命令有效,那么任何命令都应该有效,但值得记住的是,ffmpeg 实际上并没有被设计成这样包装,所以我不认为你可以100% 确定,无需测试。如果它对你有用,我无论如何都会从那里开始,因为它很有可能也适用于这个。需要注意的一件事 - 如果您还需要反转音频(出于某种原因......),那么上述方法使用“sox”,这是一个单独的实用程序。上面的监护人链接包括sox虽然我没有亲自使用过。 谢谢..如何将 sox 实用程序集成到我的 android 项目中? 看看github.com/guardianproject/android-ffmpeg-java/blob/master/src/…中的'combine'函数 @AndroidLearner :- 你在android中找到反向视频功能的代码了吗?我也想要。。【参考方案2】:

感谢 Mick 给我一个使用 ffmpeg 反转视频的想法。

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

正如我的博文中所写,

对于倒车视频,首先我们需要将视频分成几段 持续时间为 10 秒或更短,因为反向视频命令 ffmpeg 不适用于长时间的视频,除非您的设备有 32 GB 内存。

因此,要反转视频-

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", "反向", outputFileAbsolutePath;

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

字符串命令[] = "-i",inputFileAbsolutePath, "-vf", "reverse", 输出文件绝对路径;

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

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

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

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

字符串命令[] = "-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 [1:v1] 等等。

concat 过滤器用于连接音视频流,加入 他们一个接一个地在一起。过滤器接受以下 选项:

n

设置段数。默认为 2。

v

设置输出视频流的个数,也就是视频流的个数 每个片段中的视频流。默认为 1。

一个

设置输出音频流的个数,也就是输出音频流的个数 每个片段中的音频流。默认为 0。

【讨论】:

如果我可能会问,此解决方案的性能如何。因为上次我在android上修改ffmpeg,性能不是很好。处理一个 15 秒的视频需要 50 秒,即使我能找到所有优化。 @vxh.viet 反转视频的过程确实需要一些时间。FFmpeg 提供了某些预设,这些预设是为该过程提供一定速度的选项的集合。 Utrafast 预设对加快进程特别有用。要使用预设,只需在命令中添加“-preset”,“ultrafast”即可。请查看here 了解有关选择预设的详细说明。另外建议使用最慢的预设你有耐心的预设。 @BhuvneshVarma 我能获得安卓应用的链接吗?

以上是关于在android中反转视频的主要内容,如果未能解决你的问题,请参考以下文章

如何在Android上实现实时视频编辑?

Android:位图图像在预览中反转?

图像反转:Android

IOC 控制反转Android 布局依赖注入 ( 布局依赖注入步骤 | 布局依赖注入代码示例 )

IOC 控制反转Android 视图依赖注入 ( 视图依赖注入步骤 | 视图依赖注入代码示例 )

IOC 控制反转Android 事件依赖注入 ( 事件依赖注入代码示例 )