Уменьшение размера видео, экспортируемого с помощью AVAssetExportSession — iOS Swift

В настоящее время я экспортирую видео следующим образом:

   let exporter = AVAssetExportSession.init(asset: mixComposition, presetName: AVAssetExportPreset1280x720)
   exporter?.outputURL = outputPath
   exporter?.outputFileType = AVFileType.mp4
   exporter?.shouldOptimizeForNetworkUse = true
   exporter?.videoComposition = mainCompositionInst

15-секундное видео потребляет около 20 МБ данных. По сравнению с видео Snapchat размером 2 МБ это число кажется совершенно неприемлемым.

Я уже снизил качество сеанса экспорта и захвата (1280x720).

Видео снято на специальную камеру. UIImagePickerController не используется.

AVAssetExportSession используется с настройками по умолчанию.

Можно ли как-нибудь уменьшить размер моих видео? Большое спасибо!

EDIT 1: я пытался использовать эту библиотеку: https://cocoapods.org/pods/NextLevelSessionExporter

К сожалению, это создает проблемы с размером и удаляет мой звук:

// Creating exporter
    let exporter = NextLevelSessionExporter(withAsset: mixComposition)
    exporter.outputURL = outputPath
    exporter.outputFileType = AVFileType.mp4
    exporter.videoComposition = mainCompositionInst

    let compressionDict: [String: Any] = [
        AVVideoAverageBitRateKey: NSNumber(integerLiteral: 2500000),
        AVVideoProfileLevelKey: AVVideoProfileLevelH264BaselineAutoLevel as String,
        ]

        exporter.videoOutputConfiguration = [
            AVVideoCodecKey: AVVideoCodecType.h264,
            AVVideoWidthKey: NSNumber(integerLiteral: 1280),
            AVVideoHeightKey: NSNumber(integerLiteral: 720),
            AVVideoScalingModeKey: AVVideoScalingModeResizeAspectFill,
            AVVideoCompressionPropertiesKey: compressionDict
        ]

        exporter.audioOutputConfiguration = [
            AVFormatIDKey: kAudioFormatMPEG4AAC,
            AVEncoderBitRateKey: NSNumber(integerLiteral: 128000),
            AVNumberOfChannelsKey: NSNumber(integerLiteral: 2),
            AVSampleRateKey: NSNumber(value: Float(44100))
        ]

введите здесь описание изображения


person thelearner    schedule 28.05.2018    source источник
comment
Не дубликат, контекст другой. Я использую AVAssetExportSession здесь.   -  person thelearner    schedule 28.05.2018
comment
Вы пробовали другие предустановленные параметры экспорта - например. AVAssetExportPresetMediumQuality ?   -  person Evgeny Karkan    schedule 31.05.2018
comment
@EvgenyKarkan Да, но качество неприемлемо плохое.   -  person thelearner    schedule 31.05.2018
comment
@holex AVAssetExportSession используется с настройками по умолчанию. - Спасибо за ваш токсичный комментарий.   -  person thelearner    schedule 02.06.2018
comment
@dfi, комментарий был совсем не ядовитым, друг мой, настройки по умолчанию дают вам большое видео размером 20 МБ, вы ожидаете какого-то случайного чуда или что? измените спецификации, и вы можете получить другой размер вывода. кусок пирога... но вам может понадобиться определить, какую потерю качества видео вы готовы принять, чтобы получить меньший результат, без этого ваш пост не имеет никакого смысла, я боятся.   -  person holex    schedule 02.06.2018
comment
@holex Вот почему я задаю этот вопрос .. (???). Я не нахожу никаких ссылок на это и не знаю, как я могу эффективно настроить параметры.   -  person thelearner    schedule 02.06.2018
comment
@dfi, поскольку вам все еще нужно определить, какую потерю качества видео вы можете принять, чтобы получить все еще приличный результат, после этого легко найти эффективный настройки для создания такого вывода... пока вы не сможете определить убыток, вы также не сможете найти настройку эффективного — и никто другой не сможет найти для вас. Я надеюсь, вы понимаете причинно-следственную связь здесь...? Например: устраивает ли вас 1 кадр/с вашего видео? нет? какой минимальный FPS вам нужен? 60? или нужно 240 для слоумо? ну ты обречен. не могли бы вы принять 12 FPS, может быть? тогда может быть что-то и т.д... если вы видите поток здесь.   -  person holex    schedule 02.06.2018
comment
@dfi Эта проблема связана с этой проблемой: stackoverflow.com/questions/50700076/< /а>   -  person thelearner    schedule 16.06.2018
comment
@thelearner, эй, чувак, я в той же ситуации, что и ты. У тебя есть ссылка на GitHub с кодом, который ты использовал, чтобы заставить это работать? Я использую AVExportSession, и 15-секундное видео HighestQuality составляет 27 МБ, MediumQuality — 1 МБ, но выглядит ужасно. Любая помощь будет оценена   -  person Lance Samaria    schedule 08.07.2020


Ответы (2)


Чтобы уменьшить размер файла, попробуйте эти свойства для настройки кодека HEVC (используйте какао-бобы NextLevelSessionExporter):

let compressionDict: [String: Any] = [
AVVideoAverageBitRateKey: NSNumber(integerLiteral: 2500000), //lower it if you wish
AVVideoProfileLevelKey: AVVideoProfileLevelH264BaselineAutoLevel as String,
]
exporter.videoOutputConfiguration = [
    AVVideoCodecKey : AVVideoCodecType.hevc,
    AVVideoWidthKey : NSNumber(integerLiteral: 1280),
    AVVideoHeightKey: NSNumber(integerLiteral: 720),
    AVVideoScalingModeKey: AVVideoScalingModeResizeAspectFill,
    AVVideoCompressionPropertiesKey: compressionDict
]

Вам необходимо перейти на macOS High Sierra и iOS 11, чтобы использовать видеокодек HEVC. Но если по какой-то причине вы не можете использовать HEVC, используйте обычный H.264 с более низким битрейтом.

AVVideoCodecKey : AVVideoCodecType.h264:

введите здесь описание изображения

Кроме того, посмотрите на этот сообщение SO о битрейте видео в iOS.

person Andy Fedoroff    schedule 01.06.2018
comment
прежде всего, большое спасибо за помощь мне! Ваш ответ уменьшил размер с 20 МБ до потрясающих 4 МБ. Я люблю тебя, чувак!. Вы не знаете, как долго я исследовал, чтобы добиться этого. - Ты мой герой. Я не мог использовать HEVC, поэтому использовал h264, как вы предложили. БОЛЬШОЕ СПАСИБО! - person thelearner; 02.06.2018
comment
Привет, Энди! После нескольких дней суеты мне наконец удалось решить мою проблему. В iOS 11 есть активная ошибка, которая вызывает проблемы с размером зеркального видео. Я зеркально отразил видео вручную, и теперь оно работает отлично. Благослови вас за вашу помощь! - person thelearner; 16.06.2018
comment
Я получаю NextLevelSessionExporter, запись не удалась, Error Domain=AVFoundationErrorDomain Code=-11800 \Операция не может быть завершена\ UserInfo={NSLocalizedFailureReason=Произошла неизвестная ошибка (-12780), NSLocalizedDescription=Операция не может быть завершена, NSUnderlyingError=0x282fb4570 {Error Domain=NSOSStatusErrorDomain Code=-12780 \(null)\}} все время... кто-нибудь сталкивался с этой проблемой - person christijk; 21.11.2018
comment
Я не знаю почему. Я пробовал это в Xcode 9, все работало нормально. - person Andy Fedoroff; 21.11.2018
comment
Я выбираю видеофайл с помощью UIImagePickerController и создаю AVURLAsset - person christijk; 21.11.2018
comment
Я полагаю, вы должны спросить dfi об этом. Может он видел похожую ошибку. - person Andy Fedoroff; 21.11.2018
comment
Для HEVC профиль должен быть установлен на kVTProfileLevel_HEVC_Main_AutoLevel из VideoToolbox фреймворка, нашел этот комментарий в AVVideoSettings.h: /* HEVC profiles/levels are defined in VideoToolbox/VTCompressionProperties.h, e.g. kVTProfileLevel_HEVC_Main_AutoLevel. The constants defined there can be used as the value for the key AVVideoProfileLevelKey. */ - person Moshe Gottlieb; 07.01.2019
comment
Большое спасибо @MosheGottlieb, я исправлю. - person Andy Fedoroff; 07.01.2019

взломал это наконец.

Используйте 1_

10 МБ — это жестко закодированное число. Используйте в соответствии с требуемым битрейтом.

fileLengthLimit /* Указывает длину файла, которую не должен превышать вывод сеанса. В зависимости от содержимого исходного ресурса выходной файл может немного превышать предел длины файла. Длина выходного файла должна быть проверена, если вы требуете соблюдения строгого ограничения перед использованием вывода. См. также maxDuration и timeRange. */

person Lalit Kumar    schedule 25.07.2019