我使用的是带有WASAPI支持的这些预编译的pyaudio二进制文件。我想通过WASAPI播放一个wav文件。我为这个api找到了默认输出设备的索引:
import pyaudio
p = pyaudio.PyAudio()
print p.get_host_api_info_by_index(3)
>>{'index': 3, 'name': u'Windows WASAPI', 'defaultOutputDevice': 11L, 'type': 13L, 'deviceCount': 3L, 'defaultInputDevice': 12L, 'structVersion': 1L}然后我通过这个设备播放一个wav文件:
import pyaudio
import wave
CHUNK = 1024
wf = wave.open('test.wav', 'rb')
# instantiate PyAudio (1)
p = pyaudio.PyAudio()
# open stream (2)
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output_device_index=11,
output=True)
# read data
data = wf.readframes(CHUNK)
# play stream (3)
while data != '':
stream.write(data)
data = wf.readframes(CHUNK)
# stop stream (4)
stream.stop_stream()
stream.close()
# close PyAudio (5)
p.terminate()当文件播放时,我仍然能够听到系统中的其他声音,但在专用WASAPI模式下,必须阻止所有其他声音。那么,如何使WASAPI排他性模式在吡喃?
发布于 2015-07-10 03:07:09
有必要改变吡喹酮的来源。我们需要修改_portaudiomodule.c。
包括pa_win_wasapi.h:
#include pa_win_wasapi.h更改这一行:
outputParameters->hostApiSpecificStreamInfo = NULL;在这方面:
struct PaWasapiStreamInfo wasapiInfo;
wasapiInfo.size = sizeof(PaWasapiStreamInfo);
wasapiInfo.hostApiType = paWASAPI;
wasapiInfo.version = 1;
wasapiInfo.flags = (paWinWasapiExclusive|paWinWasapiThreadPriority);
wasapiInfo.threadPriority = eThreadPriorityProAudio;
outputParameters->hostApiSpecificStreamInfo = (&wasapiInfo);现在我们需要编译py音频。
./configure --with-winapi=wasapi --enable-shared=nomakecd ..external_libraries += ['winmm']
extra_link_args += ['-lwinmm']
在setup.py中是这样的:
external_libraries += ["winmm","ole32","uuid"]
extra_link_args += ["-lwinmm","-lole32","-luuid"]python setup.py build --static-link -cmingw32python setup.py install --skip-build就这样。现在pyadio可以在WASAPI排他性模式下播放声音。
https://stackoverflow.com/questions/31306010
复制相似问题