2010-06-09 4 views
4

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

Дело в том, что я использую 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)); 
     } 
    } 

ответ

0

Я недавно столкнулся этот вопрос с Ilbc кодеком, и пришли к решению следующим образом:

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

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

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

+0

Здравствуйте, Декстер ... проверьте мое решение выше! – Lucas

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

https://github.com/lucaslain/Flipzu_iPhone

Бест,

Лукас.

Смежные вопросы