看起来我可以拥有一个或另一个(-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”类型的事情。
如何防止搜索影响偏移量?
干杯!
正如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
“我希望音频能够立即开始播放,视频将在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
之后添加)。