小编Dar*_*ely的帖子

AVFoundation - 重新定时CMSampleBufferRef视频输出

第一次在这里问一个问题.我希望帖子清晰,示例代码格式正确.

我正在尝试AVFoundation和时间推移摄影.

我的目的是从iOS设备(我的iPod touch,版本4)的摄像机中抓取每个第N帧,并将每个帧写入文件以创建游戏中时光倒流.我正在使用AVCaptureVideoDataOutput,AVAssetWriter和AVAssetWriterInput.

问题是,如果我使用CMSampleBufferRef传递给

captureOutput:idOutputSampleBuffer:fromConnection:
,每帧的回放是原始输入帧之间的时间长度.帧率为1fps.我希望得到30fps.

我试过用了

CMSampleBufferCreateCopyWithNewTiming()
,但随后将13帧写入文件后,
captureOutput:idOutputSampleBuffer:fromConnection:
停止被叫.界面处于活动状态,我可以点击按钮停止捕获并将其保存到照片库进行播放.它看起来像我想要的那样回放,30fps,但它只有那13帧.

如何实现30fps播放的目标?如何判断应用程序丢失的原因以及原因?

我已经放置了一个名为useNativeTime的标志,因此我可以测试这两种情况.当设置为YES时,我得到所有我感兴趣的帧,因为回调不会"迷路".当我将该标志设置为NO时,我只处理了13帧,并且再也没有返回到该方法.如上所述,在这两种情况下我都可以播放视频.

谢谢你的帮助.

这是我正在尝试重新定时的地方.

    - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
    BOOL useNativeTime = NO;
    BOOL appendSuccessFlag = NO;

    //NSLog(@"in captureOutpput sample buffer method");
    if( !CMSampleBufferDataIsReady(sampleBuffer) )
    {
        NSLog( @"sample buffer is not ready. Skipping sample" );
        //CMSampleBufferInvalidate(sampleBuffer);
        return;
    }

    if (! [inputWriterBuffer isReadyForMoreMediaData])
    {
        NSLog(@"Not ready for data.");
    }
    else {
        // Write every first frame of n frames (30 native from camera). 
        intervalFrames++;
        if (intervalFrames > …
Run Code Online (Sandbox Code Playgroud)

iphone cocoa cocoa-touch avfoundation

11
推荐指数
2
解决办法
1万
查看次数

标签 统计

avfoundation ×1

cocoa ×1

cocoa-touch ×1

iphone ×1