android - ffmpeg覆盖视频无法正常工作

时间:2017-01-02 03:46:58

标签: java android video ffmpeg

我正在尝试做什么:我有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是应用程序中录制的mp4视频,水印是应在所有vid1中重叠的png图像,而vid2是预先录制的视频。而vid1和vid2之间的长度差异取决于用户。所以我需要将80.5秒的vid2分成两部分,然后将第一部分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 个答案:

答案 0 :(得分:0)

尝试使用视频部分:

                    + "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]"