2017-12-01 24 views
0

私はwavファイルを再生するかなり基本的なpyaudioコードを持っています。PyAudioとDecibelの変更とパン

open_wave = wave.open("tone_silence/l0r1d0_500.wavc",'rb') 

    pyAudio_session = pyaudio.PyAudio() 

    def callback(in_data, frame_count, time_info, status): 
     data = open_wave.readframes(frame_count) 
     return (data, pyaudio.paContinue) 
    pyAudio_stream = pyAudio_session.open(
     format = pyAudio_session.get_format_from_width(open_wave.getsampwidth()), 
     channels = open_wave.getnchannels(), 
     rate = open_wave.getframerate(), 
     output = True, 
     stream_callback=callback) 

    while pyAudio_stream.is_active(): 
     time.sleep(0.1) 

    pyAudio_stream.stop_stream() 
    pyAudio_stream.close() 
    print("Stopped") 
    pyAudio_session.terminate() 

私が通り、私は、ストリームのデシベルレベルを変更し、特定のチャンネル(左スピーカーのみ/右スピーカーのみ)にステレオ出力をパンできるような方法を見つけるためにインターネットの隅々を検索しました必要。しかし、私は方法を見つけることができませんでした。

いつでもストリームを閉じることができないので、私はpydub(実際にはこの機能を備えています)に移行することはできません。完全なオーディオを再生し、突然クローズすることはできません。

答えて

0

pydubは、this documentationによれば、キーボードの割り込みを容易にするために、オーディオを半分のチャンクに分割します。したがって

我々はtry-exceptブロック内while loopを通じてオーディオを取ると、実行した場合、我々は使用してプレイを破ることができるはずの「Ctrl + C」ここ

が左にオーディオまたは右にパンワーキングサンプルコードですその後、 hereからドキュメントごとなどのチャネルとは時に再生を停止するためのロジックの上使用しています「のCtrl + C」

from pydub import AudioSegment 
from pydub.playback import play 

song = AudioSegment.from_wav("music.wav") 

# pan the sound 15% to the right 
panned_right = song.pan(+0.15) 

# pan the sound 50% to the left 
panned_left = song.pan(-0.50) 

#Play panned left audio 
while True: 
    try: 
     play(panned_left) 
    except KeyboardInterrupt: 
     print "Stopping playing" 
     break 

我々は遊びループから破壊時にバックIDLEセッションプロンプトを取得します。あなたのニーズに合わせて調整することができます。

Output: 
Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32 
Type "copyright", "credits" or "license()" for more information. 
>>> ================================ RESTART ================================ 
>>> 
Stopping playing 
>>> 

これは、あなたがpydub内のメソッドをパンを内蔵しており、また、プレイバックミッドストリームを中断するハック使いやす与えます。これがあなたの問題を助けてくれることを願っています。

EDIT-1ループが無限に再生されますしながら、という問題に遭遇するかもしれ溶液上の
(あなたがそれを壊さない場合。)。それはテストのためだけに良いかもしれません。

もう1つの方法は、pythonmultiprocessモジュールを使用して、オーディオセグメントを再生するプロセスを生成し、必要でないときにterminateを使用することです。これにより、再生時のコントロールが向上します。

ここは例です。あなたが停止するオーディオ必要がある場合

from multiprocessing import Process 

def play_audio(seg): 
    play(seg) 

if __name__ == '__main__': 
    p = Process(target=play_audio, args=(panned_left,)) 
    p.start() 

、単にIDEまたはプログラムのいずれかでp.terminate()を呼び出します。

Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32 
Type "copyright", "credits" or "license()" for more information. 
>>> ================================ RESTART ================================ 
>>> 
>>> p.terminate() 
>>> 
関連する問題