Вывод из 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

Phalaenopsis_ (он же

2 ответа

Решение

Хорошо, это оказалось проблемой с соотношением сторон изображений, которые я читал, в отличие от соотношения сторон PixelBuffer, который я создавал. Сделал их равными, и это прекрасно работает.

Пожалуйста, посмотрите на эту ссылку. Это говорит, что ширина должна быть кратна 16.

Просто получите size.width, вычислите ближайшее число, кратное 16. И жестко запишите его вместо size.width.

Оно работает:)

Старый поток, но другой ответ, вместо умножения на число я использую CVPixelBufferGetBytesPerRow, чтобы получить фактические байты на строку для CGBitmapContextCreate, и он исправил искажение, оставив высоту / ширину такой же

Другие вопросы по тегам