4

我正在构建一个记录声音的 iPhone 应用程序。我使用音频队列服务,一切都非常适合录音。

问题是,我正在使用 AudioFileWritePackets 进行文件写入,并且我正在尝试将相同的“AAC + ADTS”数据包放入网络套接字。

结果文件不同,因为可能缺少某些“标题”或“广告标题”。我正在寻找有关如何编写 ADTS 标头和/或 AAC 标头的想法?社区可以帮助我解决这个问题,或者让我参考一个演示如何做到这一点的指南吗?

我目前有我的缓冲区处理程序方法:

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");

……瞧!您必须实现的真正回调是 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 编解码器时遇到了这个问题,并得出了如下解决方案:

录制您想要的音频数据,然后将其写入文件。然后,获取该文件并对其进行八进制转储。您可以使用 -c 标志查看 ascii 字符。

然后,创建一个您知道不包含标题的单独文件。这只是来自音频队列缓冲区的数据。八进制转储,并进行比较。

由此,您应该有标题和有关如何继续的足够信息。希望这可以帮助。

于 2011-08-09T14:36:12.003 回答