2016-05-01 19 views
3

AVPlayerでスローモーションビデオ(ユーザーのiPhoneで撮影)を再生しようとしています。AVPlayerでslow-mo AVAssetを再生する問題

私はピッカーからPHAsset上の要求にAVAssetを取得しています:

[manager requestAVAssetForVideo:PHAsset 
          options:videoRequestOptions 
        resultHandler:^(AVAsset * avasset, AVAudioMix * audioMix, NSDictionary * info) {}]; 

それが果たした後、問題がある、私はこのエラーを取得する:しかし

-[AVComposition URL]: unrecognized selector sent to instance 0x138d17f40 

、私が設定している場合このオプションはマネージャの要求では、通常の速度のビデオとして120/240fpsで再生され、クラッシュは発生しません。

何が起こっていますか?デフォルトのversionプロパティは、スローモーション、ユーザー編集、トリムなどを組み込んだPHVideoRequestOptionsVersionCurrentです。

私はそのビデオ版を再生したいと思います。ありがとう

+0

これを修正できましたか?私は、ライブラリからそれを取り上げるのではなく、ゆっくりとしたモーションビデオを録音しています。ライブラリに保存すると、okとslow moが動作します。私のアプリでAVPLayerの中で見ると遅くなってしまいます。 – Nil

答えて

5

したがって、スローモーションビデオはAVCompositionとして渡されます。

ビデオファイル/ URLにエクスポートして、他のビデオと同様に扱うことができます。ここ

ソリューション:迅速な答えを探してここに来る人のためにhttps://overflow.buffer.com/2016/02/29/slow-motion-video-ios/

//Output URL 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = paths.firstObject; 
NSString *myPathDocs = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"mergeSlowMoVideo-%d.mov",arc4random() % 1000]]; 
NSURL *url = [NSURL fileURLWithPath:myPathDocs]; 

//Begin slow mo video export 
AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetHighestQuality]; 
exporter.outputURL = url; 
exporter.outputFileType = AVFileTypeQuickTimeMovie; 
exporter.shouldOptimizeForNetworkUse = YES; 

[exporter exportAsynchronouslyWithCompletionHandler:^{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     if (exporter.status == AVAssetExportSessionStatusCompleted) { 
      NSURL *URL = exporter.outputURL; 
      NSData *videoData = [NSData dataWithContentsOfURL:URL]; 

      // Upload 
      [self uploadSelectedVideo:video data:videoData]; 
     } 
    }); 
}]; 
+0

このソリューションをありがとうございます、しかし私はいくつかの追加の質問があります。 AVPlayerViewControllerでビデオを再生するために上記のコードを使用します。しかし、私が "player.currentItem.currentTime.value"を呼び出すと、それは不思議な動作をします。私は、Photosアプリからビデオに入り、ビデオ全体をスローモーション、またはノーマルモーションにすると、安定した動作を得ることができることを知るのに十分な時間を過ごしました。奇妙な動作が始まるのは、標準的なiPhoneのデフォルト(スローモーションでは動画が表示されないところで、最初と最後に短いセグメントを作る)だけです。どのようにこれを唯一のスローモーションとして保存するか考えていますか? – Ibdakine

+0

これは、写真ライブラリから選択する場合です。スローモーションビデオを録画してアップロードしたいのですが? https://stackoverflow.com/questions/47514282/ios-avplayer-cant-play-240-fps-video – Nil

0

が、これは私がスローモーションのビデオのURLにする必要がある、私は私のプロジェクトで使用迅速な翻訳を、ありますAVPlayerViewControllerと再生してください:

else if asset is AVComposition { 
//Slow-Motion Assets are passed as AVComposition 
let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) 
let documentsDirectory: NSString? = paths.first as NSString? 
if documentsDirectory != nil { 
    let random = Int(arc4random() % 1000) 
    let pathToAppend = String(format: "mergeSlowMoVideo-%d.mov", random) 
    let myPathDocs = documentsDirectory!.strings(byAppendingPaths: [pathToAppend]) 
    let myPath = myPathDocs.first 
    if myPath != nil { 
     let url = URL(fileURLWithPath: myPath!) 
     let exporter = AVAssetExportSession(asset: asset!, presetName: AVAssetExportPresetHighestQuality) 
     if exporter != nil { 
     exporter!.outputURL = url 
     exporter!.outputFileType = AVFileTypeQuickTimeMovie 
     exporter!.shouldOptimizeForNetworkUse = true 
     exporter!.exportAsynchronously(completionHandler: { 
      AsyncUtil.asyncMain { 
       let url = exporter!.outputURL 
       if url != nil { 
        let player = AVPlayer(url: url!) 
        let playerViewController = AVPlayerViewController() 
        playerViewController.player = player 
        playerViewController.modalTransitionStyle = .crossDissolve 
        view.present(playerViewController, animated: true) { 
         playerViewController.player!.play() 
        } 
       } 
      } 
     }) 
    } 
} 
関連する問題