指定为 ffmpeg 的 concat 解复用器创建视频的参数(以避免大量重新编码)

指定为 ffmpeg 的 concat 解复用器创建视频的参数(以避免大量重新编码)

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(单个空白行分隔两个输出)。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- 由于必须符合直播流消费者 (Twitch) 格式规范,其选项规范可能不太灵活ffmpeg。我尚未收到邮件列表的回复,但也在 OBS 论坛中提问过。

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

(我意识到这是一篇很长的文章,因此当然欢迎添加、删减或澄清建议。我会链接到更多官方信息,但由于代表人数不足 10,我不能包含超过 2 个链接!)


1:有关更多背景信息,请参阅我的相关问题:如何高效、自动地使用短转场来连接视频片段?

答案1

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

如果我没看错你的文件比较结果——ab 转场.mkv显示 tcb 为 1/120,而電影显示 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

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

相关内容