UIImagePickerControllerを使用して、ユーザーがアセットライブラリからビデオを選択できるようにしています。
ユーザーが2番目の画面で[選択]ボタンを選択すると、ビューに進行状況バーと[ビデオの圧縮...]メッセージが表示されます。
なぜこうなった?
この圧縮操作を回避する方法はありますか?
UIImagePickerControllerを使用して、ユーザーがアセットライブラリからビデオを選択できるようにしています。
ユーザーが2番目の画面で[選択]ボタンを選択すると、ビューに進行状況バーと[ビデオの圧縮...]メッセージが表示されます。
なぜこうなった?
この圧縮操作を回避する方法はありますか?
回答:現在、UIImagePickerControllerが選択したビデオを圧縮する方法を制御する方法はありません。
簡単なテストをいくつか行いました。作成したテストアプリを使用して、同じ動画を2回選択しました。1回はvideoQuality
プロパティをに設定しUIImagePickerControllerQualityTypeHigh
、もう1回はに設定しましたUIImagePickerControllerQualityTypeLow
。コピーされた結果のファイルはまったく同じサイズで、フレームサイズは360x480で15.1MBです。オリジナルは72.5MBで、フレームサイズは480x640でした。どうやら、このプロパティは使用される圧縮にはまったく影響しません。
UIImagePickerControllerのvideoQualityプロパティを「High」に設定します(UIImagePickerControllerQualityTypeHigh = 0 )
SDKドキュメントから:「録画したムービーをイメージピッカーに表示する場合は、ムービーのビデオ品質を低下させたくないことを指定します。」
UIImagePickerController を使用して圧縮を回避する方法はまだないため、圧縮を回避する独自の画像ピッカーを作成する方法についていくつかのアイデアを含めたいと思いました。
これにより、未加工のビデオ ファイルへのアクセスが許可されます。
iOS8
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 のドキュメントを参照してください。
以下は、フォト ピッカーに変更できる PhotoKit を使用した Apple のサンプル アプリです。
これは、選択したすべての画像/ビデオの PHAsset オブジェクトを提供するため、有望に見える PhotoKit を使用する GitHub の写真ピッカー ライブラリです: https://github.com/guillermomuntaner/GMImagePicker
iOS7以下
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);
}];