4

サウンドを録音する iPhone アプリケーションを作成しています。私は Audio Queue Services を利用していますが、録音にはすべてがうまく機能します。

問題は、ファイル書き込みにAudioFileWritePacketsを使用していて、同じ「AAC + ADTS」パケットをネットワークソケットに入れようとしているということです。

一部の「ヘッダー」または「adts ヘッダー」が欠落している可能性があるため、結果のファイルは異なります。ADTS ヘッダーや AAC ヘッダーの書き方についてアイデアを探していますか? コミュニティはこれについて私を支援してくれますか、またはこれを行う方法を示したガイドを紹介してくれますか?

現在、Buffer Handler メソッドがあります。

void Recorder::MyInputBufferHandler(void inUserData,
    AudioQueueRefinAQ, AudioQueueBufferRefinBuffer,
    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");

                    fprintf(stderr, "Writing.");    

                // We write the Net Buffer.
                [aqr->socket_if writeData :(void *)(inBuffer->mAudioData)
                    :inBuffer->mAudioDataByteSize];

                aqr->mRecordPacket += inNumPackets;
            }

            // 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));
        }
    }
4

2 に答える 2

1

私はこれに対する解決策を見つけました:

コールバックを実装しました

  XThrowIfError(
                  AudioFileInitializeWithCallbacks(
                                                   this,
                                                   nil,
                                                   BufferFilled_callback,
                                                   nil,
                                                   nil,
                                                   //kAudioFileCAFType,
                                                   kAudioFileAAC_ADTSType,
                                                   &mRecordFormat,
                                                   kAudioFileFlags_EraseFile,
                                                   &mRecordFile),
                  "InitializeWithCallbacks failed");

...そしてvoilá!実装する必要のある実際のコールバックはBufferFilled_callbackです。これが私の実装です:

OSStatus AQRecorder::BufferFilled_callback(
                                           void *                               inUserData,
                                           SInt64                               inPosition,
                                           UInt32                               requestCount,
                                           const void *                         buffer,
                                           UInt32 *                             actualCount) {

    AQRecorder *aqr = (AQRecorder *)inUserData;

    // You can write these bytes to anywhere. 
    // You can build a streaming server 

    return 0;
}

オーディオキューサービスについてもっと知りたい場合は、Flipzu for iPhoneからいくつかのアイデアを得ることができます(ライブ放送オーディオの元アプリ//資金を調達できなかったため、シャットダウンする必要があります)。

https://github.com/lucaslain/Flipzu_iPhone

一番、

ルーカス。

于 2012-07-11T18:22:47.273 に答える
0

私は最近 iLBC コーデックでこの問題に遭遇し、次のように解決策にたどり着きました。

必要なオーディオ データを録音し、ファイルに書き込むだけです。次に、そのファイルを取得し、8 進ダンプを実行します。-c フラグを使用して、ASCII 文字を表示できます。

次に、ヘッダーが含まれていないことがわかっている別のファイルを作成します。これは、Audio Queue のバッファからのデータです。それを8進ダンプし、比較します。

これから、ヘッダーと続行方法に関する十分な情報が得られるはずです。お役に立てれば。

于 2011-08-09T14:36:12.003 に答える