2013-07-25 11 views

risposta

2

L'AAC non supporta per qualche simulator.You possono controllare su il tuo dispositivo. Funzionerà correttamente e potresti ottenere la durata del file audio AAC.

+0

sto anche affrontando lo stesso problema ho provato il progetto di esempio TPAACAudioConverter ma non gioca sul mio dispositivo ?? – Ravindhiran

0

È possibile riprodurre il file caf?

Se si desidera solo per registrare un suono dal microfono in un file AAC, è possibile utilizzare servizi coda audio (posso inviare un codice)

Edit: si tratta di un'implementazione da parte di Apple dev tutorial, ci potrebbe essere qualche errori da quando ho modificato per adattarsi alla tua domanda

//AudioQ.mm 
@implementation AudioQ 
static const int nBuffer = 3; 

struct AQRecorderState{ 
    AudioStreamBasicDescription mDataFormat; 
    AudioQueueRef    mQueue; 
    AudioQueueBufferRef   mBuffers[nBuffer]; 
    AudioFileID     mAudioFile; 
    UInt32      bufferByteSize; 
    SInt64      mCurrentPacket; 
    bool      mIsRunning; 
}; 

AQRecorderState aqData; 
CFURLRef url; 
static OSStatus BufferFilledHandler(
            void *        inUserData, 
            SInt64        inPosition, 
            UInt32        requestCount, 
            const void *       buffer, 
            UInt32 *        actualCount 

            ){ 
    // callback when you write to the file 
    // you can handle audio packet and send them for broadcasting 
    return 0; 
} 

static void HandleInputBuffer(
           void        *aqData, 
           AudioQueueRef      inAq, 
           AudioQueueBufferRef     inBuffer, 
           const AudioTimeStamp    *inStartTime, 
           UInt32        inNumPackets, 
           const AudioStreamPacketDescription *inPacketDesc 
          ) { 
    AQRecorderState *pAqData = (AQRecorderState*) aqData; 
    if (AudioFileWritePackets (
           pAqData->mAudioFile, 
           false, 
           inBuffer->mAudioDataByteSize, 
           inPacketDesc, 
           pAqData->mCurrentPacket, 
           &inNumPackets, 
           inBuffer->mAudioData 
           ) == noErr) { 
     pAqData->mCurrentPacket += inNumPackets; 
    } else { 
     NSLog(@"err writing packet"); 
    } 
    if (pAqData->mIsRunning == 0) 
     return; 
    AudioQueueEnqueueBuffer(pAqData->mQueue,inBuffer,0,NULL); 
} 

-(OSStatus) initializeAQ{ 

    //--- set the output format ---// 
    aqData.mDataFormat.mSampleRate = 22050; 
    aqData.mDataFormat.mFormatID = kAudioFormatMPEG4AAC; 
    aqData.mDataFormat.mFormatFlags = kMPEG4Object_AAC_Main; 
    aqData.mDataFormat.mBytesPerPacket = 0; 
    aqData.mDataFormat.mFramesPerPacket = 1024; 
    aqData.mDataFormat.mBytesPerFrame = 0; 
    aqData.mDataFormat.mChannelsPerFrame = 1; 
    aqData.mDataFormat.mBitsPerChannel = 0; 
    AudioFileTypeID fileType = kAudioFileAAC_ADTSType; 

    aqData.bufferByteSize = 0x5000; // ?? 

    AudioQueueNewInput(&aqData.mDataFormat, HandleInputBuffer, &aqData, CFRunLoopGetMain(), kCFRunLoopCommonModes, 0, &aqData.mQueue); 
    aqData.mCurrentPacket = 0; 
    aqData.mIsRunning = true; 


    //--- record in a file get the callback when writing ---// 
    AQRecorderState *pAqData = &aqData; 
    AudioFileInitializeWithCallbacks((void*)&pAqData, 
            nil, 
            BufferFilledHandler, 
            nil, 
            nil, 
            fileType, 
            &aqData.mDataFormat, 
            kAudioFileFlags_EraseFile, 
            &aqData.mAudioFile); 

    //--- prepare set of audio queue buffers ---// 
    for(int i = 0 ; i < nBuffer ; i++){ 
     AudioQueueAllocateBuffer(aqData.mQueue, aqData.bufferByteSize, &aqData.mBuffers[i]); 
     AudioQueueEnqueueBuffer(aqData.mQueue, aqData.mBuffers[i], 0, NULL); 
    } 
    return 0; 
} 

-(void) start{ 
    AudioQueueStart(aqData.mQueue, NULL);  
} 

-(void) stop{ 
    NSLog(@"stoping"); 
    AudioQueueStop(aqData.mQueue, true); 
    aqData.mIsRunning = false; 
    AudioQueueDispose (aqData.mQueue,true); 
    AudioFileClose (aqData.mAudioFile); 
} 
@end 

AudioQ.h

static void HandleInputBuffer(
           void         *aqData, 
           AudioQueueRef       inAq, 
           AudioQueueBufferRef     inBuffer, 
           const AudioTimeStamp     *inStartTime, 
           UInt32        inNumPackets, 
           const AudioStreamPacketDescription *inPacketDesc 
          ); 

static OSStatus BufferFilledHandler(
            void *        inUserData, 
            SInt64        inPosition, 
            UInt32        requestCount, 
            const void *       buffer, 
            UInt32 *        actualCount 
            ); 
-(OSStatus)initializeAQ; 
-(void)stop; 
-(void)start; 
+2

Sono stati creati per scopi di registrazione con un'ampia scelta di formati di output – HaneTV

+0

modificato il mio primo post con esempio, si noti che è objectiveC++ – HaneTV

+1

si può quasi copiare incollare il codice, non dimenticare di cambiare .m in .mm e importare " CoreAudio/CoreAudioTypes.h "" AudioToolbox/AudioQueue.h " " AudioToolbox/AudioFile.h "" AudioToolbox/AudioConverter.h "Sono nuovo di SO e non so come collegare ... – HaneTV

Problemi correlati