URLの動画を保存する Swift3

環境

  • Swift
  • Swift3.0
  • swift3
  • Xcode
  • Xcode8
  • avfoundation
  • AVFoundation

説明

アプリを起動したらそのままurlで定義された動画がmacの中のドキュメントフォルダに保存される

実装

//
//  ViewController.swift
//  video-edit
//
//  Created by ryosuke-hujisawa on 2017/10/04.
//  Copyright © 2017年 ryosuke-hujisawa. All rights reserved.
//

import UIKit
import AVFoundation

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // 動画のurlを定義する
        let url = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
        // 動画URLからアセットを生成
        let videoAsset: AVURLAsset = AVURLAsset(url: url!, options: nil)
        // アセットからトラックを取得
        let videoTrack: AVAssetTrack = videoAsset.tracks(withMediaType: AVMediaType.video)[0]
        let audioTrack: AVAssetTrack = videoAsset.tracks(withMediaType: AVMediaType.audio)[0]
        // ベースとなる動画のコンポジション作成
        let mainComposition : AVMutableComposition = AVMutableComposition()
        // コンポジションのトラック作成
        let compositionVideoTrack: AVMutableCompositionTrack = mainComposition.addMutableTrack(withMediaType: AVMediaType.video, preferredTrackID: kCMPersistentTrackID_Invalid)!
        let compositionAudioTrack: AVMutableCompositionTrack = mainComposition.addMutableTrack(withMediaType: AVMediaType.audio, preferredTrackID: kCMPersistentTrackID_Invalid)!
        // コンポジションの設定
        try! compositionVideoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: videoTrack, at: kCMTimeZero)
        try! compositionAudioTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: audioTrack, at: kCMTimeZero)
        // 動画のコンポジションをベースにAVAssetExportを生成
        let assetExport = AVAssetExportSession.init(asset: mainComposition, presetName: AVAssetExportPresetMediumQuality)
        // 生成された動画を保存する場所のurlとファイルの名前を設定(今回はmacの中のDocumentsディレクトリに保存)
        let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as URL
        let filePath = documentsDirectory.appendingPathComponent("rendered-audio.m4v")
        // エクスポートファイルのビデオタイプの設定
        assetExport?.outputFileType = AVFileType.mov
        //出力されるurlの設定
        assetExport?.outputURL = filePath
        assetExport?.shouldOptimizeForNetworkUse = true
        assetExport?.exportAsynchronously {

            print("finished: \(filePath) :  \(String(describing: assetExport?.status.rawValue)) ")
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}