Вывод из AVAssetWriter (UIImages, записанных в видео) искажен
Я использую AVAssetWriter для кодирования серии изображений в файл фильма, следуя ответу Зула здесь: Как экспортировать массив UIImage в виде фильма?,
Короче мой процесс:
- создать UIImage из.png файла
- Получить CGImage из UIImage
- преобразовать CGImage в CVPixelBuffer (точно используя функцию zoul pixelBufferFromCGImage)
- записать кадры в.mov, используя AVAssetWriterInputPixelBufferAdaptor и AVAssetWriter
В большинстве случаев это работает нормально, однако иногда закодированный файл.mov искажается (см. Рисунок ниже). Мне было интересно, знаком ли этот тип вывода искаженного изображения кому-либо, и если есть какие-то шаги, которые я мог бы предпринять в кодировании кадров, которые могли бы вызвать это. Проблема возникает именно тогда, когда используемые мной исходные изображения генерируются вызовами из Titanium в ImageView.toBlob(). Помимо титановой стороны, любые намеки на то, как может выглядеть этот тип результата, были бы отличными!
Спасибо Александр
Экран из фильма: http://tinypic.com/view.php?pic=8wkqys&s=7
Исходное изображение: http://commons.wikimedia.org/wiki/File:Phalaenopsis_(aka).jpg
2 ответа
Хорошо, это оказалось проблемой с соотношением сторон изображений, которые я читал, в отличие от соотношения сторон PixelBuffer, который я создавал. Сделал их равными, и это прекрасно работает.
Пожалуйста, посмотрите на эту ссылку. Это говорит, что ширина должна быть кратна 16.
Просто получите size.width, вычислите ближайшее число, кратное 16. И жестко запишите его вместо size.width.
Оно работает:)
Старый поток, но другой ответ, вместо умножения на число я использую CVPixelBufferGetBytesPerRow, чтобы получить фактические байты на строку для CGBitmapContextCreate, и он исправил искажение, оставив высоту / ширину такой же