【问题标题】:Saving avplayer video after changing frame rate swift快速更改帧速率后保存avplayer视频
【发布时间】:2019-01-26 10:42:20
【问题描述】:

我正在将视频的帧速率更改为快进和快退视频,但是如何在快速更改帧速率后将视频保存到照片库中。

【问题讨论】:

  • but how can I save the video to the library - 什么库?请更具体。
  • @George_E_2 照片库,我想了解在执行速率更改后如何将视频保存到照片库。

标签: swift xcode avfoundation avplayer frame-rate


【解决方案1】:

所以我通过以下代码解决了这个问题:

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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 2020-05-27
    • 2019-02-15
    • 2017-10-28
    • 1970-01-01
    相关资源
    最近更新 更多