2012-08-01 138 views
2

我正在使用AVAssetWriter錄製視頻和音頻以分別從AVCaptureVideoDataOutputAVCaptureAudioDataOutput附加CMSampleBuffer。我想要做的是用戶自行決定在錄音過程中將音頻靜音。靜音音頻AVAssetWriterInput錄音時

我假設最好的辦法是一些如何創建一個空的CMSampleBuffer

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

但是,這並不工作,所以我假設我需要創建一個無聲的音頻緩衝。我如何做到這一點,有沒有更好的方法?

回答

3

我已經通過調用處理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; 
    } 

} 
+1

只是旁註,你可以乘以0到n之間的數字來做一個音量百分比減少/增加。 – jjxtra 2015-02-10 21:43:12