Swiftで動画トリミングをする方法

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

}

 

参考

 

藤沢瞭介(Ryosuke Hujisawa)
  • りょすけと申します。18歳からプログラミングをはじめ、今はフロントエンドでReactを書いたり、AIの勉強を頑張っています。off.tokyoでは、ハイテクやガジェット、それからプログラミングに関する情報まで、エンジニアに役立つ情報を日々発信しています!

プログラミング