Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用AVAssetWriter/Avassetrader设置视频帧速率时出现问题 情况:_Ios_Swift_Macos_Video_Video Encoding - Fatal编程技术网

Ios 使用AVAssetWriter/Avassetrader设置视频帧速率时出现问题 情况:

Ios 使用AVAssetWriter/Avassetrader设置视频帧速率时出现问题 情况:,ios,swift,macos,video,video-encoding,Ios,Swift,Macos,Video,Video Encoding,我正在尝试导出带有一些参数的视频,如视频比特率、音频比特率、帧速率、更改视频分辨率等。请注意,我让用户以分数形式设置视频帧速率;喜欢的用户可以设置视频帧速率,比如说23.98 我使用AVAssetWriter和avassetrader进行此操作。我使用它来编写示例缓冲区 除了视频帧速率之外,其他一切都正常工作 我所尝试的: 按照建议设置编剧电影时间刻度。这会改变视频帧速率,但也会使视频变慢。() 设置AVVideoExpectedSourceFrameRateKey。这没有帮助。() 设置A

我正在尝试导出带有一些参数的视频,如视频比特率、音频比特率、帧速率、更改视频分辨率等。请注意,我让用户以分数形式设置视频帧速率;喜欢的用户可以设置视频帧速率,比如说23.98

我使用AVAssetWriteravassetrader进行此操作。我使用它来编写示例缓冲区

除了视频帧速率之外,其他一切都正常工作

我所尝试的:
  • 按照建议设置编剧电影时间刻度。这会改变视频帧速率,但也会使视频变慢。()

  • 设置AVVideoExpectedSourceFrameRateKey。这没有帮助。()

  • 设置AVAssetWriterInput.mediaTimeScale。同样,它会改变视频帧速率,但会像AVAssetWriter.movieTimeScale一样使视频变慢。视频在某个点显示不同的帧,有时会粘住并再次恢复。()

  • 使用AvasseTraderEdoCompositionOutput和设置AVMutableVideoComposition.frameDuration;就像你一样。具有讽刺意味的是,使用sdavasetexportsession代码,视频正以我想要的正确帧速率导出,但它在我的代码中不起作用 我不知道为什么它不能与我的代码一起工作。这种方法的问题是它总是从AvassetradeServiceDeCompositionOutput.copyNextSampleBuffer()返回nil


  • 使用CMSampleTimingInfo手动更改帧的时间戳,建议如下:
  • 使用这种方法,我确实将帧速率设置得恰到好处,但它会增加视频持续时间(如该问题答案的评论中所述)。我认为在某些情况下,我可能不得不放弃一些帧(如果目标帧速率较低;在大多数情况下,我需要降低帧速率)

    如果我知道如果我想要30fps,而我当前的帧速率是60fps,那么丢弃每一帧并相应地设置SampleBuffer时间就很简单了

    如果我采用这种方法(即设置23.98 fps),我如何决定丢弃哪一帧,如果目标帧速率更高,应复制哪一帧?提醒:帧速率可以是分数



    您能为“迟缓”视频添加一个示例吗?嗯,如果您的目标是任意帧速率,那么首先将视频采样(过滤)到更高的fps(比如120或更高),然后再将采样降低到正确的fps,这是否有意义?这可能会保持运动的平滑度不变,而每n帧跳过一次将完全破坏视频的速度。
    var sampleTimingInfo = CMSampleTimingInfo()
    var sampleBufferToWrite: CMSampleBuffer?
    
    CMSampleBufferGetSampleTimingInfo(vBuffer, at: 0, timingInfoOut: &sampleTimingInfo)
    
    sampleTimingInfo.duration = CMTimeMake(value: 100, timescale: Int32(videoConfig.videoFrameRate * 100))
    
    sampleTimingInfo.presentationTimeStamp = CMTimeAdd(previousPresentationTimeStamp, sampleTimingInfo.duration)
    
    previousPresentationTimeStamp = sampleTimingInfo.presentationTimeStamp
    
    let status = CMSampleBufferCreateCopyWithNewTiming(allocator: kCFAllocatorDefault, sampleBuffer: vBuffer,sampleTimingEntryCount: 1, sampleTimingArray: &sampleTimingInfo, sampleBufferOut: &sampleBufferToWrite)