NebulaFox
NebulaFox

Reputation: 8303

Mute Audio AVAssetWriterInput while recording

I am recording video and audio using an AVAssetWriter to append CMSampleBuffer from AVCaptureVideoDataOutput and AVCaptureAudioDataOutput respectively. What I want to do is at the user discretion mute the audio during the recording.

I assuming the best way is to some how create an empty CMSampleBuffer like

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

but that doesn't work, so I am assuming that I need to create a silent audio buffer. How do I do this and is there a better way?

Upvotes: 2

Views: 1695

Answers (1)

Jim Range
Jim Range

Reputation: 523

I have done this before by calling a function that processes the data in the SampleBuffer and zeros all of it. Might need to modify this if your audio format is not using an SInt16 sample size.

You can also use this same technique to process the audio in other ways.

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

}

Upvotes: 4

Related Questions