我有一个包含
当写入单个MP4文件时,一切正常。但是当我尝试在每5秒钟保存到连续文件时,通过FFMPEG连接所有文件时会出现轻微的音频中断。
示例合并视频(请注意每5秒钟的小音频中断): 经过大量调查,我认为这可能是由于音频和视频片段被分割或未在同一时间戳上启动所致。
现在,我已经知道我的算法应该可以工作,但我不知道如何分割音频
AVCaptureScreenInput
和AVCaptureDeviceInput
的AVCaptureSession
。两者都作为数据输出代理进行连接,并使用AVAssetWriter
将数据写入单个MP4文件。当写入单个MP4文件时,一切正常。但是当我尝试在每5秒钟保存到连续文件时,通过FFMPEG连接所有文件时会出现轻微的音频中断。
示例合并视频(请注意每5秒钟的小音频中断): 经过大量调查,我认为这可能是由于音频和视频片段被分割或未在同一时间戳上启动所致。
现在,我已经知道我的算法应该可以工作,但我不知道如何分割音频
CMBufferSample
。似乎CMSampleBufferCopySampleBufferForRange可能有用,但不确定如何基于时间进行分割(想要一个包含该时间之前和之后所有样本的缓冲区)。func getBufferUpToTime(sample: CMSampleBuffer, to: CMTime) -> CMSampleBuffer {
var numSamples = CMSampleBufferGetNumSamples(sample)
var sout: CMSampleBuffer?
let endSampleIndex = // how do I get this?
CMSampleBufferCopySampleBufferForRange(nil, sample, CFRangeMake(0, numSamples), &sout)
return sout!
}
CMSampleBuffer
调用非常冗长,而你想要在样本边界上进行拆分,但似乎只有CMTime
,当它们由AVCaptureSession
提供给你时,它们的时间基准肯定不是音频采样率,然后OSX为你提供了这个免费的出狱卡。 - Rhythmic FistmanCMSampleBufferCopySampleBufferForRange
无法工作,因为CMSampleBuffer
仅对第一个样本有演示时间戳,这意味着我可以假设之后每个样本的演示都是均匀分布的(根据文档)。所以我可能需要手动从底层缓冲区中获取数据并创建两个CMSampleBuffer
。 :-) - Vinay