仅延迟 mp4 文件中音频流的一个通道

Delay only one channel of audio stream in mp4 file

如何仅对包含立体声音频流的 mp4 的 1 个音频通道应用延迟?


我有一个视频 test.mp4 有 2 个流:

Stream #0:0[0x1](und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 8042 kb/s, 60 fps, 60 tbr, 60k tbn (default)
Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 126 kb/s (default)

如您所见,AAC 音轨是立体声的。我需要将 2 秒 延迟应用于音频流(流 1)中的 right 通道。

这是一个脚本,它成功地为 两个 音频流 (detailed description here):

ffmpeg -i "test.mp4" -itsoffset 2 -i "test.mp4" -map 0:v -map 1:a -c:v copy "test_delay.mp4"

基本上它使用 -map 选项来获取输入 ID 0v 视频流(-i "test.mp4" 是第一个未延迟的输入,ID 为 0),连同输入 id 1a 音频流(-itsoffset 2 -i "test.mp4" 是第二个 id 为 1 的 2 秒延迟输入)组成最终的输出。

我想我应该尝试使用 -map_channel,但我很困惑如何将它与 -itsoffset 选项结合起来。

以下结果导致视频没有音频流:

ffmpeg -i "test.mp4" -itsoffset 2 -i "test.mp4" -map 0:v -map_channel 1.1.0:0.0 -map_channel 1.1.1:0.1 -c:v copy "test_delay.mp4"

而以下(包括这次 -map 1:a)导致 R ch 成功延迟,但根本没有 L ch(单声道音频流):

ffmpeg -i "test.mp4" -itsoffset 2 -i "test.mp4" -map 0:v -map 1:a -map_channel 1.1.0:0.0 -map_channel 1.1.1:0.1 -c:v copy "test_delay.mp4"

有什么建议吗?


此命令将 运行 由一个自动化且不受监控的系统执行,因此我真的尽可能将其限制为仅执行 1 个命令。

使用adelay过滤器:

ffmpeg -i "test.mp4" -i "test.mp4" \
  -filter_complex[1:a]adelay=0|2000[out] \
  -map 0:v -c:v copy "test_delay.mp4"

adelay 采用以毫秒为单位的延迟序列,由 | 分隔,立体声通道布局为 LEFT|RIGHT,因此将第二个延迟设置为 2000 毫秒。

@kesh 的回答是正确的,但如果单个音频通道必须及时移动而不是延迟,请参阅此命令,它使用过滤器将正确的音频流通道偏移 2 秒 test.mp4

ffmpeg -i "test.mp4" -filter_complex "[0:a]adelay=2000|0,atrim=start=2:duration=99,asetpts=PTS-STARTPTS[out]" -map "[out]" -map 0:v -c:v copy -shortest "test_delay.mp4

注意

  • test.mp4 已知持续时间短于 99 秒
  • adelay=2000|0 将 LEFT 声道延迟 2000 毫秒,以抵消后续滤波器中将发生的情况;最终左声道会回到原来的位置