仅延迟 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 0
的 v
视频流(-i "test.mp4"
是第一个未延迟的输入,ID 为 0
),连同输入 id 1
的 a
音频流(-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 毫秒,以抵消后续滤波器中将发生的情况;最终左声道会回到原来的位置
如何仅对包含立体声音频流的 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 0
的 v
视频流(-i "test.mp4"
是第一个未延迟的输入,ID 为 0
),连同输入 id 1
的 a
音频流(-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 毫秒,以抵消后续滤波器中将发生的情况;最终左声道会回到原来的位置