2010-06-09 12 views
4

Je construis une application iPhone qui enregistre le son. J'utilise Audio Queue Services, et tout fonctionne bien pour l'enregistrement. Le fait est que j'utilise AudioFileWritePackets pour l'écriture de fichiers, et j'essaye de mettre les mêmes paquets "AAC + ADTS" sur un socket réseau.En-tête AAC et d'autres informations dans l'iPhone

Le fichier résultant est différent car certains "en-têtes" ou "en-têtes" peuvent être manquants. Je cherche des idées sur la façon d'écrire l'en-tête ADTS et/ou en-tête AAC? La communauté pourrait-elle m'aider avec ceci ou me référer à un guide qui a montré comment faire ceci?

J'ai actuellement mon tampon méthode 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)); 
     } 
    } 

Répondre

0

J'ai récemment rencontré ce problème avec le codec ILBC, et est arrivé à la solution comme suit:

Enregistrez le données audio que vous voulez et il suffit de l'écrire dans un fichier. Ensuite, prenez ce fichier et faites un vidage octal dessus. Vous pouvez utiliser l'indicateur -c pour voir les caractères ascii.

Ensuite, créez un fichier distinct dont vous savez qu'il ne contient pas l'en-tête. Ce sont juste vos données des tampons dans la file d'attente audio. Octal décharge ça, et compare.

De cela, vous devriez avoir l'en-tête et assez d'informations sur la façon de procéder. J'espère que cela t'aides.

+0

Bonjour Dexter ... vérifiez ma solution ci-dessus! – Lucas

1

que j'ai trouvé la solution pour cela:

I mis en œuvre le rappel

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

... Et voilà! Le rappel réel que vous devez implémenter est BufferFilled_callback. Voici mon implémentation:

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; 
} 

Si vous souhaitez en savoir plus sur les services de file d'attente audio, vous pouvez obtenir des idées de Flipzu pour iPhone (ex-application pour diffusion audio en direct // nous devons l'arrêter parce que nous ne pouvait pas lever de l'argent).

https://github.com/lucaslain/Flipzu_iPhone

Best,

Lucas.