【问题标题】:ffmpeg - Making a Clean WAV fileffmpeg - 制作干净的 WAV 文件
【发布时间】:2016-09-23 19:22:13
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: audio ffmpeg game-engine wav


    【解决方案1】:

    默认情况下,FFMpeg 将 LIST-INFO 块添加到 WAV 输出。添加-bitexact 会抑制它。

    所以,

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

    【讨论】:

    • 你也可以试试“-flags +bitexact”
    • 实际上,只是-bitexact 在我的ffmpeg 版本中不起作用。我不得不使用 Srounsroun 提到的标志。
    • -bitexact 对我来说还不够。我在另一篇帖子stackoverflow.com/questions/51839572 上写了一个答案,我提到如果你想完全摆脱LIST 块,还必须使用-map_metadata -1 选项。
    【解决方案2】:

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

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

    截至 2013 年,ffmpeg 写入的标头是“80 字节或 46,如果您设法抑制 LIST-INFO 块。”

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

    > 我必须使用ffmpeg -i ... -f s16le tmp.dat 然后mplayer -demuxer rawaudio -rawaudio rate=44100:channels=2:samplesize=2 -ao pcm tmp.dat 才能得到“正常”的wav 文件,很多程序无法读取ffmpeg 的wav 文件,他们读取44 字节的header,而其他数据用作声音,有时会导致损坏的字节顺序,或者他们说该文件已损坏并且根本无法读取文件。所以我想直接从 ffmpeg 获得“正确”的 wav。对不起我的英语不好:)

    如果 -bitexact 不适用,此处列出的方法可能会起作用。例如,将 wav 转换为 wav 以修复标题时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      相关资源
      最近更新 更多