ffmpeg - 制作干净的 WAV 文件

ffmpeg - Making a Clean WAV file

我希望使用 ffmpeg 将大量文件批量转换为音频文件,用于名为 Star Wars: Jedi Knight: Dark Forces II 的游戏。我遇到的问题是 ffmpeg 似乎正在做一些事情 Jedi Knight 无法播放声音文件。

Jedi Knight 接受各种范围的普通旧 PCM WAV 文件,从 5khz 到 96khz,8 位和 16 位,单声道和立体声。这听起来简单明了。除了使用 MS Sound Recorder 创建 WAV 文件之外,Jedi Knight 无法播放它。推测是它在 header 或其他东西上添加了一些额外的东西。但它可以播放 AudacityGoldWaveModPlug Tracker 创建的 WAV 文件。

那么为什么不ffmpeg呢?我使用了错误的编解码器或参数吗?我从游戏中获取了原始声音文件并执行了以下操作:

ffmpeg -i "orig_thrmlpu2.wav" -f wav -acodec pcm_s16le -ar 22050 -ac 1 "ffmpeg_thrmlpu2.wav"

ffmpeg版本在游戏中无法播放。 ffprobe 表明 ffmpeg 版本有一些 Metadataoriginal 没有。我应该使用什么参数来尝试获得与原始格式相同的 WAV 格式?请注意,-ar-acbits 不是重要部分。

以下是供您检查的文件:http://www.edwardleuf.org/Games/JK/thrmlpu2.zip

FFMpeg 默认情况下会向 WAV 输出添加一个 LIST-INFO 块。添加 -bitexact 会抑制它。

所以,

ffmpeg -i "orig.wav" -f wav -bitexact -acodec pcm_s16le -ar 22050 -ac 1 "ffmpeg.wav"

根据此功能要求 ffmpeg 更改其 wav header 文件,问题是 2 个可选字节。 cbSize 应该只用于 non-pcm 数据。

https://ffmpeg.org/pipermail/ffmpeg-devel/2013-April/142576.html

截至 2013 年,header ffmpeg 编写的是“80 字节或 46,如果你设法抑制 LIST-INFO 块。”

那里写的解决方案是在使用ffmpeg时使用这些参数。

> I must use ffmpeg -i ... -f s16le tmp.dat and then mplayer -demuxer rawaudio -rawaudio rate=44100:channels=2:samplesize=2 -ao pcm tmp.dat to get "normal" wav file, many program can't read ffmpeg's wav file, they read 44 bytes of header, and others data use as sound, sometimes it caused broken byteorder, or they say that file is broken and can't read file at all. So I want get "correct" wav from ffmpeg directly. Sorry for my bad english :)

如果 -bitexact 不适用,此处列出的方法可能有效。例如,将 wav 转换为 wav 以修复 header.