我使用以下方法从 24 位立体声 wav 文件中提取单声道 l 和 r wav,但结果是两个 16 位文件:
ffmpeg -i stereo24bit.wav -map_channel 0.0.0 left.wav -map_channel 0.0.1 right.wav
我应该添加什么或如何更改它以保留原始的 24 位深度?搜索没有找到答案,有些类似的结果但不是我想要的。
答案1
我想复制并避免任何重新编码
-map_channel
是平底锅过滤器。您不能过滤流,也不能流复制但是,由于您的输入和输出都是 PCM,所以这并不重要。
我如何保留原始的 24 位深度?
某些编码器(例如 flac)支持多种采样格式,并ffmpeg
会自动尝试选择最高深度。但.wav
输出的默认编码器是 pcm_s16le,它只有 16 位(请参阅ffmpeg -h encoder=pcm_s16le
),因此在这种情况下您需要手动提供支持 24 位的编码器的名称,例如 pcm_s24le。
-地图通道
ffmpeg -i stereo24bit.wav -map_channel 0.0.0 -c:a pcm_s24le left.wav -map_channel 0.0.1 -c:a pcm_s24le right.wav
通道分割
或者如果你想使用通道分割过滤器可能比传统-map_channel
选项更直观:
ffmpeg -i stereo24bit.wav -filter_complex "channelsplit=channel_layout=stereo:channels=FL|FR[left][right]" -map "[left]" -c:a pcm_s24le left.wav -map "[right]" -c:a pcm_s24le right.wav
或者根据您的具体情况,您可以只使用通道分配默认值:
ffmpeg -i stereo24bit.wav -filter_complex "channelsplit[left][right]" -map "[left]" -c:a pcm_s24le left.wav -map "[right]" -c:a pcm_s24le right.wav
验证
您可以添加-loglevel debug
全局选项来查看有关该过程的更多详细信息:
[graph_0_in_0_0 @ 0x55be6dfc6e00] Setting 'sample_fmt' to value 's32
[auto_resampler_0 @ 0x55be6dfcab40] picking s32p out of 6 ref:s32
[auto_resampler_0 @ 0x55be6dfcab40] [SWR @ 0x55be6dfcb000] Using s32p internally between filters
[auto_resampler_0 @ 0x55be6dfcab40] ch:2 chl:stereo fmt:s32 r:44100Hz -> ch:2 chl:stereo fmt:s32p r:44100Hz
[auto_resampler_1 @ 0x55be6dfe0940] ch:1 chl:1 channels (FR) fmt:s32p r:44100Hz -> ch:1 chl:1 channels (FR) fmt:s32 r:44100Hz