Покращення якості відео через AI у мобільних додатках
Покращення якості відео—принципово інша задача від покращення фото. Фото можна обробляти секундами: користувач почекає. Відео вимагає або реального часу (запис/стрімінг), або прийнятної швидкості постобробки (умовно: ролик 1 хвилина за 2–3 хвилини). Це диктує вибір моделі та архітектуру рішення.
Два режими—різні архітектури
Постобробка записаного відео—проходимо відеофайл кадр за кадром через декодер, обробляємо ML-моделлю, енкодуємо назад. Швидкість важлива, реального часу не потрібно.
Real-time покращення при записі або перегляді—суворий бюджет 33 мс на кадр при 30 fps. Складні моделі не влізуть. Потрібна компромісна якість.
Більшість клієнтських задач—перший режим: користувач записав старе відео або завантажив файл, натиснув «покращити».
Постобробка на iOS: AVAssetReader + Metal + Core ML
// Читаємо відео як послідовність CVPixelBuffer
let asset = AVAsset(url: videoURL)
let reader = try AVAssetReader(asset: asset)
let output = AVAssetReaderTrackOutput(
track: asset.tracks(withMediaType: .video).first!,
outputSettings: [kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange]
)
reader.add(output)
reader.startReading()
// Паралельно—writer для результату
let writer = try AVAssetWriter(outputURL: resultURL, fileType: .mp4)
let writerInput = AVAssetWriterInput(mediaType: .video, outputSettings: videoSettings)
let adaptor = AVAssetWriterInputPixelBufferAdaptor(assetWriterInput: writerInput, ...)
На кожному кадрі: конвертуємо YUV → RGB (Metal shader), прогоняємо через Core ML модель, конвертуємо RGB → YUV, пишемо у AVAssetWriter. Конвертація через Metal критична—на CPU це 15–20 мс на кадр лише на кольоровий простір.
Яка модель? Для денойзингу відео—RVRT або BasicVSR++ (temporal super resolution, враховують сусідні кадри). Але вони потребують батчу кадрів і на мобіль у оригіналі не йдуть. Компроміс—per-frame моделі типу Real-ESRGAN (ігнорують часову узгодженість, простіше у розгортанні) або легкі temporal-моделі з вікном 3–5 кадрів.
Temporal flickering—головна проблема per-frame підходу: сусідні кадри обробляються незалежно, деталі на стиках «миготять». Рішення—temporal consistency loss при fine-tuning або постобробка: усереднення активацій між сусідніми кадрами з вагою 0.1–0.2.
Android: MediaCodec + TFLite
// Використовуємо MediaCodec для декодування
val decoder = MediaCodec.createDecoderByType(format.getString(MediaFormat.KEY_MIME)!!)
decoder.configure(format, null, null, 0)
// Поверхня для декодування прямо у текстуру OpenGL
val surface = Surface(surfaceTexture)
decoder.configure(format, surface, null, 0)
decoder.start()
На Android декодування у Surface → обробка через OpenGL/Vulkan compute → назад через MediaCodec encoder. TFLite GPU Delegate працює з текстурами OpenGL прямо через setExternalContext(), що видаляє одну копію пам'яті на кадр.
Для Full HD (1920×1080) плиткова нарізка 256×256 дає ~48 плиток. При інференсі 15 мс/плитка—720 мс на кадр. Тобто постобробка хвилини відео (1800 кадрів) займе ~22 хвилини. Прийнятно для редактора, неприйнятно для quick-enhance. Для quick-enhance—легка модель (2–4 MB TFLite), без плиткування, з downscale на 540p для інференцу.
Real-time денойзинг при записі
Якщо потрібен real-time—працюємо зі зменшеним дозволом. Моделі, навчені на 360p/480p вході, дають результат швидко. На iPhone 14 Pro—ESRGAN x2 на 480p вході ~28 мс через ANE. Android Snapdragon 8 Gen 2—порівняно через GPU Delegate.
Для CameraX з користувацькою обробкою—ImageAnalysis use case з setBackpressureStrategy(STRATEGY_KEEP_ONLY_LATEST): не копимо чергу, якщо обробка не встигає.
Не ламемо аудіо
Відеоконвеєр обробляє лише відео-трек. Аудіо копіюється через AVAssetReaderTrackOutput / MediaExtractor без змін. Типова помилка—забути синхронізувати PTS (presentation timestamps) між аудіо та оброблювачем відео трека. AI-обробка не змінює тривалість кадрів, PTS з оригіналу переносимо один до одного.
Процес
Аналіз цільових сценаріїв (постобробка vs real-time), вибір моделі з вимірюванням на цільових пристроях, реалізація декодування/кодування через AVFoundation/MediaCodec, ML конвеєр з плиткуванням або без, тестування на граничних випадках—HDR відео, нестандартні дозволи, поворот.
Кошторис за часом
Постобробка на одній платформі з per-frame моделлю займає 3–5 тижнів. Обидві платформи з часовою узгодженістю та real-time режимом вимагають 8–14 тижнів.







