ffmpeg生成的.wav使用scipy.io.wav文件仅读取零

ffmpeg生成的.wav使用scipy.io.wav文件仅读取零,ffmpeg,scipy,wav,Ffmpeg,Scipy,Wav,大家好,谢谢阅读 我想使用Python的scipy.io.wavfile对一首歌曲进行一些分析。因为我只有.mp3格式的歌曲,所以我使用ffmpeg以下方式将文件转换为.wav: ffmpeg -i test.mp3 test.wav .wav文件与vlc player配合使用非常好,但读取时,wavfile仅显示零: from scipy.io import wavfile as wf data = wf.read("test.wav") C:\Program Files\Anaconda

大家好,谢谢阅读

我想使用Python的scipy.io.wavfile对一首歌曲进行一些分析。因为我只有.mp3格式的歌曲,所以我使用ffmpeg以下方式将文件转换为.wav:

ffmpeg -i test.mp3 test.wav
.wav文件与vlc player配合使用非常好,但读取时,wavfile仅显示零:

from scipy.io import wavfile as wf

data = wf.read("test.wav")
C:\Program Files\Anaconda\lib\site-packages\scipy\io\wavfile.py:42: WavFileWarning: Unknown wave file format
  warnings.warn("Unknown wave file format", WavFileWarning)

data
(44100, array([[0, 0],
        [0, 0],
        [0, 0],
        ..., 
        [0, 0],
        [0, 0],
        [0, 0]], dtype=int16))
我以前尝试过使用Python内置的wave模块获取数据,但效果相同(仅为零)。 我使用的是64位版本的ffmpeg(ffmpeg-20140218-git-61d5970-win64-static)

感谢您的帮助:-)

编辑:包含.wav头并尝试强制ffmpeg输出格式 我猜.wav文件的头信息包含在这里:

ffmpeg -i .\test.wav
Guessed Channel Layout for  Input Stream #0.0 : stereo
Input #0, wav, from '.\test.wav':
  Metadata:
    artist          : Joe Cocker
    copyright       : (C) 1987 Capitol Records, Inc.
    date            : 1987
    genre           : Pop
    title           : Unchain My Heart
    album           : Unchain My Heart
    track           : 1/10
    encoder         : Lavf55.33.100
  Duration: 00:05:04.33, bitrate: 1411 kb/s
  Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s
如果我尝试为.mp3转换明确指定ffmpeg输出格式:

ffmpeg -i .\test.mp3 -f s16le -ar 44100 -ac 2 test.wav
Input #0, mp3, from '.\test.mp3':
  Metadata:
    title           : Unchain My Heart
    artist          : Joe Cocker
    album           : Unchain My Heart
    genre           : Pop
    composer        : Bobby Sharp
    track           : 1/10
    disc            : 1/1
    album_artist    : Joe Cocker
    copyright       : (C) 1987 Capitol Records, Inc.
    date            : 1987
  Duration: 00:05:04.35, start: 0.025056, bitrate: 240 kb/s
    Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 235 kb/s
    Stream #0:1: Video: mjpeg, yuvj420p(pc), 600x600 [SAR 1:1 DAR 1:1], 90k tbr, 90k tbn, 90k tbc
    Metadata:
      title           :
      comment         : Cover (front)
Output #0, s16le, to 'test.wav':
  Metadata:
    title           : Unchain My Heart
    artist          : Joe Cocker
    album           : Unchain My Heart
    genre           : Pop
    composer        : Bobby Sharp
    track           : 1/10
    disc            : 1/1
    album_artist    : Joe Cocker
    copyright       : (C) 1987 Capitol Records, Inc.
    date            : 1987
    encoder         : Lavf55.33.100
    Stream #0:0: Audio: pcm_s16le, 44100 Hz, stereo, s16, 1411 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (mp3 -> pcm_s16le)
Press [q] to stop, [?] for help
video:0kB audio:52425kB subtitle:0 data:0 global headers:0kB muxing overhead 0.000000%
size=   52425kB time=00:05:04.32 bitrate=1411.2kbits/s
但在这种情况下(强制格式),ffmpeg和wavfile都无法读取文件:

ffmpeg -i .\test.wav
.\test.wav: Invalid data found when processing input

data=wf.read(“test2.wav”)
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
---->1数据=wf.read(“test2.wav”)
C:\Program Files\Anaconda\lib\site packages\scipy\io\wavfile.pyc处于读取状态(文件名,mmap)
152
153尝试:
-->154 fsize=_read_riff_chunk(fid)
155 noc=1
156位=8
C:\Program Files\Anaconda\lib\site packages\scipy\io\wavfile.pyc in\u read\u riff\u chunk(fid)
98 _big_endian=正确
99 elif str1!=b‘RIFF’:
-->100 raise VALUERROR(“不是WAV文件”)
101如果_big_endian:
102 fmt='>I'
ValueError:不是WAV文件。

我遇到了同样的问题。这似乎是2011年10月引入并于2014年4月29日修复的FFmpeg中的一个缺陷(5e7d21c7ad02e37caa1bcb50ab8ad64e7d7fb86c)。高于2.3(2014年7月16日)的FFmpeg版本应写入numpy可以无误读取的WAV。

如果没有文件或有关文件的某些信息(例如文件头),很难说“未知WAV文件格式”警告来自何处。请尝试明确指定输出PCM格式,例如
-f s16le-ar 44100-ac 2
(有符号16位整数PCM格式立体声,44.1khz)。使用ffmpeg
-formats
参数,您可以查看支持的格式列表。@9dan Hi!我尝试为.mp3转换指定格式,但ffmpeg、scipy或vlc都无法读取相应的输出.wav。不过,输出文件的大小与默认转换相同。@sebix Hi!我包含了我认为是inf的内容.wav文件头上的格式。很抱歉问一个愚蠢的问题,但您确定数组都是零吗?第一次执行
data=wf.read(“test.wav”)
,您是否检查过,比如说,
data[1].max()
data[1].min()
?(我之所以问这个问题,是因为我刚刚在mp3上尝试过,而且我还看到了
数组([[0,0],[0,0],[0,0],…,[0,0]])
,但这是因为文件的开头和结尾实际上是零;非零值直到索引1500左右才开始。)我使用的是ffmpeg 2.5,问题仍然存在。(使用Ubuntu。在Windows上使用ffmpeg时,一切都很好。)
data = wf.read("test2.wav")
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-10-fbbd84cb966b> in <module>()
----> 1 data = wf.read("test2.wav")

C:\Program Files\Anaconda\lib\site-packages\scipy\io\wavfile.pyc in read(filename, mmap)
    152 
    153     try:
--> 154         fsize = _read_riff_chunk(fid)
    155         noc = 1
    156         bits = 8

C:\Program Files\Anaconda\lib\site-packages\scipy\io\wavfile.pyc in _read_riff_chunk(fid)
     98         _big_endian = True
     99     elif str1 != b'RIFF':
--> 100         raise ValueError("Not a WAV file.")
    101     if _big_endian:
    102         fmt = '>I'

ValueError: Not a WAV file.