您好我正在使用正在录制视频+音频的应用。视频源是摄像头,音频来自流媒体。当出于某种原因关闭与流的通信时,我的问题就出现了。然后在那种情况下我将音频源切换到内置麦克风。问题是音频根本不同步。我想在我的音频中添加一个空格,然后根据当前的视频时间戳实时设置时间戳。似乎AvassetWritter正在从内置麦克风中连续添加帧,看起来就是忽略了时间戳。
你知道为什么avassetwriter忽略了时间戳吗?
编辑:
这是获取最新视频时间戳的代码
- (void)renderVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer
{
CVPixelBufferRef renderedPixelBuffer = NULL;
CMTime timestamp = CMSampleBufferGetPresentationTimeStamp( sampleBuffer );
self.lastVideoTimestamp = timestamp;
这是我用来在流断开时同步来自内置麦克风的音频的代码。
CFRelease(sampleBuffer);
sampleBuffer = [self adjustTime:sampleBuffer by:self.lastVideoTimestamp];
//调整CMSampleBufferFunction
- (CMSampleBufferRef) adjustTime:(CMSampleBufferRef) sample by:(CMTime) offset
{
CMItemCount count;
CMSampleBufferGetSampleTimingInfoArray(sample, 0, nil, &count);
CMSampleTimingInfo* pInfo = malloc(sizeof(CMSampleTimingInfo) * count);
CMSampleBufferGetSampleTimingInfoArray(sample, count, pInfo, &count);
for (CMItemCount i = 0; i < count; i++)
{
pInfo[i].decodeTimeStamp = kCMTimeInvalid;//CMTimeSubtract(pInfo[i].decodeTimeStamp, offset);
pInfo[i].presentationTimeStamp = CMTimeSubtract(pInfo[i].presentationTimeStamp, offset);
}
CMSampleBufferRef sout;
CMSampleBufferCreateCopyWithNewTiming(nil, sample, count, pInfo, &sout);
free(pInfo);
return sout;
}
这就是我想要做的。
Video
--------------------------------------------------------------------
Stream disconnect stream Built in mic
----------------------------------- -----------------
我想得到这个,因为你可以看到有一个没有音频的空间,因为来自流的音频断开连接,也许你没有收到所有音频。
目前正在做什么:
Video
--------------------------------------------------------------------
Stream disconnect stream Built in mic
--------------------------------------------------------------------