更改帧速率后保存 avplayer 视频 swift
Saving avplayer video after changing frame rate swift
我正在将视频的帧率更改为快进和快退视频,但是如何在 swift 中更改帧率后将视频保存到照片库中。
所以我通过以下代码解决了这个问题:
let videoAsset = AVAsset(url: inputURL as URL) as AVAsset
let clipVideoTrack = videoAsset.tracks(withMediaType: AVMediaType.video).first! as AVAssetTrack
let composition = AVMutableComposition()
let videoCompositions = composition.addMutableTrack(withMediaType: AVMediaType.video, preferredTrackID: CMPersistentTrackID())
do {
try videoCompositions?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: (videoAsset.tracks(withMediaType: AVMediaType.video).first)!, at: kCMTimeZero)
} catch {
print("handle insert error")
return
}
let videoDuration = videoAsset.duration
let finalTimeScale:Int64 = (Int64(float_t(videoDuration.value) / player.rate))
print("player rate is", player.rate)
videoCompositions?.scaleTimeRange(CMTimeRangeMake(kCMTimeZero, videoDuration), toDuration: CMTimeMake(finalTimeScale, videoDuration.timescale))
let fileManager = FileManager.default
let documentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
var outputURL = documentDirectory.appendingPathComponent("output")
do {
try fileManager.createDirectory(at: outputURL, withIntermediateDirectories: true, attributes: nil)
outputURL = outputURL.appendingPathComponent("\(String(describing: inputURL.lastPathComponent)).mp4")
} catch let error {
print(error)
}
try? fileManager.removeItem(at: outputURL)
guard let exporter = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetHighestQuality) else { return }
exporter.outputURL = outputURL
exporter.outputFileType = .mp4
exporter.exportAsynchronously {
switch exporter.status {
case .completed:
print("exported at \(outputURL)")
completion?(outputURL)
UISaveVideoAtPathToSavedPhotosAlbum(outputURL.path,nil, nil, nil)
case .failed:
print("failed \(exporter.error.debugDescription)")
case .cancelled:
print("cancelled \(exporter.error.debugDescription)")
default: break
}
}
我正在将视频的帧率更改为快进和快退视频,但是如何在 swift 中更改帧率后将视频保存到照片库中。
所以我通过以下代码解决了这个问题:
let videoAsset = AVAsset(url: inputURL as URL) as AVAsset
let clipVideoTrack = videoAsset.tracks(withMediaType: AVMediaType.video).first! as AVAssetTrack
let composition = AVMutableComposition()
let videoCompositions = composition.addMutableTrack(withMediaType: AVMediaType.video, preferredTrackID: CMPersistentTrackID())
do {
try videoCompositions?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: (videoAsset.tracks(withMediaType: AVMediaType.video).first)!, at: kCMTimeZero)
} catch {
print("handle insert error")
return
}
let videoDuration = videoAsset.duration
let finalTimeScale:Int64 = (Int64(float_t(videoDuration.value) / player.rate))
print("player rate is", player.rate)
videoCompositions?.scaleTimeRange(CMTimeRangeMake(kCMTimeZero, videoDuration), toDuration: CMTimeMake(finalTimeScale, videoDuration.timescale))
let fileManager = FileManager.default
let documentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
var outputURL = documentDirectory.appendingPathComponent("output")
do {
try fileManager.createDirectory(at: outputURL, withIntermediateDirectories: true, attributes: nil)
outputURL = outputURL.appendingPathComponent("\(String(describing: inputURL.lastPathComponent)).mp4")
} catch let error {
print(error)
}
try? fileManager.removeItem(at: outputURL)
guard let exporter = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetHighestQuality) else { return }
exporter.outputURL = outputURL
exporter.outputFileType = .mp4
exporter.exportAsynchronously {
switch exporter.status {
case .completed:
print("exported at \(outputURL)")
completion?(outputURL)
UISaveVideoAtPathToSavedPhotosAlbum(outputURL.path,nil, nil, nil)
case .failed:
print("failed \(exporter.error.debugDescription)")
case .cancelled:
print("cancelled \(exporter.error.debugDescription)")
default: break
}
}