使用AVAssetWriter无法正常设置CMsampleBuffer中的时间戳

时间:2016-02-21 17:40:05

标签: ios audio avfoundation avassetwriter

您好我正在使用正在录制视频+音频的应用。视频源是摄像头,音频来自流媒体。当出于某种原因关闭与流的通信时,我的问题就出现了。然后在那种情况下我将音频源切换到内置麦克风。问题是音频根本不同步。我想在我的音频中添加一个空格,然后根据当前的视频时间戳实时设置时间戳。似乎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
--------------------------------------------------------------------

0 个答案:

没有答案