2016-07-05 16 views
1

以下のコードはバッファアンダーランの原因となります。 synth_instance.playは、サイズ(frames_num * 2)の浮動小数点数(-1,1)でインターリーブされたステレオフレームのリストを返します。Python/PyAudio - バッファアンダーラン

stream.writeは、私が何らかの理由でそれを供給するすべてのフレームを書き込まないように私には思えます。

私は、コールバックモードでpyaudioを使用してみましたが、私は時間に十分なフレームとそれを提供する方法がわかりません。私のメインループは、オーディオチャンクのキューからオーディオを供給することに追いつくことができませんでした。オーディオコールバックは、すべてのオーディオチャンクを常に私が供給できるよりも速く動かしました。

#!/usr/bin/python3 

import pyaudio 
import time 
import struct 

from synth import synth 

from time import sleep 
from time import clock 

p = pyaudio.PyAudio() 

sample_rate = 44100 
frames_num = 2205 

synth_instance = synth(); 

stream = p.open(rate=sample_rate, 
      channels=2, 
      format=pyaudio.paFloat32, 
      frames_per_buffer=frames_num, 
      output=True) 

while (True): 

    audio = synth_instance.play_note(-12, sample_rate, frames_num) 

    data = struct.pack('f'*len(audio), *audio) 

    stream.write(data, frames_num) 

答えて

0

ここには、私はそれについてのグーグルの人々のための答えだと思うものを投稿します。もし私が間違っていて、もっと知り合っている人がこれを読んでいるなら、私はちょうどオーディオと低レベルのプログラミングをプログラムすることを学んでいるので、私を修正してください。

事はPythonがどんなリアルタイムのオーディオのもののためにあまりにも遅いことです。

あなたもあなたのコードを最適化する方法がわからない場合でも、Cはあまりにも遅くなることがあります。

例えばCでプログラミングしている場合は、メインループからオーディオスレッドにデータを移動するためにリングバッファを使用すると、メインループで浮動小数点演算が多すぎるとオーディオスレッドが吃音の原因となります。

だから、答えはより速く、あなたのメインループを作るか、またはあなたのオーディオスレッドが遅くすることです。

+0

[ここ]を見に取る、我々はすべてのpythonが遅いことを知っているが、我々のpythonを使用してリアルタイムにたくさんのことを行うことができます(https://www.youtube.com/watch?v=YT-zAX3S850 ) 'while'ループpythonが遅い' for'を試してください – ederwander

+0

本当の低レイテンシのアプリケーションを書くつもりなら、おそらくPythonを使ってはいけません。あるいは、Cで重要なコードを書いて拡張機能を使う必要があります。とにかく、どのようなレイテンシや、どのような操作/どのようにオーディオストリームで演奏しているのかは言及していないので、あなたがやろうとしていることがPythonで実現可能かどうかはほかの人が言うことはできません。 – toes