我正在使用将通过以下方式捕获的AudioConverter
未压缩转换为:CMSampleBuffer
AVCaptureSession
AudioBufferList
let status: OSStatus = AudioConverterFillComplexBuffer(
converter,
inputDataProc,
Unmanaged.passUnretained(self).toOpaque(),
&ioOutputDataPacketSize,
outOutputData.unsafeMutablePointer,
nil
)
我的输出 asbd 设置如下:
AudioStreamBasicDescription
- mSampleRate : 44100.0
- mFormatID : 1633772320
- mFormatFlags : 2
- mBytesPerPacket : 0
- mFramesPerPacket : 1024
- mBytesPerFrame : 0
- mChannelsPerFrame : 1
- mBitsPerChannel : 0
- mReserved : 0
我想转换AudioBufferList
回CMSampleBuffer
包含压缩数据,以便我可以将其写入 mp4 文件使用AVAssetWriter
(我已经想出如何用视频来做到这一点),但到目前为止很少。我试过咨询这个答案,但在那种情况下有 PCM 数据,它似乎在这里不可用。
我可以访问AudioBufferList
以及原始样本的presentationTimeStamp。我尝试了以下方法,但我不太确定如何计算 numSamples 以及这种方法是否有意义:
func createCMSampleBuffer(_ data: UnsafeMutableAudioBufferListPointer, presentationTimeStamp: CMTime) -> CMSampleBuffer? {
let numSamples = // not sure how to get this
var status: OSStatus = noErr
var sampleBuffer: CMSampleBuffer?
var timing: CMSampleTimingInfo = CMSampleTimingInfo(
duration: CMTime(value: CMTimeValue(numSamples), timescale: presentationTimeStamp.timescale),
presentationTimeStamp: presentationTimeStamp,
decodeTimeStamp: CMTime.invalid
)
status = CMSampleBufferCreate(
allocator: kCFAllocatorDefault,
dataBuffer: nil,
dataReady: false,
makeDataReadyCallback: nil,
refcon: nil,
formatDescription: formatDescription,
sampleCount: CMItemCount(numSamples),
sampleTimingEntryCount: 1,
sampleTimingArray: &timing,
sampleSizeEntryCount: 0,
sampleSizeArray: nil,
sampleBufferOut: &sampleBuffer
)
guard status == noErr else {
return nil
}
status = CMSampleBufferSetDataBufferFromAudioBufferList(
sampleBuffer!,
blockBufferAllocator: kCFAllocatorDefault,
blockBufferMemoryAllocator: kCFAllocatorDefault,
flags: 0,
bufferList: data.unsafePointer
)
guard status == noErr else {
return nil
}
return sampleBuffer
}
最后我确实设法创建了一个CMSampleBuffer
,但是当我尝试完成写作时,我收到以下错误:
Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo={NSUnderlyingError=0x174442ac0 {Error Domain=NSOSStatusErrorDomain Code=-12735 "(null)"}, NSLocalizedFailureReason=An unknown error occurred (-12735), NSLocalizedDescription=The operation could not be completed}