我需要在广告时段将 I 帧添加到 mp4 的中间,这样我就可以分割到 HLS 并在视频提示回来时获得 I 帧。我知道如何在重新编码整个视频并在特定位置强制关键帧时执行此操作,但我更愿意剪掉需要关键帧的位置(可能是 1 秒的视频),添加关键帧,然后将视频拼接在一起。这应该会大大减少编码时间,因为我可以复制大部分编解码器,除了添加 I 帧的那一秒视频。
唯一的问题是,视频配置文件和设置会在我添加 I 帧的地方发生变化,而当我将它们重新组合在一起时,我无法获得清晰的拼接。我知道我可以使用 进行重新编码concat
,但我试图避免处理时间。
我尝试使用 ffmpeg 进行的一些简单示例:
ffmpeg -i input.mp4 -ss 30 -t 1 -c:a copy -y -copyts clipped2.mp4
ffmpeg -i input.mp4 -t 30 -c copy -y -copyts clipped1.mp4
ffmpeg -i "concat:clipped1.mp4|clipped2.mp4" -c copy -y newOutput.mp4
我可能必须使用ffprobe
并指定 1 秒剪辑的比特率、配置文件和其他设置,以便它不会默认为一些随机的东西,但我仍然无法让它正常工作。
有人做到过吗?这是专门为服务器端广告插入而做的。
答案1
我正在复制这个答案:
您可以使用 ffmpeg 的-force_key_frames
选项将关键帧插入到您想要的位置。
例如:
./ffmpeg -i input.mp4 -c:a copy -c:v copy -force_key_frames 0:05:00,0:10:00 out.mp4
将把关键帧尽可能地放在靠近 5 和 10 秒的位置。时间值可以采用 hh:mm:ss 格式,也可以只采用秒数(单个值,无冒号)。
您可以使用以下命令检查是否有框架插入到您想要的位置:
./ffprobe -select_streams v:0 -skip_frame nokey -show_entries frame=pkt_pts_time out.mp4