将 wav 文件从 WAV_FORMAT_EXTENSIBLE 转换为 WAV_FORMAT_PCM

将 wav 文件从 WAV_FORMAT_EXTENSIBLE 转换为 WAV_FORMAT_PCM

我有一个 16 位 44.1kHz 格式的 wav 文件。在命令行上将WAV_FORMAT_EXTENSIBLE其转换为什么简单有效的方法?WAV_FORMAT_PCM

我优先考虑 ffmpeg 解决方案,但我也愿意使用其他工具。

如果有帮助的话,这是一个示例文件

此外,我还看到这个帖子,但接受的答案并未回答问题。

答案1

您链接的 SO 帖子回答了您的问题,但它引用的代码太旧了。

ffmpeg根据输入音频的“规格”创建WAVE_FORMAT_PCMWAVE_FORMAT_EXTENSIBLE。本质上没有办法告诉它要创建哪一个。

它确实可以创建WAVE_FORMAT_PCM16 位 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 字节ffmpegPCMWAVEFORMAT代替WAVEFORMAT当它不遵循时WAVEFORMATEX

相关内容