2017-07-14 26 views
1

次のプロジェクトを実行すると、デバイス上で編集済みのビデオが生成されます。オーディオファイルで次の実装を試してみました。ただし、ムービーとして実行するとエラーは発生しませんが、ムービーは生成され、ディレクトリには入りません https://github.com/Ryosuke-Hujisawa/My_AVAssetExportSession_AVMutableComposition-2私のavfoundationが動作しないのはなぜですか?

私のプロジェクトにはモデルがあります。モデルは以下です https://github.com/justinlevi/AVAssetExportSession_AVMutableComposition

私はオーディオファイルに成功しました。オーディオがトリムされ編集された状態のディレクトリにありました。私はビデオを編集したい。ビデオを編集することはできますが、編集してもエラーは発生しませんが、結果はディレクトリに存在しません。または、オーディオファイルの状態でディレクトリに存在し、アニメーションとして生成されません。私を助けてください。

import UIKit 
import AVFoundation 

class ViewController: UIViewController { 

    var asset: AVAsset? 

    @IBAction func exportBtnDidTap(_ sender: AnyObject) { 

    guard let asset = asset else { 
     return 
    } 

    createAudioFileFromAsset(asset) 
    } 


    override func viewDidLoad() { 
    super.viewDidLoad() 

    let videoAsset = AVURLAsset(url: Bundle.main.url(forResource: "sample", withExtension: "m4v")!) 

    let comp = AVMutableComposition() 

    let videoAssetSourceTrack = videoAsset.tracks(withMediaType: AVMediaTypeVideo).first! as AVAssetTrack 


    let videoCompositionTrack = comp.addMutableTrack(withMediaType: AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid) 

    do { 

     try videoCompositionTrack.insertTimeRange(
      CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(10, 600)), 
      of: videoAssetSourceTrack, 
      at: kCMTimeZero) 

    }catch { print(error) } 

    asset = comp 
    } 

    func deleteFile(_ filePath:URL) { 
    guard FileManager.default.fileExists(atPath: filePath.path) else { 
     return 
    } 

    do { 
     try FileManager.default.removeItem(atPath: filePath.path) 
    }catch{ 
     fatalError("Unable to delete file: \(error) : \(#function).") 
    } 
    } 

    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: AVAssetExportPresetAppleM4A){ 

     exportSession.canPerformMultiplePassesOverSourceMediaData = true 
     exportSession.outputURL = filePath 
     exportSession.timeRange = CMTimeRangeMake(kCMTimeZero, asset.duration) 
     exportSession.outputFileType = AVFileTypeAppleM4A 
     exportSession.exportAsynchronously { 
     _ in 
     print("finished: \(filePath) : \(exportSession.status.rawValue) ") 
     } 
    } 

    } 
} 
+0

私はexportSession.outputFileType = AVFileTypeAppleM4Aしてみてください - > exportSession.outputFileType = AVFileTypeAppleM4V – howmanylife

+0

が、これはERRある - >理由: '無効な出力ファイルタイプ' ***まずスローコールスタック: – howmanylife

+0

AVFileTypeMPEG4をお試しください? –

答えて

0

以下の実装でビデオをトリミングできます。また、更新githubの

import UIKit 
import AVFoundation 

class ViewController: UIViewController { 

    var asset: AVAsset? 

    @IBAction func exportBtnDidTap(_ sender: AnyObject) { 

    guard let asset = asset else { 
     return 
    } 

    createAudioFileFromAsset(asset) 
    } 


    override func viewDidLoad() { 
    super.viewDidLoad() 

    let videoAsset = AVURLAsset(url: Bundle.main.url(forResource: "sample", withExtension: "m4v")!) 

    let comp = AVMutableComposition() 

    let videoAssetSourceTrack = videoAsset.tracks(withMediaType: AVMediaTypeVideo).first! as AVAssetTrack 


    let videoCompositionTrack = comp.addMutableTrack(withMediaType: AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid) 

    do { 

     try videoCompositionTrack.insertTimeRange(
      CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(1, 600)), 
      of: videoAssetSourceTrack, 
      at: kCMTimeZero) 

    }catch { print(error) } 

    asset = comp 
    } 

    func deleteFile(_ filePath:URL) { 
    guard FileManager.default.fileExists(atPath: filePath.path) else { 
     return 
    } 

    do { 
     try FileManager.default.removeItem(atPath: filePath.path) 
    }catch{ 
     fatalError("Unable to delete file: \(error) : \(#function).") 
    } 
    } 

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

    } 
} 
関連する問題