Избегать сжатия видео при выборе фильма с UIImagePickerController? - PullRequest
18 голосов
/ 01 июля 2010

Я использую UIImagePickerController, чтобы позволить моему пользователю выбирать видео из библиотеки активов.

Когда пользователь выбирает кнопку «Выбрать» на втором экране, в представлении отображается индикатор выполнения и «Сжатие видео ... "сообщение.

Почему это происходит?

Есть ли способ избежать этой операции сжатия?

Ответы [ 5 ]

16 голосов
/ 05 мая 2011

Ответ: В настоящее время нет способа контролировать, как UIImagePickerController сжимает выбранное видео.

Я только что провел несколько быстрых тестов.Используя созданное мной тестовое приложение, я выбрал одно и то же видео два раза - один раз со свойством videoQuality, установленным на UIImagePickerControllerQualityTypeHigh, и один раз с установленным на UIImagePickerControllerQualityTypeLow.Полученные файлы, которые были скопированы, имеют точно такой же размер, 15,1 МБ, с размером кадра 360x480.Оригинал был 72.5MB с размером кадра 480x640.Очевидно, это свойство не влияет на используемое сжатие вообще.

4 голосов
/ 26 июля 2010

Установите для свойства 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 голосов
/ 23 ноября 2015

Поскольку пока нет способа избежать сжатия с помощью 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);
}];
1 голос
/ 24 января 2019

Начиная с iOS 11, вы можете указать videoExportPreset и установить его на AVAssetExportPresetPassthrough:

picker.videoExportPreset = AVAssetExportPresetPassthrough

Это все равно покажет «сжатие» индикатора выполнения, но будет намного быстрее, особенно для небольших видео.

0 голосов
/ 07 ноября 2014

Для тех, кто дает советы по использованию свойства videoQuality, в документации четко указано, что это опция захвата видео, а не опция выбора.это также для транскодирования.Похоже, я слишком быстро прочитал документ, потому что не заметил упоминания о перекодировке.

...