首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >录制时将音频AVAssetWriterInput静音

录制时将音频AVAssetWriterInput静音
EN

Stack Overflow用户
提问于 2012-08-01 20:20:12
回答 1查看 1.5K关注 0票数 2

我正在使用AVAssetWriter分别从AVCaptureVideoDataOutputAVCaptureAudioDataOutput追加CMSampleBuffer来录制视频和音频。我想要做的是在录制过程中由用户自行决定静音。

我认为最好的方法是如何创建一个空的CMSampleBuffer,比如

代码语言:javascript
复制
CMSampleBufferRef sb;
CMSampleBufferCreate(kCFAllocatorDefault, NULL, YES, NULL, NULL, NULL, 0, 1, &sti, 0, NULL, &sb);
[_audioInputWriter appendSampleBuffer:sb];
CFRelease(sb);

但是这不起作用,所以我假设我需要创建一个静默的音频缓冲区。我该怎么做,有没有更好的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-03 00:31:50

我以前通过调用一个函数来处理SampleBuffer中的数据并将所有数据置零,从而做到了这一点。如果您的音频格式未使用SInt16样本大小,则可能需要修改此设置。

您还可以使用相同的技术以其他方式处理音频。

代码语言:javascript
复制
- (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;
    }

}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11759076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档