UIImagePickerControllerを使用してギャラリーからビデオを選択し、そのビデオを圧縮します。圧縮を無効にしたいのですが、これを行う方法が見つかりません。 ELCImagePickerControllerでもビデオを表示していますが、UIImagePickercontrollerに表示されるようなビデオアイコンや期間がないだけで画像のように見えます。どうすればよいですか?
ありがとう。
IOS 11では、プロパティvideoExportPreset
をAVAssetExportPresetPassthrough
に設定して、オリジナルを取得できます。
if #available(iOS 11.0, *) {
picker.videoExportPreset = AVAssetExportPresetPassthrough
}
「ビデオ圧縮...」ラベルが数ミリ秒間点滅した後、エクスポートが完了します。
@Diego Renau ほぼ正解でした。
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);
}];
実際には、次のコードを使用して、元のビデオ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を格納する場合は注意が必要です。
IOS 11では、プロパティ「videoExportPreset」を使用できます。オリジナルではありませんが、少なくとも1280x720以上を取得できます...
if #available(iOS 11.0, *) {
picker.videoExportPreset = AVAssetExportPreset1920x1080
} else {
// Fallback on earlier versions
}
//AVAssetExportPreset640x480
//AVAssetExportPreset960x540
//AVAssetExportPreset1280x720
//AVAssetExportPreset1920x1080
//AVAssetExportPreset3840x2160