Избегайте сжатия видео при выборе фильма с помощью UIImagePickerController?
Я использую UIImagePickerController, чтобы разрешить моему пользователю выбирать видео из библиотеки ресурсов.
Когда пользователь выбирает кнопку "Выбрать" на втором экране, на дисплее отображается индикатор выполнения и сообщение "Сжатие видео...".
Почему это происходит?
Есть ли способ избежать этой операции сжатия?
Ответы
Ответ 1
Ответ: В настоящее время нет способа контролировать, как UIImagePickerController сжимает выбранное видео.
Я просто сделал несколько быстрых тестов. Используя тестовое приложение, которое я создал, я выбрал одно и то же видео два раза - один раз с свойством videoQuality
, установленным на UIImagePickerControllerQualityTypeHigh
, и один раз с ним установите значение UIImagePickerControllerQualityTypeLow
. Результирующие файлы, которые были скопированы, имеют точно такой же размер, 15.1MB с размером кадра 360x480. Оригинал был 72,5 МБ с размером кадра 480х640. По-видимому, это свойство не влияет на используемое сжатие.
Ответ 2
Установите свойство videoQuality UIImagePickerController на "Высокий" (UIImagePickerControllerQualityTypeHigh = 0)
Из документации SDK:
"Если вы показываете записанный фильм в подборщике изображений, указывается, что вы не хотите уменьшать качество видео в фильме".
http://developer.apple.com/iphone/library/documentation/uikit/reference/UIImagePickerController_Class/UIImagePickerController/UIImagePickerController.html#//apple_ref/doc/c_ref/UIImagePickerControllerQualityType
Ответ 3
Так как еще нет способа избежать сжатия с помощью UIImagePickerController, я хотел бы включить некоторые идеи о том, как вы можете создать свой собственный инструмент выбора изображений, который позволит избежать сжатия.
Это позволит получить доступ к необработанным видеофайлам:
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
Вот библиотека выбора фотографий на GitHub, которая использует PhotoKit, которая выглядит многообещающей, поскольку она дает вам объекты PHAsset для всех выбранных изображений/видео: 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);
}];
Ответ 4
Для тех, кто дает совет использовать свойство videoQuality, в документации четко указано, что это опция видеозахвата, а не опция выбора.
Как Джек упоминает об этом ниже, он также предназначен для перекодирования. Похоже, я быстро прочитал документ, потому что не заметил упоминания о перекодировке.
Ответ 5
Начиная с iOS 11, вы можете указать videoExportPreset
и установить для него значение AVAssetExportPresetPassthrough
:
picker.videoExportPreset = AVAssetExportPresetPassthrough
Это все еще покажет "сжатие" индикатор выполнения, но будет намного быстрее, особенно для небольших видео.