1

AVCaptureSessionで動画を録画したいし、音声部分も加工したい。(AACに変換して保存)。Apple からこのサンプルを読みましたが、自分の目的に合わせて機能させることができず、Audio Units は必要ないと思います。これが私のコードです:

- (void) encodeSample:(CMSampleBufferRef) sample;
{
    int nFrame = CMSampleBufferGetNumSamples(sample);
    currentSampleTime += (double) nFrame;
    AudioTimeStamp ts;
    memset(&ts, 0, sizeof(AudioTimeStamp));
    ts.mSampleTime = currentSampleTime;
    ts.mFlags |= kAudioTimeStampSampleTimeValid;

    AudioBufferList lBuffer;
    lBuffer.mNumberBuffers = 1;
    lBuffer.mBuffers[0].mNumberChannels = 2;
    lBuffer.mBuffers[0].mData = malloc(nFrame * sizeof(SInt16) * 2);
    lBuffer.mBuffers[0].mDataByteSize = nFrame * sizeof(SInt16) * 2;

    size_t bufferListSizeNeededOut;
    CMBlockBufferRef blockBufferOut = nil;
    OSStatus err = CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sample,
                                                                  &bufferListSizeNeededOut,
                                                                  &lBuffer,
                                                                  sizeof(lBuffer),
                                                                  kCFAllocatorSystemDefault,
                                                                  kCFAllocatorSystemDefault,
                                                                  kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment,
                                                                  &blockBufferOut);

    NSLog(@"lbuff : %ld",err);
    @synchronized(self){
        if(adtsFile)
        {
            err = ExtAudioFileWriteAsync(adtsFile, nFrame, &lBuffer);
            NSLog(@"async : %ld",err);
        }
    }
}

ただし、3回の呼び出し後に EXC_BAD_ACCESS を取得します。

2013-09-04 15:01:35.669 Recoder[13683:1803] lbuff : 0
2013-09-04 15:01:35.673 Recoder[13683:1803] async : 0
2013-09-04 15:01:37.194 Recoder[13683:5b03] lbuff : 0
2013-09-04 15:01:37.197 Recoder[13683:5b03] async : 0
2013-09-04 15:01:37.201 Recoder[13683:5b03] lbuff : 0
// bad access here

ExtAudioFile を初期化するために使用するコードを共有することもできますが、うまく機能すると思います (作成した別のアプリで使用しています)。

4

0 に答える 0