2011-07-07 7 views
8

午前中にこの問題に対して頭を叩きました。連続したデータストリーム(iOS)からオーディオを再生する

私は、オーディオデータを返すデータソースへの接続を設定しています(これは録音デバイスなので、データには長さが設定されていません。 )

私は自分のコードでデータのすべてのパケットを受け取ることができました。今私はそれを再生する必要があります。私は入ってくるデータを再生したいので、数分待たされることはしません。その正確な時点で受信しているデータを使用して再生したいと思います。

今、私は午前中にさまざまな例を探していますが、実際にレイアウトされた例はありません。 (NSURLConnection )接続didReceiveData:

  • (ボイド)接続で

    (NSDataの)データ{

機能、 "データ" パッケージは、音声パッケージです。私はAVPlayer、MFVideoPlayerでそれをストリーミングしようとしましたが、何も私のためにこれまで働いていませんでした。また、mattgallagherのAudiostreamerを見てみましたが、まだそれを達成できませんでした。

誰でもここで助けてもらえますが、いくつかの(できれば)作業例がありますか?

答えて

2

注意:以下の回答は、サーバーからPCMデータを受信した場合にのみ有効です。もちろんこれは決して起こりません。そのため、オーディオのレンダリングとデータの受信の間に、別のステップが必要です:データ変換。

フォーマットによっては、これは多かれ少なかれ難しいかもしれませんが、一般的にこのステップではAudio Converter Servicesを使用する必要があります。

-(void)connection:(NSURLConnection)connection didReceiveData:(NSData)dataは、サーバーからのデータをバッファに書き込む場合にのみ使用する必要があります。再生はこの方法とは関係ありません。

ここで、バッファに保存されたデータを再生するには、RemoteIOとオーディオユニットを使用する必要があります。 Here is a good, comprehensive tutorial。チュートリアルから「レコード」の部分を削除することができます。

あなたが見ることができるように、彼らは再生のためのコールバックを定義します。

callbackStruct.inputProc = playbackCallback; 
callbackStruct.inputProcRefCon = self; 
status = AudioUnitSetProperty(audioUnit, 
           kAudioUnitProperty_SetRenderCallback, 
           kAudioUnitScope_Global, 
           kOutputBus, 
           &callbackStruct, 
           sizeof(callbackStruct)); 

playbackCallback機能は、次のようになります。

static OSStatus playbackCallback(void *inRefCon, 
          AudioUnitRenderActionFlags *ioActionFlags, 
          const AudioTimeStamp *inTimeStamp, 
          UInt32 inBusNumber, 
          UInt32 inNumberFrames, 
          AudioBufferList *ioData) { 

    for (int i = 0 ; i < ioData->mNumberBuffers; i++){  
     AudioBuffer buffer = ioData->mBuffers[i]; 
     unsigned char *frameBuffer = buffer.mData; 
     for (int j = 0; j < inNumberFrames*2; j++){ 
      frameBuffer[j] = getNextPacket();//this here is a function you have to make to get the next chunk of bytes available in the stream buffer 
     } 
    } 

    return noErr; 
} 

は、基本的にはそれが何をするかとioDataバッファを埋めるためにあります次に再生する必要があるバイトの次のチャンク。新しいデータがない場合(ストリームバッファに十分なデータがない場合、プレイヤーは消音されています)、バッファーをゼロにしてください(沈黙させてください)。

また、alSourceQueueBuffersalSourceUnqueueBuffersを使用してOpenALで同じことを達成することができます。

これだけです。ハッピーコーディング!

+0

キャブあなたは、nsinputstreamに入ってくるバイトのような、来るバイトからausioを再生する方法を説明します。 – sajwan

+0

@valentin Radu私はこのメソッドと別のものからデータを取得しています。 ?事前におかげで親切に役立つ! –

関連する問題