将PyAudio麦克风输入流转换为mp3

如何解决将PyAudio麦克风输入流转换为mp3

我正在寻找直接从麦克风编码mp3文件而不保存到中间wav文件方法。有大量用于保存到wav文件的示例,以及大量用于将wav文件转换为mp3的示例。但是我没有运气找到直接从麦克风保存mp3的方法。例如,我使用下面在网上找到的示例来记录到wav文件中。

我希望获得有关如何将frames列表(pyaudio流读取)直接转换为mp3的建议。或者,通过ffmpeg将pyaudio麦克风输入直接流式传输到mp3,而无需使用读取数据填充列表/数组。非常感谢!

import pyaudio
import wave

# the file name output you want to record into
filename = "recorded.wav"
# set the chunk size of 1024 samples
chunk = 1024
# sample format
FORMAT = pyaudio.paInt16
# mono,change to 2 if you want stereo
channels = 1
# 44100 samples per second
sample_rate = 44100
record_seconds = 5
# initialize PyAudio object
p = pyaudio.PyAudio()
# open stream object as input & output
stream = p.open(format=FORMAT,channels=channels,rate=sample_rate,input=True,output=True,frames_per_buffer=chunk)
frames = []
print("Recording...")
for i in range(int(44100 / chunk * record_seconds)):
    data = stream.read(chunk)
    frames.append(data)
print("Finished recording.")
# stop and close stream
stream.stop_stream()
stream.close()
# terminate pyaudio object
p.terminate()
# save audio file
# open the file in 'write bytes' mode
wf = wave.open(filename,"wb")
# set the channels
wf.setnchannels(channels)
# set the sample format
wf.setsampwidth(p.get_sample_size(FORMAT))
# set the sample rate
wf.setframerate(sample_rate)
# write the frames as bytes
wf.writeframes(b"".join(frames))
# close the file
wf.close()

解决方法

我能够找到一种方法,可以使用稀有软件的lame 3.1二进制文件将pyaudio pcm流转换为mp3,而无需保存到中间的wav文件。我敢肯定也可以使用ffmpeg来完成,但由于ffmpeg使用la脚编码为mp3,所以我想我只会关注la脚。

要直接将原始pcm数组转换为mp3,请删除所有wave文件操作,并替换为以下内容。这样一来,数据就一气呵成。

raw_pcm = b''.join(frames)
l = subprocess.Popen("lame - -r -m m recorded.mp3",stdin=subprocess.PIPE)
l.communicate(input=raw_pcm)

为了将pcm数据读入la脚中,我使用了以下内容。如果您愿意,我相信您可以在流回调中做到这一点。

l = subprocess.Popen("lame - -r -m m recorded.mp3",stdin=subprocess.PIPE)
for i in range(int(44100 / chunk * record_seconds)):
    l.stdin.write(stream.read(chunk))

我应该注意,无论哪种方式,la脚直到数据完成管道传输后才开始编码。当管道传输读取的每个流中的数据时,我认为编码会立即开始,但是事实并非如此。

此外,如果stdout和stderr缓冲读取的内容,则使用.stdin.write可能会引起一些麻烦。我需要进一步研究。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?