2013-07-20 4 views
1

스레드가 병렬이 아닌 오디오를 연속적으로 재생하는 문제를 해결 하는지를보기 위해 스레드가 아닌 다중 처리로 2 개의 사운드를 동시에 재생해야합니다. 파이썬의 GIL (Global Interpreter Lock) 때문인 것으로 추측됩니다.파이썬에서 멀티 프로세싱과 동시에 2 개의 사운드를 재생하십시오.

2 일 전 a question를 추가했지만 내 설명이 복잡합니다. 다음은 간단한 버전입니다.

오디오가 들쭉날쭉 한 배열로 가져옵니다. 나는이 배열을하고 scikits.audiolab 모듈을 사용하여 재생 : 괜찮아요

import scikits.audiolab as audiolab 

# This is how I import my wav file. "frames" is the numpy array, "fs" = sampling 
# frequency, "encoder" = quantizing at 16 bits 

frames, fs, encoder = audiolab.wavread('audio.wav') 

# This is how I play my wav file. audiolab plays the frames array at a frequency of 
# 44100 Hz 
audiolab.play(frames, fs=44100) 

을, 그러나 이것은 내가에 도움이 필요한 것입니다 : 멀티 프로세싱을 사용하여 동시에 2 개 파일을 재생합니다.

frames1, fs1, encoder1 = audiolab.wavread('audio1.wav') 
frames2, fs2, encoder2 = audiolab.wavread('audio2.wav') 

audiolab.play(frames1, fs=44100) 
audiolab.play(frames2, fs=44100) 

답변

3

여러 프로세스를 사용하여 두 사운드의 상대적 타이밍을 제어하려는 경우 (예 : 동시에 시작해야 함) 좋은 솔루션이 아닐 수 있습니다. 응용 프로그램 내에서 신호를 믹싱하고 단일 오디오 스트림을 작성해야합니다.

audiolab을 사용하고 있으므로 이미 numpy 배열에 데이터가 있습니다.

frames1, fs1, encoder1 = audiolab.wavread('audio1.wav') 
frames2, fs2, encoder2 = audiolab.wavread('audio2.wav') 
mixed = frames1 + frames2 

audiolab.play(mixed, fs=44100) 

이 (당신이 클릭/팝을들을) 클립에 오디오 신호를 발생하면, 당신은 혼합하기 전에 데이터 규모를 사전에해야 할 수도 있습니다 :

이 당신이 오디오를 혼합하는 데 필요한 모든 유연성을 제공

mixed = frames1/2 + frames2/2 
...와 소리가 동일한 길이를 가지고 있지 않다면, 그것은 조금 더 많은 작업이 걸릴 수 있습니다 :

mixed = np.zeros(max(len(frames1), len(frames2)), dtype=frames1.dtype) 
mixed[:len(frames1)] += frames1/2 
mixed[:len(frames2)] += frames2/2 
+0

알다시피, @ 루케, 나는 아주 비슷한 접근법을 시도했지만 단지 협력하고 싶지 않았지만 당신의 해결책은 그 일을 해냈습니다. 고맙습니다. –

3

이 접근 할 수있는 더 좋은 방법이 이미 오디오 스트림을 혼합하는 방법을 알고있는 라이브러리를 사용하는 것입니다 - 오디오 하드웨어를 공유하려고 두 개의 서로 다른 프로세스 것은 기껏해야이 문제를 해결하기 위해 남았습니다 방법입니다.

Pygame 또는 PyAudio (파이썬 바인딩은 PortAudio)을 찾으십시오.

+0

재미있는합니다. 나는 그것을 확인하고 당신에게 업데이트를 줄 것이다. –

+0

파이 게임이나 파이 오디오가 효과가 있었으면 좋겠지 만 루크의 대답은 내가 찾고있는 것이었다. –

+0

pyaudio를 사용하여 한 번에 두 개의 스트림을 어떻게 출력합니까? – endolith