Я создаю триммер и экспортер видео и хотел бы отобразить приблизительный размер выходного файла для видео на основе обрезанного временного диапазона и предустановленных значений экспорта. Исходное видео, с которым я тестирую, составляет ~ 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.