2011-08-09 9 views
1

私は、ffmpeg、libmmsを使ってオーディオストリームを再生するアプリケーションを作ろうとしています。
適切なコーデックを使用して、mmsサーバを開き、ストリームを取得し、オーディオフレームを生フレームにデコードできます。
しかし、私は次のやり方を知らない。
AudioToolbox/AudioToolbox.hを使用してオーディオキューを作成する必要があると思います。
しかし、オーディオキューバッファのデコードバッファのメモリを与えて再生すると、ホワイトノイズだけが再生されます。
ここに私のコードです。Iphoneストリーミングと再生オーディオ問題

何が欠けていますか?
コメントとヒントは非常に高く評価されています。
ありがとうございました。

while(av_read_frame(pFormatCtx, &pkt)>=0) 
{ 
    int pkt_decoded_len = 0; 
    int frame_decoded_len; 
    int decode_buff_remain=AVCODEC_MAX_AUDIO_FRAME_SIZE * 5; 
    if(pkt.stream_index==audiostream) 
    { 
     frame_decoded_len=decode_buff_remain; 
     int16_t *decode_buff_ptr = decode_buffer; 
     int decoded_tot_len=0; 
     pkt_decoded_len = avcodec_decode_audio2(pCodecCtx, decode_buff_ptr, &frame_decoded_len, 
               pkt.data, pkt.size); 
     if (pkt_decoded_len <0) break; 
     AudioQueueAllocateBuffer(audioQueue, kBufferSize, &buffers[i]); 
     AQOutputCallback(self, audioQueue, buffers[i], pkt_decoded_len); 

     if(i == 1){ 
      AudioQueueSetParameter(audioQueue, kAudioQueueParam_Volume, 1.0); 
      AudioQueueStart(audioQueue, NULL); 
     } 
     i++; 
    } 
} 


void AQOutputCallback(void *inData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer, int copySize) 
{ 
    mmsDemoViewController *staticApp = (mmsDemoViewController *)inData; 
    [staticApp handleBufferCompleteForQueue:inAQ buffer:inBuffer size:copySize]; 
} 

- (void)handleBufferCompleteForQueue:(AudioQueueRef)inAQ 
          buffer:(AudioQueueBufferRef)inBuffer 
          size:(int)copySize 
{ 
    inBuffer->mAudioDataByteSize = inBuffer->mAudioDataBytesCapacity; 
    memcpy((char*)inBuffer->mAudioData, (const char*)decode_buffer, copySize); 

    AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL); 
} 

答えて

1

誤ってAQOutputCallbackを呼び出しました。あなたは必ずしもそのメソッドを呼び出す必要はありません。
このメソッドは、オーディオキューで使用されるオーディオバッファが自動的に呼び出されます。 AQOutputCallbackのプロトタイプが間違っていました。
あなたのコードによると、このメソッドは自動的に呼び出されません。
あなたはこの

void AudioQueueCallback(void* inUserData, AudioQueueRef inAQ, AudioQueueBufferRef 
         inBuffer); 

よう

typedef void (*AudioQueueOutputCallback) (
    void     *inUserData, 
    AudioQueueRef  inAQ, 
    AudioQueueBufferRef inBuffer 
); 

をオーバーライドすることができ、アプリが起動したら、あなたは、オーディオセッションを設定する必要があります。
重要な参照はhere.

です。ただし、デコードするオーディオの拡張機能は何ですか?
AudioStreamPacketDescriptionは、オーディオがパケットごとに可変フレームである場合に重要です。
それ以外の場合、1パケットあたり1フレーム、AudioStreamPacketDescriptionは重要ではありません。

次の作業は
オーディオセッションを設定するには、デコーダを使用して生のオーディオフレームを取得するには、フレームをオーディオバッファに入れます。
あなたの代わりに、システムを空のバッファを埋めるようにしてください。

+0

私は正しいプロトタイプを使用した後に解決策を得ました – KayKay

関連する問題