web-dev-qa-db-ja.com

iOSでUIImagePickerControllerからビデオを選択した後に圧縮を回避する方法

UIImagePickerControllerを使用してギャラリーからビデオを選択し、そのビデオを圧縮します。圧縮を無効にしたいのですが、これを行う方法が見つかりません。 ELCImagePickerControllerでもビデオを表示していますが、UIImagePickercontrollerに表示されるようなビデオアイコンや期間がないだけで画像のように見えます。どうすればよいですか?

ありがとう。

23
DeviPhone26

IOS 11では、プロパティvideoExportPresetAVAssetExportPresetPassthroughに設定して、オリジナルを取得できます。

if #available(iOS 11.0, *) {
    picker.videoExportPreset = AVAssetExportPresetPassthrough
}

「ビデオ圧縮...」ラベルが数ミリ秒間点滅した後、エクスポートが完了します。

@Diego Renau ほぼ正解でした。

22
Jan

UIImagePickerControllerを使用して圧縮を回避することは不可能のようです。この答えを参照してください:

https://stackoverflow.com/a/5893066/406152

imagePicker.videoQuality = UIImagePickerControllerQualityTypeHigh;を使用してみましたが、それでも圧縮されます。うーん。

編集:

ただし、自分でロールすることはできます。これにより、生のビデオファイルにアクセスできるようになります。

iOS 8

PHFetchResult *assetsFetchResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeVideo options:nil];
for (PHAsset *asset in assetsFetchResult) {
    PHVideoRequestOptions *videoRequestOptions = [[PHVideoRequestOptions alloc] init];
    videoRequestOptions.version = PHVideoRequestOptionsVersionOriginal;

    [[PHImageManager defaultManager] requestAVAssetForVideo:asset options:videoRequestOptions resultHandler:^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) {
        // the AVAsset object represents the original video file
    }];
}

コレクション(モーメント)およびその他のオプションにアクセスするには、PhotoKitのドキュメントを参照してください。

これがApple PhotoKitを使用してフォトピッカーになるように変更できるサンプルアプリです: https://developer.Apple.com/library/ios/samplecode/UsingPhotosFramework/ Introduction/Intro.html

これは、選択したすべての画像/ビデオのPHAssetオブジェクトを提供するため、有望に見えるPhotoKitを使用するGitHubのフォトピッカーライブラリです。 https://github.com/guillermomuntaner/GMImagePicker

iOS 7以下

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];

[library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
    if (group) {
        // If you want, you can filter just pictures or videos
        // I just need videos so I do this:
        [group setAssetsFilter:[ALAssetsFilter allVideos]];

        [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop){
            if (asset){
                // You can now add this ALAsset in your own video picker.
                // Note that you can only access the ALAsset as long as 
                // you maintain a reference to the ALAssetsLibrary

                // Or if you want to process the video, you can create an AVAsset:
                NSURL *url = asset.defaultRepresentation.url;
                AVAsset *videoAsset = [AVAsset assetWithURL:url];
            }
        }];
    }
} failureBlock:^(NSError *error) {
    NSLog(@"error enumerating AssetLibrary groups %@\n", error);
}];
19
jDutton

実際には、次のコードを使用して、元のビデオURL、非圧縮バージョンを取得できます。

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    NSString *mediaType = info[UIImagePickerControllerMediaType];
    NSString *videoString = (NSString *)kUTTypeVideo;
    NSString *movieString = (NSString *)kUTTypeMovie;

    if ([mediaType isEqualToString:videoString] || [mediaType isEqualToString:movieString]) {
        NSURL *videoRef = info[UIImagePickerControllerReferenceURL];
        PHFetchResult *refResult = [PHAsset fetchAssetsWithALAssetURLs:@[videoRef] options:nil];                                                                                                                                        
        PHVideoRequestOptions *videoRequestOptions = [[PHVideoRequestOptions alloc] init];
        videoRequestOptions.version = PHVideoRequestOptionsVersionOriginal;
        [[PHImageManager defaultManager] requestAVAssetForVideo:[refResult firstObject] options:videoRequestOptions resultHandler:^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) {
            if ([asset isKindOfClass:[AVURLAsset class]]) {
                  NSURL *originURL = [(AVURLAsset *)asset URL];
                  // Now you have the URL of the original video.
            }   
        }]; 
    }
}

注意として、requestAVAssetForVideo呼び出しは非同期であるため、メソッド呼び出しブロックの外部にブロックされた変数を使用してURLを格納する場合は注意が必要です。

7
Zhou Jason

IOS 11では、プロパティ「videoExportPreset」を使用できます。オリジナルではありませんが、少なくとも1280x720以上を取得できます...

if #available(iOS 11.0, *) {
         picker.videoExportPreset = AVAssetExportPreset1920x1080
} else {
            // Fallback on earlier versions 
}

//AVAssetExportPreset640x480
//AVAssetExportPreset960x540
//AVAssetExportPreset1280x720
//AVAssetExportPreset1920x1080
//AVAssetExportPreset3840x2160
3
Diego Renau