PyDub 从变量播放音频

Posted

技术标签:

【中文标题】PyDub 从变量播放音频【英文标题】:PyDub play audio from variable 【发布时间】:2018-12-13 11:39:04 【问题描述】:

我有一个函数可以将 WAV 音频帧生成到列表中。有什么方法可以播放该列表中的音频,而无需使用中间文件生成Audiosegment 对象?

编辑:作为参考,this 是我的代码。

【问题讨论】:

【参考方案1】:

我设法通过使用BytesIO 对象解决了这个问题。由于我的库使用wave.open,我可以只输入一个类似 IO 的对象来保存和读取。我不确定这是最pythonic的答案,但这就是我使用的。

【讨论】:

这就是 IO 对象的用途,所以 unleass pydub 已经提供了一个文档化的方法来解决您的问题,这可能确实是 pythonic 解决方案。【参考方案2】:

我建议像这样直接实例化AudioSegment() 对象:

from pydub import AudioSegment

sound = AudioSegment(
    # raw audio data (bytes)
    data=b'…',

    # 2 byte (16 bit) samples
    sample_width=2,

    # 44.1 kHz frame rate
    frame_rate=44100,

    # stereo
    channels=2
)

附录:我看到您在链接代码 sn-p 中生成声音。你可能对pydub's audio generators感兴趣

from pydub.generators import Sine
from pydub import AudioSegment

sine_generator = Sine(300)

# 0.1 sec silence
silence = AudioSegment.silent(duration=100)
dot = sine_generator.to_audio_segment(duration=150)
dash = sine_generator.to_audio_segment(duration=300)

signal = [dot, dot, dot, dash, dash, dash, dot, dot, dot]

output = AudioSegment.empty()
for piece in signal:
    output += piece + silence

最后一点:像这样迭代地扩展 AudioSegment 会变慢。你可能想做类似this Mixer example

【讨论】:

感谢有关使用自己的数据实例化 AudioSegment 的建议,不知道我能做到这一点。关于在我的库中使用 PyDub 生成器的问题,我想我宁愿不这样做。我想让它尽可能独立,同时理解声音背后的数学原理。

以上是关于PyDub 从变量播放音频的主要内容,如果未能解决你的问题,请参考以下文章

在 pydub 中播放音频

python Pydub - 以阻塞和非阻塞格式播放音频

pydub,ffmpeg mp4转mp3音频提取

将变量从 PHP/MySQL 传递给 actionscript 以播放音频文件

从 Plist 播放音频文件

求python将两个MP3音频文件拼接成一个MP3文件的代码