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)
问题:
这就是我要去的地方。当我用ffmpeg
的concat
分路加入剪辑上面我得到显著的视频和音频的文物上播放。我的猜测是编解码器参数不匹配,正如本问题顶部的先决条件所述。因此,检查视频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:有关更多上下文,请参阅我的相关问题:如何使用短转换高效且自动地连接视频剪辑?
-copyinkf
(包括-c copy
输出中的前导非关键帧)是否有助于最终的连接,以及是否值得强制编码的过渡剪辑以合理的帧速率通过libx264
。就像一个实验一样,尝试使用-copyinkf -c:v copy -c:a copy
trans 来重新创建“a”和“b”剪辑。剪辑使用libx264 -r 60
,然后连接这三个,看看是否有区别。