swiftで動画トリミングをする方法
既存の動画ファイル(音声+映像)から映像と音声をそれぞれ抜き出し一つの新しい動画として生成しています。映像と音声は、意図的にそれぞれ別に抜き出しているのではなく、そうせざるを得ないのでそうしています。汎用性はありませんが、映像と音声をそれぞれ抜き出せることは自由自在に音声と映像を組み替えられるというメリットがあります。
swiftで動画トリミングをする実装
import UIKit import AVFoundation class ViewController: UIViewController { var asset: AVAsset? override func viewDidLoad() { super.viewDidLoad() let videoAsset = AVURLAsset(url: Bundle.main.url(forResource: "BabyImSorry", withExtension: "m4v")!) let audioAsset1 = AVURLAsset(url: Bundle.main.url(forResource: "BabyImSorry", withExtension: "m4v")!) let comp = AVMutableComposition() let videoAssetSourceTrack = videoAsset.tracks(withMediaType: AVMediaTypeVideo).first! as AVAssetTrack let videoCompositionTrack = comp.addMutableTrack(withMediaType: AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid) let audioAssetSourceTrack1 = audioAsset1.tracks(withMediaType: AVMediaTypeAudio).first! as AVAssetTrack let audioCompositionTrack = comp.addMutableTrack(withMediaType: AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid) do { try videoCompositionTrack.insertTimeRange( CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(15, 600)), of: videoAssetSourceTrack, at: kCMTimeZero) try audioCompositionTrack.insertTimeRange( CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(15, 600)), of: audioAssetSourceTrack1, at: kCMTimeZero) }catch { print(error) } asset = comp } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func createAudioFileFromAsset(_ asset: AVAsset){ let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as URL let filePath = documentsDirectory.appendingPathComponent("rendered-audio.m4v") //deleteFile(filePath) if let exportSession = AVAssetExportSession(asset: asset, presetName: AVAssetExportPreset640x480){ exportSession.canPerformMultiplePassesOverSourceMediaData = true exportSession.outputURL = filePath exportSession.timeRange = CMTimeRangeMake(kCMTimeZero, asset.duration) exportSession.outputFileType = AVFileTypeQuickTimeMovie exportSession.exportAsynchronously { _ in print("finished: \(filePath) : \(exportSession.status.rawValue) ") } } } @IBAction func saveVideo(_ sender: Any) { guard let asset = asset else { return } createAudioFileFromAsset(asset) } }
参考