0

これは、stackoverflow への私の最初の投稿です。現在、ios 用の voip アプリを開発しています。私はこのようなことをしたいです。

//in  a thread
while(callIsOnGoing){
  data = getDataFromNetwork()
  playData()
  sleep(10ms)
}

しかし問題は、ios のオーディオが「プル」モデルで動作することです (コールバックを使用してデータを取得します)。しかし、再生するにはデータをプッシュする必要があります。AudioQueue を試してみましたが、AudioQueue では、コールバックが呼び出されても、コールバックの外側のバッファにプッシュしたデータが再生されません。

繰り返しますが、遅延オーディオユニットの場合に AudioUnitRender を同期的に呼び出したアップル ( http://developer.apple.com/library/ios/#samplecode/AVCaptureToAudioUnit/Introduction/Intro.html ) による AVCaptureToAudioUnit の例を見てきました。RemoteI/O Audio ユニットについても同様のことを試みました。しかし、OSStatus -50 を返すたびに。コードを以下に示します

    //in a separate thread

    do {                                               // 5
      int data_length = [NativeLibraryHelper GetData:(playBuff)];
      if(data_length == 0){

      }else{
        double numberOfFrameCount = data_length / player->audioStreamDesc->mBytesPerFrame;
        currentSampleTime += numberOfFrameCount;

        //AudioUnitRenderActionFlags flags = 0;

        AudioTimeStamp timeStamp;
        memset(&timeStamp, 0, sizeof(AudioTimeStamp));
        timeStamp.mSampleTime = currentSampleTime;
        timeStamp.mFlags |= kAudioTimeStampSampleTimeValid;

        AudioUnitRenderActionFlags flags = 0;
        AudioBuffer buffer;
        buffer.mNumberChannels = player->audioStreamDesc->mChannelsPerFrame;
        buffer.mDataByteSize = data_length;
        buffer.mData = malloc(data_length);
        memcpy(buffer.mData, playBuff, data_length);

        AudioBufferList audBuffList;
        audBuffList.mBuffers[0] = buffer;
        audBuffList.mNumberBuffers = 1;

        printf("Audio REnder call back funciotn called with data size %d\n", data_length);

        status = AudioUnitRender(audioUnitInstance, &flags, &timeStamp, 0, numberOfFrameCount, &audBuffList);
        printf("osstatus %d\n", status);
    }//end if else
    CFRunLoopRunInMode (                           // 6
                        kCFRunLoopDefaultMode,                     // 7
                        0.25,                                      // 8
                        false                                      // 9
                        );
    //} while (aqData.mIsRunning);
    [NSThread sleepForTimeInterval:.05];
}while (player->isRunning == YES);

オーディオ再生部分で一ヶ月以上悩んでいます。助けてください。前もって感謝します。

4

1 に答える 1

1

一般的な解決策の 1 つは、非同期ネットワークの getdata/read 関数でデータを中間バッファーまたはキューにプッシュし、オーディオ コールバックをその中間バッファーから読み取る (または中間バッファー/キューが空の場合は無音を読み取る) ことです。

于 2013-07-05T06:55:15.237 に答える