xcode 将静音应用于Swift5中的CMSampleBuffer

nr9pn0ug  于 2023-02-16  发布在  Swift
关注(0)|答案(1)|浏览(120)

我正在尝试使用AVAssetWriter在iOS设备上通过摄像头和麦克风保存捕获的视频和音频。我完成了一个基本功能的开发,比如用户可以记录两个图像(视频)和音频,现在我尝试使静音功能可用。我猜当isMuted为真时,我需要追加空(或者沉默?)CMSampleBufferassetWriterAudioInput,但是这是正确的方法吗?如果不是,你能给我指出正确的方向吗?另外,在createSilenceBuffer函数中,我如何创建空/沉默的CMSampleBuffer?

var isMuted: Bool = false
var assetWriterAudioInput: AVAssetWriterInput?

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    if output == videoOutput {
        guard assetWriterVideoInput?.isReadyForMoreMediaData == true else { return }
        assetWriterVideoInput?.append(sampleBuffer)
    } else if output == audioOutput {
        if issued {
            let silenceBuffer = createSilenceBuffer(from sampleBuffer)
            assetWriterAudioInput?.append(silenceBuffer)
        } else {
            assetWriterAudioInput?.append(sampleBuffer)
        }
    }
}

func createSilenceBuffer(from sampleBuffer: CMSampleBuffer) -> CMSampleBuffer {
    // return new CMSampleBuffer without audio??
}
m4pnthwp

m4pnthwp1#

您可以使用此函数将传入的音频静音CMSampleBuffers

private func _cacheAudioBuffer(sampleBuffer: CMSampleBuffer, isMuted: Bool) {
   if isMuted,
   let ref = CMSampleBufferGetDataBuffer(sampleBuffer) {
    CMBlockBufferFillDataBytes(
        with: 0,
        blockBuffer: ref,
        offsetIntoDestination: 0,
        dataLength: CMBlockBufferGetDataLength(ref))
   }
       // Continue here with muted samplebuffer
}

相关问题