6

AVAudioRecorder を使用しています。私は音をcaf形式で録音します。その後、 TPAACAudioConverter を使用してファイルcafを aac 形式に変換します。正常に動作しますが、変換されたファイルの長さは 00:00 です。aac オーディオ ファイルの長さを取得する方法はありますか。

4

2 に答える 2

2

一部のシミュレーターでは AAC 形式がサポートされていません。お使いのデバイスで確認できます。問題なく動作し、AAC オーディオ ファイルの長さを取得できます。

于 2013-08-01T09:47:53.287 に答える
0

cafファイルを再生できますか?

マイクからのサウンドを aac ファイルに録音するだけの場合は、Audio Queue Services を使用できます (いくつかのコードを投稿できます)。

編集:これはApple devチュートリアルからの実装です。質問に合うように変更したため、エラーが発生する可能性があります

//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;
于 2013-07-25T14:17:09.207 に答える