2

これを行う方法を教えてください。あるデバイスでオーディオを録音し、他のデバイスで再生する (VoIP) ?

私はここで立ち往生しています:この機能で1つのデバイスで入力音声データを取得しています

void AQRecorder::MyInputBufferHandler(  void *                              inUserData,
                                        AudioQueueRef                       inAQ,
                                        AudioQueueBufferRef                 inBuffer,
                                        const AudioTimeStamp *              inStartTime,
                                        UInt32                              inNumPackets,
                                        const AudioStreamPacketDescription* inPacketDesc)
{
    AQRecorder *aqr = (AQRecorder *)inUserData;
    try {
        if (inNumPackets > 0) {
            // write packets to file
            XThrowIfError(AudioFileWritePackets(aqr->mRecordFile, FALSE, inBuffer->mAudioDataByteSize,
                                             inPacketDesc, aqr->mRecordPacket, &inNumPackets, inBuffer->mAudioData),
                       "AudioFileWritePackets failed");
            //inData = inBuffer->mAudioData;
            aqr->mRecordPacket += inNumPackets;
            aqr->updateIndata(inBuffer);
        }

        // if we're not stopping, re-enqueue the buffe so that it gets filled again
        if (aqr->IsRunning())
            XThrowIfError(AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL), "AudioQueueEnqueueBuffer failed");
    } catch (CAXException e) {
        char buf[256];
        fprintf(stderr, "Error: %s (%s)\n", e.mOperation, e.FormatError(buf));
    }
}

パケットをUDPに送信しています:

void AQRecorder::updateIndata(AudioQueueBufferRef inBuffer)
{
    SpeakHereAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    NSData *audioBytes = [NSData dataWithBytes:inBuffer->mAudioData 
                                        length:inBuffer->mAudioDataByteSize];
    NSLog(@"bytes: %d", [audioBytes length]);
    [appDelegate.udpSocket sendData:audioBytes 
                             toHost:appDelegate.host
                               port:appDelegate.port
                        withTimeout:-1
                                tag:1];
}

& 相手側で NSData としてデータを受信して​​いますが、再生方法がわかりません。助けてください

4

1 に答える 1

0

受信したオーディオ データを格納し、Audio Unit Render Callback メソッドのようにバッファからデータを読み取るには、CARingBuffer のようなリング バッファが必要です。書き込み操作と読み取り操作は非同期で速度が異なるため、リング バッファーの長さを決定するのは困難です。したがって、一時ファイルを使用して受信データを保存し、常にファイルの最後に日付を書き込み、先頭から読み取ることもできます。

于 2013-01-23T04:07:57.483 に答える