2

fromと をそれぞれAVAssetWriter追加する を使用して、ビデオとオーディオを録音しています。私がやりたいことは、録音中にユーザーの裁量でオーディオをミュートすることです。CMSampleBufferAVCaptureVideoDataOutputAVCaptureAudioDataOutput

最良の方法は、空CMSampleBufferのようなものを作成する方法だと思います

CMSampleBufferRef sb;
CMSampleBufferCreate(kCFAllocatorDefault, NULL, YES, NULL, NULL, NULL, 0, 1, &sti, 0, NULL, &sb);
[_audioInputWriter appendSampleBuffer:sb];
CFRelease(sb);

しかし、それは機能しないので、無音のオーディオ バッファを作成する必要があると想定しています。これを行うにはどうすればよいですか? より良い方法はありますか?

4

1 に答える 1

4

SampleBuffer 内のデータを処理し、そのすべてをゼロにする関数を呼び出して、これを以前に実行しました。オーディオ形式が SInt16 サンプル サイズを使用していない場合は、これを変更する必要があるかもしれません。

これと同じ手法を使用して、他の方法でオーディオを処理することもできます。

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection 
{
    if(isMute){
        [self muteAudioInBuffer:sampleBuffer];
    }
}


- (void) muteAudioInBuffer:(CMSampleBufferRef)sampleBuffer 
{

    CMItemCount numSamples = CMSampleBufferGetNumSamples(sampleBuffer);
    NSUInteger channelIndex = 0;

    CMBlockBufferRef audioBlockBuffer = CMSampleBufferGetDataBuffer(sampleBuffer);
    size_t audioBlockBufferOffset = (channelIndex * numSamples * sizeof(SInt16));
    size_t lengthAtOffset = 0;
    size_t totalLength = 0;
    SInt16 *samples = NULL;
    CMBlockBufferGetDataPointer(audioBlockBuffer, audioBlockBufferOffset, &lengthAtOffset, &totalLength, (char **)(&samples));

    for (NSInteger i=0; i<numSamples; i++) {
            samples[i] = (SInt16)0;
    }

}
于 2012-08-02T16:31:50.247 に答える