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 覆盖视频无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

FFMpeg音视频操作命令

Android ffmpeg 无法将音频(.wav 文件)与视频(.mp4 文件)合并

Android使用FFMpeg实现推送视频直播流到服务器

无法使用DXVA2和ffmpeg解码HEVC视频

FFMPEG:结合“从图像创建视频”+ 缩放到 x + 添加音频 + 覆盖徽标

使用 FFMPEG 以最少的重新编码添加覆盖