13

AVPlayer と AVPlayerLayer を使用して再生するには、AVAsset オブジェクトを使用する必要があります。AssetsLibrary が非推奨になったため、Photos フレームワークを使い始めました。これで、PHAsset オブジェクトの配列があり、それらを AVAsset に変換する必要があるところまで来ました。PHFetchResult を列挙し、PHAsset のローカライズされた説明を使用して新しい AVAsset を割り当てようとしましたが、再生してもビデオが表示されないようです。

    PHAssetCollection *assetColl = [self scaryVideosAlbum];

    PHFetchResult *getVideos = [PHAsset fetchAssetsInAssetCollection:assetColl options:nil];

    [getVideos enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) {
            NSURL *videoUrl = [NSURL URLWithString:asset.localizedDescription];
            AVAsset *avasset = [AVAsset assetWithURL:videoUrl];
            [tempArr addObject:avasset];
    }];

ローカライズされた説明は、動画の絶対 URL ではないと思います。

PHImageManager と requestAVAssetForVideo にも出くわしましたが、ビデオに関しては、オプション パラメータには isSynchrounous プロパティがありません。これは、画像オプション パラメータの場合です。

        PHVideoRequestOptions *option = [PHVideoRequestOptions new];
        [[PHImageManager defaultManager] requestAVAssetForVideo:videoAsset options:option resultHandler:^(AVAsset * _Nullable avasset, AVAudioMix * _Nullable audioMix, NSDictionary * _Nullable info) {

これを行う同期方法はありますか?

ありがとう。

4

6 に答える 6

6

Swift 2の場合、PHAsset以下の方法を使用して簡単にビデオを再生できます。

インポートファイル

import AVKit

PHAsset から

static func playVideo (view:UIViewController, asset:PHAsset) {

        guard (asset.mediaType == PHAssetMediaType.Video)

            else {
                print("Not a valid video media type")
                return
        }

        PHCachingImageManager().requestAVAssetForVideo(asset, options: nil, resultHandler: {(asset: AVAsset?, audioMix: AVAudioMix?, info: [NSObject : AnyObject]?) in

            let asset = asset as! AVURLAsset

            dispatch_async(dispatch_get_main_queue(), {

                let player = AVPlayer(URL: asset.URL)
                let playerViewController = AVPlayerViewController()
                playerViewController.player = player
                view.presentViewController(playerViewController, animated: true) {
                    playerViewController.player!.play()
                }
            })
        })
    }
于 2016-09-20T21:26:22.013 に答える
0

このトリックを試すことができますが、AVAsset に変換したいファセットが 3 つ、4 つ、または 5 つある場合に便利です。

    [[PHImageManager defaultManager] requestAVAssetForVideo:assetsArray[0] options:option resultHandler:^(AVAsset * avasset, AVAudioMix * audioMix, NSDictionary * info) {
//do something with this asset
       [[PHImageManager defaultManager] requestAVAssetForVideo:assetsArray[1] options:option resultHandler:^(AVAsset * avasset, AVAudioMix * audioMix, NSDictionary * info) {
//so on...
       }
        }

したがって、基本的には、1 つのファセットを AVAsset に変換したときに、このメソッドを再度呼び出すことができます。これは効率的なコードではないかもしれませんが、ほとんどの目的で禁止されるべきではありません。

于 2016-08-29T07:51:33.747 に答える