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

问题描述 投票:2回答:2

看起来我可以拥有一个或另一个(-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秒)。我认为它做了“offset-seek = 1”类型的事情。

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

干杯!

video ffmpeg mp4 video-encoding ffprobe
2个回答
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

0
投票

“我希望音频能够立即开始播放,视频将在4秒后开始播放, (在视频中搜索3秒)。

没有重新编码怎么办呢?“

尝试使用as:

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 =输入0秒输入audio.mp4作为输出音轨的起点。

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

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

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

附注:

关于视频:MPEG视频只能寻找关键帧(也称为i-frames)。事情可能无法按预期工作,如果你设置-ss 3同时也使用-c:v copy,并且在-ss时没有找到关键帧。

在3秒内可能缺少关键帧可能会解释您的:

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

这甚至在文档中都被警告过(参见:FFmpeg wiki page - Seeking)。

在做编解码器复制时寻求

使用-ss作为输入选项以及-c:v副本可能不准确,因为ffmpeg被强制仅在i帧上使用/拆分。虽然它可以 - 如果可能将流的开始时间调整为负值以补偿它。

基本上,如果你指定“第二个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之后添加)。
© www.soinside.com 2019 - 2024. All rights reserved.