简体   繁体   English

如何从内存中播放WAV数据?

[英]How to play WAV data right from memory?

I'm currently working on a sound experiment, and I've come across one issue. 我正在进行一项声音实验,我遇到过一个问题。 I save an array of wave data to a .wav file and play it, but is there a way to skip this step and simply play the sound right from memory? 我将一组波形数据保存到.wav文件并播放它,但有没有办法跳过这一步,只是从内存中播放声音? I'm looking for a solution that will work cross-platform. 我正在寻找一种跨平台工作的解决方案。

I suppose you are using the wave library , right? 我想你正在使用波形库 ,对吧?

The docs say: 文档说:

wave.open(file[, mode]) wave.open(file [,mode])

If file is a string, open the file by that name, otherwise treat it as a seekable file-like object. 如果file是字符串,请按该名称打开文件,否则将其视为可搜索文件类对象。

This means that you should be able to do something along the lines of: 这意味着您应该能够做到以下几点:

>>> import wave
>>> from StringIO import StringIO
>>> file_on_disk = open('myfile.wav', 'rb')
>>> file_in_memory = StringIO(file_on_disk.read())
>>> file_on_disk.seek(0)
>>> file_in_memory.seek(0)
>>> file_on_disk.read() == file_in_memory.read()
True
>>> wave.open(file_in_memory, 'rb')
<wave.Wave_read instance at 0x1d6ab00>

EDIT (see comments): Just in case your issue is not only about reading a file from memory but playing it from python altogether... 编辑(参见评论):以防你的问题不只是从内存中读取文件而是从python中完全播放...

An option is tu use pymedia 一个选项是使用pymedia

import time, wave, pymedia.audio.sound as sound
f= wave.open( 'YOUR FILE NAME', 'rb' ) # ← you can use StrinIO here!
sampleRate= f.getframerate()
channels= f.getnchannels()
format= sound.AFMT_S16_LE
snd= sound.Output( sampleRate, channels, format )
s= f.readframes( 300000 )
snd.play( s )
while snd.isPlaying(): time.sleep( 0.05 )

[source: the pymedia tutorial (for brevity I omitted their explanatory comments] [来源: pymedia教程 (为简洁起见,我省略了他们的解释性说明)

Creating a wav file with generated sine wave samples in memory and playing it on Windows: 在内存中创建包含生成的正弦波样本并在Windows上播放的wav文件:

import math
import struct
import wave
import winsound
import cStringIO as StringIO

num_channels = 2
num_bytes_per_sample = 2
sample_rate_hz = 44100
sound_length_sec = 2.0
sound_freq_hz = 500

memory_file = StringIO.StringIO()
wave_file = wave.open(memory_file, 'w')
wave_file.setparams((num_channels, num_bytes_per_sample, sample_rate_hz, 0, 'NONE', 'not compressed'))

num_samples_per_channel = int(sample_rate_hz * sound_length_sec)

freq_pos = 0.0
freq_step = 2 * math.pi * sound_freq_hz / sample_rate_hz

sample_list = []
for i in range(num_samples_per_channel):
  sample = math.sin(freq_pos) * 32767
  sample_packed = struct.pack('h', sample)
  for j in range(num_channels):
    sample_list.append(sample_packed)
  freq_pos += freq_step

sample_str = ''.join(sample_list)
wave_file.writeframes(sample_str)

wave_file.close()

winsound.PlaySound(memory_file.getvalue(), winsound.SND_MEMORY)

memory_file.close()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM