2016-11-22 16 views
2

私はサーバーからストリーミングPCMデータを再生するアプリを開発しようとしています。iOSでサーバからストリーミングPCMデータを再生する方法は?

私はAudioQueueを使用しましたが、うまくいきません。

PCM(サーバからの)データ形式:

Sample rate = 48000, num of channel = 2, Bit per sample = 16 

そして、サーバはクライアントに固定されたバイトをストリーミングしていません。

(ストリーミング変数バイト例:30848、128、2764、...バイト)

私のソースコード:ここで

、私は&をsettedたものASBD構造は、オーディオキューオブジェクト を作成します(言語:スウィフト)

// Create ASBD structure & set properties. 
var streamFormat = AudioStreamBasicDescription() 

streamFormat.mSampleRate = 48000 
streamFormat.mFormatID = kAudioFormatLinearPCM 
streamFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked 
streamFormat.mFramesPerPacket = 1 
streamFormat.mChannelsPerFrame = 2 
streamFormat.mBitsPerChannel = 16 

streamFormat.mBytesPerFrame = (streamFormat.mBitsPerChannel/8) * streamFormat.mChannelsPerFrame 
streamFormat.mBytesPerPacket = streamFormat.mBytesPerFrame 
streamFormat.mReserved = 0 

// Create AudioQueue for playing PCM streaming data. 
var err = AudioQueueNewOutput(&streamFormat, self.queueCallbackProc, nil, nil, nil, 0, &aq) 

... 

私は、上記のようなAudioQueueオブジェクトを作成し& ASBD構造をsettedています。

AudioQueueプレイは、数秒間、非常によく

をPCMデータをストリーミングが、すぐに再生しているサウンドはオンとオフです。私に何ができる?

(まだストリーミング、およびAudioQueueキューイング)

私に任意のアイデアを教えてください。

+0

帯域幅の小さいフォーマットは機能しますか? –

+0

Pardon?あなたの言うことはよく分かりません。 – user6081283

+0

mp3のようなよりコンパクトなフォーマットを試してみるとうまくいくのですか? –

答えて

5

あなたは(少なくとも)2つのことを行う必要があります。

あなたは、待ち時間、ジッタ、サーバーからのデータの間で異なるパケットサイズ、およびデータ、オーディオキューコールバック要求を処理するためにデータをバッファリングする必要が

。典型的な解決策は、悪いケースのネットワークジッタ(この数値を統計的に解析する必要があります)を処理するのに十分な量のデータで事前に充填された循環FIFOを使用することです。オーディオキューコールバックは、要求された量のデータを循環FIFOからコピーすることができます。ネットワークコードは、それを埋めるように試みます。

2つのレートが十分に同一でない場合は、エラーを隠すために何らかの方法が必要な場合もあります。ネットワークレートが低すぎるときに余分なサウンドを複製または合成する何らかの方法と、ネットワークレートが高すぎるときにサンプルを除外する何らかの方法、可能な限り聞き取れないようにしようとする方法と、ネットワークドロップアウト。

+0

2番目の部分は、リアルタイムストリームの場合にのみ適用されます。それ以外の場合、クライアントはサーバーからデータを読み取る速度を制御し、再生速度に適応させることができます。 – Codo

+0

非リアルタイムストリームであっても、一時的なネットワークのドロップアウト(輻輳、失われたパケットの数が多すぎるなど)を受ける可能性があります。 – hotpaw2

+0

私は部分的に同意します。あなたがバッファリングを持っていれば(とにかくそれが必要です)、長い一時的なネットワークドロップアウトだけが残されます。重複または合成音でそれらを埋めることはできません。しかし、私は大きな音を何とか避ける必要があることに同意します。 – Codo

関連する問題