如何为mp4容器的视频流指定偏移量和搜寻位置?

时间:2019-03-13 16:57:23

标签: video ffmpeg mp4 video-encoding ffprobe

似乎我可以拥有一个(-ss-itsoffset),但不能同时拥有两个,或者它们彼此抵消。

我使用以下命令创建output.mp4:

ffmpeg -i input.mp3 -itsoffset 4 -t 4 -ss 3 -i input.mp4 -c:v copy output.mp4

使用此命令,我希望音频立即开始播放,而视频则在4秒后开始播放,这是在3秒内找到的。

但是,当我播放input.mp4时,视频仅比音频晚一秒钟(而不是4秒)开始播放。我想它做的是“偏移-搜寻= 1”类型的事情。

如何防止搜寻影响偏移量?

干杯!

2 个答案:

答案 0 :(得分:0)

正如Gyan所建议的,我通过使用搜索位置和持续时间对视频流进行单独编码来使其工作:

ffmpeg -t 4 -ss 3 -i input.mp4 -c:v libx264 output.mp4

然后将其在最终的.mp4中与偏移量混合:

ffmpeg -i input.mp3 -itsoffset 4 -i input.mp4 -c:v copy output.mp4

答案 1 :(得分:0)

  

”“我希望音频立即开始播放,而视频会在4秒后开始播放,
(在视频中等待3秒)。

     

如何无需重新编码?”

尝试用作:

ffmpeg -ss 00:00:03 -itsoffset 4 -i video.mp4 -ss 00:00:00 -i audio.mp3 -c:v copy output.mp4

命令的含义(它们的输入/顺序也很重要)...

-ss 00:00:03 =搜索3秒钟的输入video.mp4,将其设置为输出视频轨道的起点。

-itsoffset 4 =设置输入播放为输出之前的延迟。保持静止帧4秒钟。

-i video.mp4 =此时设置视频输入。

-ss 00:00:00 =搜索输入audio.mp4的0秒作为输出音频音轨的起点。

-i audio.mp3 =此时设置音频输入((请参见下面的音频旁注)。

-c:v copy =(避免重新编码视频音轨)。

output.mp4 =设置输出a / v 容器

旁注:

关于视频: MPEG视频只能搜索关键帧(也称为i-frames)。如果您在同时使用-ss 3的同时设置-c:v copy,并且在-ss时找不到关键帧,则事情可能无法按预期进行。

3秒可能缺少关键帧可能解释了您的原因:

  

“当我播放input.mp4时,视频开始播放的时间仅比音频晚1秒(而不是4秒)”

甚至在文档中警告(请参阅:FFmpeg wiki page - Seeking)。

  

在进行编解码器复制时寻求

     

-ss-c:v复制一起用作输入选项可能不正确,因为ffmpeg被强制仅在i帧上使用/拆分。尽管会,但可能的话,请将流的开始时间调整为负值以弥补这一点。

     

基本上,如果您指定“ second 157”并且直到秒159才有关键帧,则它将在开始时包含两秒钟的音频(无视频),然后从第一个关键帧开始。

So be careful when splitting and doing codec copy

唯一的解决方案是保持测试/调整视频-ss的值以找到次要的折衷方案。

  • 考虑使用HOURS:MM:SS.MILLISECONDS时间格式来最接近预期的 3 秒。 示例: -ss 00:00:02.895

关于音频: MP4通常具有AAC音轨。请注意,由于您输入的音频为MP3格式,因此FFmpeg会将其自动重新编码为AAC格式。

  • 为避免音频格式重新编码:用-c:a copy强制MP3
    (可以在上述-c:v copy之后添加)。