Точный способ оценить размер выходного видео из AVAssetExportSession - PullRequest
0 голосов
/ 11 апреля 2020

Я создаю триммер и экспортер видео и хотел бы отобразить приблизительный размер выходного файла для видео на основе обрезанного временного диапазона и предустановленных значений экспорта. Исходное видео, с которым я тестирую, составляет ~ 31 МБ.

Предустановки AVAssetExportPresetLowQuality и AVAssetExportPresetMediumQuality оценивают довольно точно. Они сообщают о предполагаемом размере выходного файла, равном 1,6 МБ и 7,8 МБ соответственно, и фактические экспортируемые видео в основном имеют такой размер.

Однако все другие допустимые предустановленные качества экспорта крайне неточны. Например, AVAssetExportPresetHighestQuality экспортируется с исходным размером файла 31 МБ, но оценивается в 257 МБ. Даже не близко.

Кто-нибудь имеет представление о том, почему эти значения так далеко? Вот мой пример кода экспорта, а также примерный и фактический размеры файлов.

let presets = [
    AVAssetExportPresetLowQuality,
    AVAssetExportPresetMediumQuality,
    AVAssetExportPresetHighestQuality,
    AVAssetExportPreset640x480,
    AVAssetExportPreset960x540,
    AVAssetExportPreset1280x720,
    AVAssetExportPreset1920x1080
]

let formatter = ByteCountFormatter()
formatter.allowedUnits = [.useMB, .useKB]

let url = Bundle.main.url(forResource: "big_buck_bunny", withExtension: "mp4")!
let asset = AVURLAsset(url: url)

for preset in presets {
    let session = AVAssetExportSession(asset: asset, presetName: preset)!

    let output = (NSTemporaryDirectory() as NSString).appendingPathComponent(preset + ".mp4")
    session.timeRange = CMTimeRange(start: .zero, end: asset.duration)
    session.outputURL = URL(fileURLWithPath: output)
    session.outputFileType = .mp4
    session.shouldOptimizeForNetworkUse = true

    print("Estimated size for \(preset): \(formatter.string(fromByteCount: Int64(session.estimatedOutputFileLength)))")

    session.exportAsynchronously {
        print(session.outputURL)
    }
}

Сообщенные приблизительные размеры вывода:

Estimated size for AVAssetExportPresetLowQuality: 1.6 MB
Estimated size for AVAssetExportPresetMediumQuality: 7.8 MB
Estimated size for AVAssetExportPresetHighestQuality: 257.6 MB
Estimated size for AVAssetExportPreset640x480: 37 MB
Estimated size for AVAssetExportPreset960x540: 54.9 MB
Estimated size for AVAssetExportPreset1280x720: 109.7 MB
Estimated size for AVAssetExportPreset1920x1080: 155.6 MB

Фактические размеры вывода:

Actual size for AVAssetExportPresetLowQuality: 1.6 MB
Actual size for AVAssetExportPresetMediumQuality: 7.8 MB
Actual size for AVAssetExportPresetHighestQuality: 30.7 MB
Actual size for AVAssetExportPreset640x480: 27 MB
Actual size for AVAssetExportPreset960x540: 51.5 MB
Actual size for AVAssetExportPreset1280x720: 100.8 MB
Actual size for AVAssetExportPreset1920x1080: 30.7 MB

Кроме того, странно, что 960x540 и 1280x720 экспортируются в размере, превышающем оригинал, который имеет разрешение 1920x1080.

...