Заголовок AAC и другая информация в iPhone

Я создаю приложение для iPhone, которое записывает звук. Я использую Audio Queue Services, и все отлично работает для записи.

Дело в том, что я использую AudioFileWritePackets для записи файлов, и я пытаюсь поместить те же самые пакеты "AAC + 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));
        }
    }

person Lucas    schedule 09.06.2010    source источник


Ответы (2)


Я нашел решение для этого:

Я реализовал обратный вызов

  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 для iPhone (бывшее приложение для прямой трансляции аудио // нам пришлось закрыть его, потому что мы не смогли собрать деньги).

https://github.com/lucaslain/Flipzu_iPhone

Лучший,

Лукас.

person Lucas    schedule 11.07.2012

Недавно я столкнулся с этой проблемой с кодеком iLBC и нашел решение следующим образом:

Запишите нужные аудиоданные и просто запишите их в файл. Затем возьмите этот файл и сделайте для него восьмеричный дамп. Вы можете использовать флаг -c, чтобы увидеть символы ascii.

Затем создайте отдельный файл, который, как вы знаете, не содержит заголовка. Это просто ваши данные из буферов аудио очереди. Octal сбросьте это и сравните.

Исходя из этого, у вас должен быть заголовок и достаточно информации о том, как действовать дальше. Надеюсь это поможет.

person DexterW    schedule 09.08.2011
comment
Привет Декстер ... проверьте мое решение выше! - person Lucas; 11.07.2012