android - ffmpeg 覆盖视频无法正常工作
Posted
技术标签:
【中文标题】android - ffmpeg 覆盖视频无法正常工作【英文标题】:android - ffmpeg overlay videos not working properly 【发布时间】:2017-01-02 03:46:58 【问题描述】:我正在尝试做的事情:我有 2 个视频(第一个视频是在应用程序中录制的,第二个是预先录制的,比第一个短)。我正在尝试使用以下 FFMpeg 命令覆盖它:
finalCommand = new String[]"-y",
"-i", vid1,
"-i", vid2,
"-i", aud1,
"-i", aud2,
"-strict", "experimental", "-filter_complex",
"[0:a] volume=0.2 [a8];"
+"[3:a] atrim=end="+String.valueOf(newTimePause)+" [a12];"
+"[3:a] atrim=start="+String.valueOf(newTimePause)+" [a14];"
+"[a14] adelay="+String.valueOf(newDelayInt)+"|"
+String.valueOf(newDelayInt)+" [a16];"
+ "[a8][a12][a16][2:a:0] amix=inputs=4 [a];"
+ "movie=" + watermark + " [watermark];"
+ "[0:v][watermark] overlay=main_w-overlay_w-10:main_h-overlay_h-10 [outv0];"
+ "[1] fifo, scale=iw/2.5:ih/2.5 [vid2];"
+ "[vid2]fifo, trim=end=80.5 [vid5];"
+ "[vid2] fifo, trim=start=80.5 [vid6];"
+ "[outv0][vid5] overlay=10:10:enable=\'between(t,0,84)\' [outv6];"
+ "[outv6][vid6] overlay=10:10:enable=\'between(t,84,101)\' [outv]",
"-map", "[outv]",
"-map", "[a]",
"-r", "30",
"-b",
"4000k",
"-vcodec", "mpeg4",
"-ab", "44100", "-ac", "2", "-ar", "44100",
IOUtils.getFINALdir(this)+"/finalvid.mp4"
;
所以:vid1是app中录制的mp4视频,watermark是一个png图像,在所有vid1过程中都要叠加,vid2是预先录制好的。 vid1和vid2之间的长度差异取决于用户。所以我需要在 80.5 秒处将 vid2 拆分为 2 块,然后将 vid2 的第一块从 vid1 的开头覆盖到用户单击按钮的时间(为了方便,这里硬编码为 84,我知道从 80.5 到 84 的最后一帧将保持覆盖 - 没关系),然后从这个“84”覆盖第二块直到结束。 (对于 aud2 几乎相同 - 对应于 vid2 的音频 - 但 aud2 工作正常)
但是使用这段代码,它看起来需要大量内存,并且大量重叠的 vid2 帧只是丢失了 - 它只是冻结了。而+ "[outv6][vid6] overlay=10:10:enable=\'between(t,84,101)\' [outv]",
这条线破坏了一切,因此从 84 到结束 什么都没有覆盖,包括水印(为什么会这样?)
另一个问题是这太慢了。 Idk 如何导出 720p 或 1080p 的视频,它不会太慢,文件不会很大,不会因 OOM 而停止(现在大约 480p,大约需要 50Mb - 我想要更大的分辨率和更小的尺寸) .
我认为整个命令可以更好地重写,但是如何?我做错了什么以及如何解决这一切?提前致谢!
【问题讨论】:
【参考方案1】:在视频部分试试这个:
+ "movie=" + watermark + " [watermark];"
+ "[1]scale=iw/2.5:ih/2.5,split[vid2a][vid2b];"
+ "[vid2a]trim=end=80.5,fifo[vid2a-ol];"
+ "[vid2b]trim=start=80.5,setpts=PTS+3.5/TB,fifo[vid2b-ol];"
+ "[0][vid2a-ol]overlay=10:10:enable=\'between(t,0,84)\',fifo[outv1];"
+ "[outv1][vid2b-ol]overlay=10:10:enable=\'between(t,84,101)\',fifo[outv12];",
+ "[outv12][watermark]overlay=main_w-overlay_w-10:main_h-overlay_h-10 [outv0]"
【讨论】:
感谢您的帮助!但是第一个覆盖的部分仍然在大约第一帧时冻结:( 添加fifo试试 到最后一行?还是“分裂”部分? 似乎工作正常,非常感谢!还有一个问题,我可以在不损失质量的情况下加快流程吗?还是减小最终视频大小? 如果您需要坚持使用编解码器mpeg4
,请减小-b
的值。如果没有,请切换到 -vcodec libx264
并删除 -b
以上是关于android - ffmpeg 覆盖视频无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章
Android ffmpeg 无法将音频(.wav 文件)与视频(.mp4 文件)合并