指定为ffmpeg的concat demuxer创建视频的参数(避免大量重新编码)


2

ffmpeg可以用来将文件连接在一起

如果您的媒体文件具有完全相同的编解码器和编解码器参数,您可以将它们连接起来[...]

(强调我的)我的目的1是生成具有相同编解码器和参数的媒体文件,这样我就可以利用concat而不会进行长时间的重新编码。

前言:

我有一个文件,我想剪切并保留有用的部分。我编写了一个python脚本来找到最接近所需切割点的关键帧,并在那里切割,因为在进行流复制时,ffmpeg只能使用I帧:

将-ss作为输入选项与-c:v copy一起使用可能不准确,因为强制ffmpeg仅在i帧上使用/拆分。

碰巧的是,分裂不是恰好在恰当的时刻发生,而是足够接近我可以专注于等式的另一部分的那一刻。如果我concat在这一点上使用分离器,那么不同的部件会完美地连接在一起 - 到目前为止一切都很好!

但是,我希望这些段之间有平滑的过渡,因此我进一步拆分这些段,以便短端可用于创建交叉淡入淡出过渡,而无需重新编码整个文件集。

基本图表可能有助于说明这一点:

  [111AAAA111BBBBB111111CCCCCCC1111DDDDD111]   | (original file)
     [AAAA] [BBBBB]    [CCCCCCC]  [DDDDD]      | (desired clips extracted)
[AAA] [A][B] [BBB] [B][C] [CCCCC] [C][D] [DDDD]| (split ends from clips)
      [AAA][ab][BBB][bc][CCCCC][cd][DDD]       | (transitions between short ends)
            [AAAabBBBbcCCCCCcdDDD]             | (intended output)

问题:

这就是我要去的地方。当我用ffmpegconcat分路加入剪辑上面我得到显著的视频和音频的文物上播放。我的猜测是编解码器参数不匹配,正如本问题顶部的先决条件所述。因此,检查视频ffprobe给出:

$ ffprobe -i ab-transition.mkv 2>&1 | grep Stream.*Video ; ffprobe -i B.mkv 2>&1 | grep Stream.*Video
Stream #0:0: Video: h264 (Main), yuv420p(tv, bt709/bt709/iec61966-2-1), 1280x720, SAR 1:1 DAR 16:9, 62.50 fps, 62.50 tbr, 1k tbn, 120 tbc (default)
Stream #0:0: Video: h264 (Main), yuv420p(tv, bt709/bt709/iec61966-2-1), 1280x720 [SAR 1:1 DAR 16:9], 62.50 fps, 62.50 tbr, 1k tbn, 125 tbc (default)

(我省略了音频流输出,因为流表面上具有相同的参数,但音频未正确连接)

有区别。我用它-show_streams来获取更详细的信息,可以在http://pastebin.com/4vcnDYtj上找到(单个空白行分隔2个输出)。diff输出给出:

7c7
< codec_time_base=1/120
---
> codec_time_base=1/125
70,71c70,71
< start_pts=12
< start_time=0.012000
---
> start_pts=11
> start_time=0.011000

更新:

我找到了除编解码器时基(tbc)之外我能看到的所有内容的选项和匹配参数。是否有设置允许我设置codec_time_base(tbc)?设置-r无效。

更新2:担心这个问题对于SU来说太小众了,我问了ffmpeg-user邮件列表的问题。遗憾的-time_base是,在这种情况下,不适合编码器选项:

这是您尝试用于外部编码器(x264)的FFmpeg内部编码器的选项。

更不幸的是,当我询问一般可行性时,答复是

我不认为这是可能的。

我已经要求澄清和原始编码软件的可能性 - 在这种情况下OBS- 在选项规范中可能不太灵活,而不是ffmpeg由于必须匹配实时流消费者(Twitch)格式规范。我还没有收到邮件列表的回复,但也在OBS论坛上提出过要求。

更重要的是,控制这些是否允许我使用concat分路器ffmpeg将它们连接在一起而无需长编码过程?提前谢谢了。

(我意识到这是一个半文本的墙,所以当然欢迎添加,删减或澄清建议。我会链接到更多官方信息但是<10 rep我不能包含超过2个链接! )


1:有关更多上下文,请参阅我的相关问题:如何使用短转换高效且自动地连接视频剪辑?


1
还没有放弃。;-)我意识到这是违背你的意图的,但你是否尝试过使用编码器而不是编解码器副本进行最终的concat操作,以查看是否消除了a / v工件?至少,你可以发布你用来生成剪辑和过渡的完整ffmpeg命令吗?
先生

@ Mr.What很高兴听到它 - 我一直在广泛地提问(根据更新)。使用编解码器选项将导致最终的转码; 但是应该像你说的那样消除文物。我很确定我在花了很多个小时测试了这个!我可以肯定地发布命令,但是根据我的其他(链接)问题,转换是通过融合(MLT)生成的。没有人问我似乎能够修改时基; 即使我从源(OBS)端解决它,x264选项-time_base也会被忽略!
bertieb 2015年

1
进一步深入到文档中,有一个settb过滤器可能值得尝试,因为它将应用于x264编码器之外 - ffmpeg input.ext -vf "settb=expr=1/125" -c:v libx264, etc. output.ext。或者到目前为止,您的旅行中是否已经提及/试过了这个?
先生

@ Mr.What那个过滤器看起来很有前途,但转码带有时基125的文件无法产生120(或任何其他)的所需时基,即使它大大抱怨“过去持续时间0.874992(等)太大”: - /虽然好思考!通过手动计数,情节进一步变厚,原始文件在播放时似乎每秒有60帧(不是62-63)。不确定这是否是因为时间基因导致玩家忽略帧。在这里深入兔子洞!
伯蒂克2015年

好吧,奇怪的FPS和时基与编解码器复制到你的非过渡剪辑的输出一致,所以没有真正的惊喜。我想知道包含-copyinkf(包括-c copy输出中的前导非关键帧)是否有助于最终的连接,以及是否值得强制编码的过渡剪辑以合理的帧速率通过libx264。就像一个实验一样,尝试使用-copyinkf -c:v copy -c:a copytrans 来重新创建“a”和“b”剪辑。剪辑使用libx264 -r 60,然后连接这三个,看看是否有区别。
先生

Answers:


2

根据通用编解码器选项,您可以-time_base在创建过渡剪辑期间添加到libx264编码器集。

如果我正确地读你的文件比较 - ab-transition.mkv显示tcb为1/120而B.mkv显示1/125(这是你想要的值,对吗?) - 我建议包括一个-r值以确保帧速率和时基都得到维护:

-c:v libx264 [preset & crf/qp settings] -r 62.50 -time_base 1/125 [output]

作为旁注,我想提一下,我自己尝试使用concat demuxer 而不完全重新编码输出文件总是会导致问题,主要是音频同步和帧丢失。通过使用无损音频和视频编码单独的剪辑来保持原始质量,获得了最佳效果......

-c:v -libx264 -preset ultrafast -qp 0 -c:a pcm_s16le

...然后使用与创建源视频相同的音频/视频设置对最终文件进行编码。


@mr-谢谢你的答案,你正在思考我的想法。不幸的是,既没有-time_base也没有-r正确的效果 - 我将更新OP的更多细节。
bertieb 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.