gpt4 book ai didi

python - scipy.io.wavfile.read() 来自 FFmpeg 的标准输出

转载 作者:行者123 更新时间:2023-12-04 22:59:38 25 4
gpt4 key购买 nike

找了半天还是没找到解决办法使用scipy.io.wavfile.read()stdout 读取字节的 FFmpeg 3.3.6。

这是完美运行的示例代码。但是,它需要将转换后的文件保存到磁盘。

import subprocess
import scipy.io.wavfile as wavfile

command = 'ffmpeg -i in.mp3 out.wav'
subprocess.run(command)

with open('out.wav', 'rb') as wf:
rate, signal = wavfile.read(wf)

print(rate, signal)

这是我尝试从 stdout 获取 FFmpeg 输出并将其加载到 scipy wavfile 中的代码。

import io
import subprocess
import scipy.io.wavfile as wavfile

command = 'ffmpeg -i in.mp3 -f wav -'
proc = subprocess.run(command, stdout=subprocess.PIPE)

rate, signal = wavfile.read(io.BytesIO(proc.stdout))

print(rate, signal)

可悲的是,它引发了 ValueError .

Traceback (most recent call last):
File ".\err.py", line 8, in <module>
rate, signal = wavfile.read(io.BytesIO(proc.stdout))
File "C:\Users\Sean Wu\AppData\Local\Programs\Python\Python36\lib\site-
packages\scipy\io\wavfile.py", line 246, in read
raise ValueError("Unexpected end of file.")
ValueError: Unexpected end of file.

有什么方法可以解决这个问题吗?

最佳答案

显然当 ffmpeg 的输出发送到stdout,程序不填写文件头的RIFF block 大小。相反, block 大小应该是的四个字节都是 0xFF。 scipy.io.wavfile.read()期望该值是正确的,因此它认为 block 的长度是 0xFFFFFFFF 字节。

当你给 ffmpeg要写入的输出文件,它会正确填写 RIFF block 大小,所以 wavfile.read()在这种情况下能够读取文件。

代码的解决方法是在数据传递到 wavfile.read() 之前手动修补 RIFF block 大小。通过 io.BytesIO()目的。这是执行此操作的脚本的修改。注意:我必须使用 command.split() subprocess.run() 的第一个参数.我在 Mac OS X 上使用 Python 3.5.2。另外,我的测试文件名为“mpthreetest.mp3”。

import io
import subprocess
import scipy.io.wavfile as wavfile

command = 'ffmpeg -i mpthreetest.mp3 -f wav -'
proc = subprocess.run(command.split(), stdout=subprocess.PIPE)

riff_chunk_size = len(proc.stdout) - 8
# Break up the chunk size into four bytes, held in b.
q = riff_chunk_size
b = []
for i in range(4):
q, r = divmod(q, 256)
b.append(r)

# Replace bytes 4:8 in proc.stdout with the actual size of the RIFF chunk.
riff = proc.stdout[:4] + bytes(b) + proc.stdout[8:]

rate, signal = wavfile.read(io.BytesIO(riff))

print("rate:", rate)
print("len(signal):", len(signal))
print("signal min and max:", signal.min(), signal.max())

关于python - scipy.io.wavfile.read() 来自 FFmpeg 的标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49013020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com