当前位置 : 主页 > 手机开发 > ios >

ios – 创建静音音频CMSampleBufferRef

来源:互联网 收集:自由互联 发布时间:2021-06-11
如何在 Swift中创建静音音频CMSampleBufferRef?我希望将静态CMSampleBufferRefs附加到AVAssetWriterInput的实例. 你没有说你想要什么格式的零(整数/浮点,单声道/立体声,采样率),但也许没关系.无论如
如何在 Swift中创建静音音频CMSampleBufferRef?我希望将静态CMSampleBufferRefs附加到AVAssetWriterInput的实例. 你没有说你想要什么格式的零(整数/浮点,单声道/立体声,采样率),但也许没关系.无论如何,这是在swift中创建静音CD音频样式CMSampleBuffer的一种方法.

func createSilentAudio(startFrm: Int64, nFrames: Int, sampleRate: Float64, numChannels: UInt32) -> CMSampleBuffer? {
    let bytesPerFrame = UInt32(2 * numChannels)
    let blockSize = nFrames*Int(bytesPerFrame)

    var block: CMBlockBuffer?
    var status = CMBlockBufferCreateWithMemoryBlock(
        kCFAllocatorDefault,
        nil,
        blockSize,  // blockLength
        nil,        // blockAllocator
        nil,        // customBlockSource
        0,          // offsetToData
        blockSize,  // dataLength
        0,          // flags
        &block
    )
    assert(status == kCMBlockBufferNoErr)

    // we seem to get zeros from the above, but I can't find it documented. so... memset:
    status = CMBlockBufferFillDataBytes(0, block!, 0, blockSize)
    assert(status == kCMBlockBufferNoErr)

    var asbd = AudioStreamBasicDescription(
        mSampleRate: sampleRate,
        mFormatID: kAudioFormatLinearPCM,
        mFormatFlags: kLinearPCMFormatFlagIsSignedInteger,
        mBytesPerPacket: bytesPerFrame,
        mFramesPerPacket: 1,
        mBytesPerFrame: bytesPerFrame,
        mChannelsPerFrame: numChannels,
        mBitsPerChannel: 16,
        mReserved: 0
    )

    var formatDesc: CMAudioFormatDescription?
    status = CMAudioFormatDescriptionCreate(kCFAllocatorDefault, &asbd, 0, nil, 0, nil, nil, &formatDesc)
    assert(status == noErr)

    var sampleBuffer: CMSampleBuffer?

    // born ready
    status = CMAudioSampleBufferCreateReadyWithPacketDescriptions(
        kCFAllocatorDefault,
        block,      // dataBuffer
        formatDesc!,
        nFrames,    // numSamples
        CMTimeMake(startFrm, Int32(sampleRate)),    // sbufPTS
        nil,        // packetDescriptions
        &sampleBuffer
    )
    assert(status == noErr)

    return sampleBuffer
}

你问这个不是很难过吗?你真的需要静默的CMSampleBuffers吗?你不能通过向前移动演示时间戳将静音插入AVAssetWriterInput吗?

网友评论