当前位置: 首页 > 面试题库 >

AVAssetWriter AVVideoExpectedSourceFrameRateKey(帧频)已忽略

华坚成
2023-03-14
问题内容

我和我的团队正在尝试通过更改视频帧频来对视频文件进行重新编码,以使其更具“格调”感。我们将以下属性用于AVAssetWriterInput

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

但是输出视频仍以正常帧频播放(使用播放AVPlayer)。

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

朝着正确方向的任何帮助都将受到高度重视。 我们卡住了。此致Roi


问题答案:

您可以控制附加到每个样品的时间AVAssetWriterInput直接CMSampleBufferCreateCopyWithNewTiming

您需要在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)


 类似资料:
  • 我想让应用程序逐帧播放功能。我想这是不可能与标准的Android工具。我尝试了VideoView和search kTo(当前的1000/帧率)方法,但它不起作用(我想它不会在暂停的视频上寻找)。我的问题是:我需要学习和使用什么来使它成为可能,什么工具和/或库?我是Android初学者,我没有工作的视频渲染早,所以我的知识,这是真的很低。

  • 问题内容: 我正在创建一个单页应用程序,后端使用Golang,前端使用javascript。我想找到一种方法,以使用Golang获取视频的第一帧。 首先,我将一个.mp4视频文件上传到服务器。它保存在服务器上。 有没有一种方法可以使用Golang获取此视频的第一帧?应该可以在前端使用Javascript来做到这一点,但我认为这不是解决此问题的正确方法。 我不知道如何使用Golang来实现它,也没有

  • 我正在尝试使用JAXB生成一个sitemap.xml,并且忽略了location属性(我想在根元素上生成属性)。 我想生成一个xml,如下所示: 生成根元素,如下所示: 如果我更新测试以使用显式设置位置,那么它将被填充--但我想了解为什么它不能与注释一起工作。

  • 问题内容: 我正在做一些关于如何比较声音文件(波形)的研究。基本上我想将存储的声音文件(wav)与麦克风的声音进行比较。因此,最后我想预存储自己的一些语音命令,然后在我运行我的应用程序时,我想将预存储的文件与麦克风的输入进行比较。 我的想法是在进行比较时要留出一定的余地,因为我猜很难以完全相同的方式连续说两次。 因此,经过一番谷歌搜索后,我发现python具有名为wave和Wave_read对象的

  • 我已经添加了JVM start参数: 但在原木里我看到了