无法打开文件 file.wav,原因:文件没有以 RIFF ID 开头

15 投票
4 回答
49664 浏览
提问于 2025-04-19 21:15

我在用Python打开一个RIFF文件时遇到了这个错误(我理解它是WAV文件的一种)。

打开文件file.wav时失败,原因是:文件开头没有RIFF标识。

当我用各种工具检查这个文件时,我觉得它确实是一个WAV / RIFF文件。

$ file file.wav 
file.wav: MBWF/RF64 audio, stereo 96000 Hz


$ file -i file.wav 
file.wav: audio/x-wav; charset=binary




$ mediainfo file.wav 
General
Complete name                            : file.wav
Format                                   : Wave
Format profile                           : RF64
File size                                : 4.10 GiB
Duration                                 : 2h 7mn
Overall bit rate mode                    : Constant
Overall bit rate                         : 4 608 Kbps

Audio
Format                                   : PCM
Format settings, Endianness              : Little
Format settings, Sign                    : Signed
Codec ID                                 : 1
Duration                                 : 2h 7mn
Bit rate mode                            : Constant
Bit rate                                 : 4 608 Kbps
Channel(s)                               : 2 channels
Sampling rate                            : 96.0 KHz
Bit depth                                : 24 bits
Stream size                              : 4.10 GiB (100%)

4 个回答

1

我有一个解决办法,

我把文件的后缀名改成 mp3,然后再把它转换成 wav 格式,这样我就可以读取这个文件了。

subprocess.call(['ffmpeg', '-i', 'XXX.mp3', 'XXX.wav'])
3

这段话的意思是,跟@kakrafoon的回答类似,不过这里使用了soundfile这个库来进行读写操作。这样做的好处是可以减少需要用到的外部库,简化你的代码依赖。

import soundfile
import wave

file_path = "your_file.wav"

# Read and rewrite the file with soundfile
data, samplerate = soundfile.read(file_path)
soundfile.write(file_path, data, samplerate)

# Now try to open the file with wave
with wave.open(file_path) as file:
    print('File opened!')
6

如果你的音频文件没问题,并且你能用librosa或scipy.io读取这个文件,我们可以简单地先读取这个文件,然后把它写回一个临时的wav文件,最后再用wave包来读取它。

举个例子。下面,我们遇到了RIFF id错误。

>>> import wave
>>> wave.open('./SA1.WAV')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/pytorch/anaconda3/lib/python3.6/wave.py", line 499, in open
    return Wave_read(f)
  File "/home/pytorch/anaconda3/lib/python3.6/wave.py", line 163, in __init__
    self.initfp(f)
  File "/home/pytorch/anaconda3/lib/python3.6/wave.py", line 130, in initfp
    raise Error('file does not start with RIFF id')
wave.Error: file does not start with RIFF id

我们用librosa把数据读进numpy,然后用soundfile把它写回去。

import librosa
import soundfile as sf
>>> x,_ = librosa.load('./SA1.WAV', sr=16000)
>>> sf.write('tmp.wav', x, 16000)
>>> wave.open('tmp.wav','r')
<wave.Wave_read object at 0x7fbcb4c8cf28>
6

你现在看到的是一种叫做64位RIFF的文件格式。简单来说,wave格式不支持这种64位RIFF文件。

撰写回答