gpt4 book ai didi

ios - 使用帧方法的带有音频的慢动作视频 - iOS

转载 作者:行者123 更新时间:2023-12-01 18:34:53 24 4
gpt4 key购买 nike

我必须使用基于帧的方法将视频转换为带有音频的慢动作。
以下链接有很多帮助
Reverse-AVAsset-Efficient

在解决方案中,我可以更改缓冲区的时间戳并实现慢动作视频。

for sample in videoSamples {
var presentationTime = CMSampleBufferGetPresentationTimeStamp(sample)

//Changing Timestamp to achieve slow-motion
presentationTime.timescale = presentationTime.timescale * 2

let imageBufferRef = CMSampleBufferGetImageBuffer(sample)
while !videoWriterInput.isReadyForMoreMediaData {
Thread.sleep(forTimeInterval: 0.1)
}
pixelBufferAdaptor.append(imageBufferRef!, withPresentationTime: presentationTime)
}

对于音频慢动作,我尝试更改音频样本的时间戳,但没有效果。

音频慢动作有什么解决方案。

如果您有 Objective-C 解决方案,请随时发布。
谢谢。

最佳答案

您可以使用 AVMutableComposition 做一个简单的慢动作.正如@hotpaw2 所提到的,减慢音频速度的方法不止一种——例如,您可以降低音高或保持音高不变。这个解决方案似乎保持不变,我看不到任何改变它的方法。也许这就是你想要的。也许不吧。

您可以使用 AVAssetExportSession将慢速视频写入文件,并且由于AVMutableComposition是(也许令人惊讶的)AVAsset 的子类,您可以使用 AVPlayer 预览结果即使您没有导出视频的慢动作版本。

let asset = AVURLAsset(url: Bundle.main.url(forResource: "video", withExtension: "mp4")! , options : nil)

let srcVideoTrack = asset.tracks(withMediaType: .video).first!
let srcAudioTrack = asset.tracks(withMediaType: .audio).first!

let sloMoComposition = AVMutableComposition()
let sloMoVideoTrack = sloMoComposition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid)!
let sloMoAudioTrack = sloMoComposition.addMutableTrack(withMediaType: .audio, preferredTrackID: kCMPersistentTrackID_Invalid)!

let assetTimeRange = CMTimeRange(start: .zero, duration: asset.duration)

try! sloMoVideoTrack.insertTimeRange(assetTimeRange, of: srcVideoTrack, at: .zero)
try! sloMoAudioTrack.insertTimeRange(assetTimeRange, of: srcAudioTrack, at: .zero)

let newDuration = CMTimeMultiplyByFloat64(assetTimeRange.duration, multiplier: 2)
sloMoVideoTrack.scaleTimeRange(assetTimeRange, toDuration: newDuration)
sloMoAudioTrack.scaleTimeRange(assetTimeRange, toDuration: newDuration)

// you can play sloMoComposition in an AVPlayer at this point

// Export to a file using AVAssetExportSession
let exportSession = AVAssetExportSession(asset: sloMoComposition, presetName: AVAssetExportPresetPassthrough)!
exportSession.outputFileType = .mp4
exportSession.outputURL = getDocumentsDirectory().appendingPathComponent("slow-mo-\(Date.timeIntervalSinceReferenceDate).mp4")
exportSession.exportAsynchronously {
assert(exportSession.status == .completed)
print("File in \(exportSession.outputURL!)")
}

关于ios - 使用帧方法的带有音频的慢动作视频 - iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61475524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com