Ios 使用AVAssetWriter在保持相同长度/持续时间的同时降低视频帧速率
我们将从一个基本示例开始:假设我们有一个持续时间为6秒30帧(总共180帧)的视频。我想将FPS降低到15,同时保持视频6秒。这意味着我需要从视频中删除/删除帧(6秒*15帧=90帧) 我和我的团队能够使用Ios 使用AVAssetWriter在保持相同长度/持续时间的同时降低视频帧速率,ios,swift,avfoundation,video-processing,avassetwriter,Ios,Swift,Avfoundation,Video Processing,Avassetwriter,我们将从一个基本示例开始:假设我们有一个持续时间为6秒30帧(总共180帧)的视频。我想将FPS降低到15,同时保持视频6秒。这意味着我需要从视频中删除/删除帧(6秒*15帧=90帧) 我和我的团队能够使用AVAssetWriter更改视频帧速率,但这只会使视频变长。我们尝试跳过以下内容中的帧: while(videoInput.isReadyForMoreMediaData){ let sample = assetReaderVideoOutput.copyNextSamp
AVAssetWriter
更改视频帧速率,但这只会使视频变长。我们尝试跳过以下内容中的帧:
while(videoInput.isReadyForMoreMediaData){
let sample = assetReaderVideoOutput.copyNextSampleBuffer()
if (sample != nil){
if counter % 2 == 0 {
continue // skip frame
}
videoInput.append(sampleBufferToWrite!)
}
但它不起作用。编写器强制执行初始样本计数,即使我们跳过它
总之,我们如何在保持相同的持续时间的同时降低视频帧速率(我们正在尝试创造一种美妙的视频感觉)?
任何帮助都将不胜感激强>
致以最诚挚的问候,Roi对于每个丢弃的帧,您需要通过将要编写的示例的持续时间加倍来进行补偿
while(videoInput.isReadyForMoreMediaData){
if let sample = assetReaderVideoOutput.copyNextSampleBuffer() {
if counter % 2 == 0 {
let timingInfo = UnsafeMutablePointer<CMSampleTimingInfo>.allocate(capacity: 1)
let newSample = UnsafeMutablePointer<CMSampleBuffer?>.allocate(capacity: 1)
// Should check call succeeded
CMSampleBufferGetSampleTimingInfo(sample, 0, timingInfo)
timingInfo.pointee.duration = CMTimeMultiply(timingInfo.pointee.duration, 2)
// Again, should check call succeeded
CMSampleBufferCreateCopyWithNewTiming(nil, sample, 1, timingInfo, newSample)
videoInput.append(newSample.pointee!)
}
counter = counter + 1
}
}
while(videoInput.isReadyForMoreMediaData){
如果let sample=assetradervideooutput.copyNextSampleBuffer(){
如果计数器%2==0{
让timingInfo=UnsafeMutablePointer.allocate(容量:1)
let newSample=unsafemeutablepointer.allocate(容量:1)
//检查呼叫是否成功
CMSampleBufferGetSampleTimingInfo(示例,0,timingInfo)
timingInfo.pointee.duration=CMTimeMultiply(timingInfo.pointee.duration,2)
//同样,检查调用是否成功
CMSampleBufferCreateCopyWithNewTimeing(无,示例,1,计时信息,新闻示例)
videoInput.append(newSample.pointee!)
}
计数器=计数器+1
}
}
对于每个丢弃的帧,您需要通过将要编写的示例的持续时间加倍来进行补偿
while(videoInput.isReadyForMoreMediaData){
if let sample = assetReaderVideoOutput.copyNextSampleBuffer() {
if counter % 2 == 0 {
let timingInfo = UnsafeMutablePointer<CMSampleTimingInfo>.allocate(capacity: 1)
let newSample = UnsafeMutablePointer<CMSampleBuffer?>.allocate(capacity: 1)
// Should check call succeeded
CMSampleBufferGetSampleTimingInfo(sample, 0, timingInfo)
timingInfo.pointee.duration = CMTimeMultiply(timingInfo.pointee.duration, 2)
// Again, should check call succeeded
CMSampleBufferCreateCopyWithNewTiming(nil, sample, 1, timingInfo, newSample)
videoInput.append(newSample.pointee!)
}
counter = counter + 1
}
}
while(videoInput.isReadyForMoreMediaData){
如果let sample=assetradervideooutput.copyNextSampleBuffer(){
如果计数器%2==0{
让timingInfo=UnsafeMutablePointer.allocate(容量:1)
let newSample=unsafemeutablepointer.allocate(容量:1)
//检查呼叫是否成功
CMSampleBufferGetSampleTimingInfo(示例,0,timingInfo)
timingInfo.pointee.duration=CMTimeMultiply(timingInfo.pointee.duration,2)
//同样,检查调用是否成功
CMSampleBufferCreateCopyWithNewTimeing(无,示例,1,计时信息,新闻示例)
videoInput.append(newSample.pointee!)
}
计数器=计数器+1
}
}
嘿,缬草!非常感谢你,你不知道我们多么感谢你的帮助!我们又发现了一个(也是最后一个)阻碍我们前进的问题。我不确定这是否可以解决,但以防万一:我很想听听你的想法。谢谢你,缬草!嗨,缬草!非常感谢你,你不知道我们多么感谢你的帮助!我们又发现了一个(也是最后一个)阻碍我们前进的问题。我不确定这是否可以解决,但以防万一:我很想听听你的想法。谢谢你,缬草!