你如何CMSampleBufferRef
在Swift中创建静音?我希望将一个沉默的CMSampleBufferRef
s 附加到一个实例中AVAssetWriterInput
.
你没有说你想要什么格式的零(整数/浮点,单声道/立体声,采样率),但也许没关系.无论如何,这是CMSampleBuffer
在swift中创建静音CD音频风格的一种方法.
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 }
你问这个不是很难过吗?你真的需要沉默CMSampleBuffer
吗?你不能通过AVAssetWriterInput
向前移动演示时间戳来插入静音吗?