【问题标题】:AVAssetWriter AVVideoExpectedSourceFrameRateKey (frame rate) ignoredAVAssetWriter AVVideoExpectedSourceFrameRateKey(帧率)被忽略
【发布时间】:2018-03-12 12:55:41
【问题描述】:

我和我的团队正在尝试通过更改视频帧速率将视频文件重新编码为更“gify”的感觉。我们为AVAssetWriterInput 使用以下属性:

let videoSettings:[String:Any] = [
            AVVideoCodecKey: AVVideoCodecH264,
            AVVideoHeightKey: videoTrack.naturalSize.height,
            AVVideoWidthKey: videoTrack.naturalSize.width,
            AVVideoCompressionPropertiesKey: [AVVideoExpectedSourceFrameRateKey: NSNumber(value: 12)]                                         
        ]

但输出视频继续以正常帧速率播放(使用AVPlayer播放)。

降低视频帧率的正确方法是什么? (例如 12 个)。

任何对正确方向的帮助都将得到高度认可。我们卡住了。 最好的祝福, 投资回报率

【问题讨论】:

    标签: ios swift avfoundation avassetwriter


    【解决方案1】:

    您可以直接使用CMSampleBufferCreateCopyWithNewTiming 控制附加到AVAssetWriterInput 的每个样本的时间。

    您需要在您提供的CMSampleTimingInfo 中调整时间。 使用CMSampleBufferGetOutputSampleTimingInfoArray 检索当前时间信息,然后检查每个样本的持续时间并计算正确的持续时间以获得每秒 12 帧,并调整呈现和解码时间戳以匹配这个新的持续时间。 然后,您制作副本并将其提供给作者的输入。

    假设你有existingSampleBuffer:

    CMSampleBufferRef sampleBufferToWrite = NULL;
    CMSampleTimingInfo sampleTimingInfo = {0};
    
    CMSampleBufferGetSampleTimingInfo(existingSampleBuffer, 0, &sampleTimingInfo);
    
    // modify duration & presentationTimeStamp
    sampleTimingInfo.duration = CMTimeMake(1, 12) // or whatever frame rate you desire
    sampleTimingInfo.presentationTimeStamp = CMTimeAdd(previousPresentationTimeStamp, sampleTimingInfo.duration);
    previousPresentationTimeStamp = sampleTimingInfo.presentationTimeStamp; // should be initialised before passing here the first time
    
    OSStatus status = CMSampleBufferCreateCopyWithNewTiming(kCFAllocatorDefault, existingSampleBuffer, 1, &sampleTimingInfo, &sampleBufferToWrite);
    
    if (status == noErr) {
        // you can write sampleBufferToWrite
    }
    

    我在这段代码中做了一些假设:

    • SampleBuffer 仅包含一个样本
    • SampleBuffer 包含未压缩的视频(否则,您还需要处理 decodeTimeStamp)

    【讨论】:

    • 嘿缬草!谢谢你的回复。您是否有机会提供一些我们可以使用的代码示例?我们的大脑 CPU 达到了 150% 哈哈。
    • 嘿缬草。我们尝试搜索 Google 并理解您的意思。但我们无法让它工作。请,如果您可以分享更多信息或分享代码,那将是完美的..
    • 快速在我的帖子中添加了一些代码......虽然它是 ObjC,但我希望你明白要点 :-)
    • 它对缬草有效! AVFoundation 确实需要博士学位。太感谢了!我们发现尽管这确实会将视频减慢到 15 fps,但它会使视频更长(显然)。因此,一个简单的解决方法是也删除视频帧。使视频的持续时间相同,但帧数和 FPS 更少。给它那种 GIFY 的感觉。您是否知道是否可以在 copyNextSampleBuffer() 函数中跳过帧?
    • 底线,我们试图降低帧速率,同时保持相同的持续时间(这意味着我们需要一些如何丢弃或删除帧)。这在理论上可行吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    相关资源
    最近更新 更多