答案1
您链接的 SO 帖子回答了您的问题,但它引用的代码太旧了。
ffmpeg
根据输入音频的“规格”创建WAVE_FORMAT_PCM
或WAVE_FORMAT_EXTENSIBLE
。本质上没有办法告诉它要创建哪一个。
它确实可以创建WAVE_FORMAT_PCM
16 位 44.1KHz 单声道/立体声输入,但现代 ffmpeg(3.2 或更高版本),它还检查通道布局(由输入文件提供,或者在运行时由用户用覆盖-channel_layout
)。
我无法告诉你关于你的“其他”文件的任何信息,但你提供的示例文件的“问题”是它有一个频道布局,而布局不是AV_CH_LAYOUT_MONO:
$ ffprobe -hide_banner tiny.wav
Input #0, wav, from 'tiny.wav':
Metadata:
artist : Paul and M solo
encoder : Lavf59.16.100
Duration: 00:00:00.20, bitrate: 710 kb/s
Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, 1 channels (FR), s16, 705 kb/s
(请注意(FR)
以下1 channels
)
解决方案是覆盖布局:
$ ffmpeg -i tiny.wav -c copy tiny2.wav -channel_layout mono -c copy tiny3.wav &> /dev/null
$ ffprobe -hide_banner tiny2.wav
Input #0, wav, from 'tiny2.wav':
Metadata:
artist : Paul and M solo
encoder : Lavf59.16.100
Duration: 00:00:00.20, bitrate: 710 kb/s
Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, 1 channels (FR), s16, 705 kb/s
$ ffprobe -hide_banner tiny3.wav
Input #0, wav, from 'tiny3.wav':
Metadata:
artist : Paul and M solo
encoder : Lavf59.16.100
Duration: 00:00:00.20, bitrate: 709 kb/s
Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, 1 channels, s16, 705 kb/s
$ du -b tiny*
17766 tiny2.wav
17742 tiny3.wav
17766 tiny.wav
(2 字节cbSize
字段加上引用的额外(元)数据cbSize
,至少为 22 字节,等于 24 字节。以下wBitsPerSample
情况不会省略2 字节ffmpeg
PCMWAVEFORMAT
代替WAVEFORMAT
当它不遵循时WAVEFORMATEX
。