ffmpeg生成的.wav使用scipy.io.wav文件仅读取零
大家好,谢谢阅读 我想使用Python的scipy.io.wavfile对一首歌曲进行一些分析。因为我只有.mp3格式的歌曲,所以我使用ffmpeg以下方式将文件转换为.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
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.