Как записать видеокадры YUV 420 из данных RGB, используя OpenCV или другую библиотеку обработки изображений? - PullRequest
3 голосов
/ 26 марта 2012

У меня есть массив данных rgb, сгенерированных из glReadPixels ().
Обратите внимание, что данные RGB упакованы в пикселях (r1, g1, b1, r2, g2, b2, ...).

Как быстро записать видеокадр YUV с помощью OpenCV или другой библиотеки C ++, чтобы я мог передавать их в FFMPEG?Преобразование RGB-пикселя в YUV-пиксель не является проблемой, так как в Интернете доступно множество формул преобразования.Однако написание фрейма YUV является для меня главной проблемой.Я пытался написать видеокадр YUV с последних нескольких дней, но мне это не удалось.

Это один из моих других вопросов о написании кадра YUV и проблемах, с которыми я столкнулся: Проблема с записью кадра изображения YUV в C / C ++ Я не знаю, что не так с моимТекущий подход в записи кадра YUV в файл.

Так что сейчас я могу использовать существующую библиотеку (если таковая имеется), которая принимает данные RGB, конвертировать их в YUV и записывать кадр YUV непосредственно вфайл или трубу.Конечно, было бы намного лучше, если бы я мог исправить свою существующую программу для написания фрейма YUV, но вы знаете, что есть также крайний срок в каждом проекте разработки программного обеспечения, поэтому время также является приоритетом для меня и членов моей проектной команды.

Ответы [ 3 ]

2 голосов
/ 26 марта 2012

FFmpeg с радостью примет данные RGB. Вы можете увидеть, какие форматы пикселей поддерживает FFmpeg, запустив:

ffmpeg -pix_fmts

Любая запись с I в первом столбце может использоваться в качестве ввода.

Поскольку вы не указали глубину пикселя в битах, я предполагаю, что она 8-битная и использует формат пикселя rgb8. Таким образом, чтобы заставить FFmpeg считывать данные rgb8 из stdin, вы должны использовать следующую команду (я cat вводю данные, но вы будете передавать их через канал):

cat data.rgb | ffmpeg -f rawvideo -pix_fmt rgb8 -s WIDTHxHEIGHT -i pipe:0 output.mov

Поскольку это необработанный пиксельный формат без кадрирования, вам необходимо разделить WIDTH и HEIGHT для соответствующих значений размеров изображения, чтобы FFmpeg знал, как кадрировать данные.

Я указал выход в виде файла MOV, но вам необходимо соответствующим образом настроить выход FFmpeg / Red5.

0 голосов
/ 26 марта 2012

ffmpeg запишет AVI-файл с YUV, но, как говорит Карл, в openCV его нет прямой поддержки.

В качестве альтернативы (и, возможно, проще) вы можете просто записать необработанные значения UYVY в файл и затем использовать ffmpeg, чтобы преобразовать его в AVI / MP4 в любом формате, который вы хотите. Также возможно писать прямо в канал и вызывать ffmpeg прямо из вашего приложения, избегая временного файла yuv

например. преобразовать поток HD yuv422 в файл MP2 h264 со скоростью 30 кадров в секунду

ffmpeg -pix_fmt yuyv422 -s 1920x1080 -i input.yuv -vcodec libx264 -x264opts -r 30 output.mp4

0 голосов
/ 26 марта 2012

OpenCV напрямую не поддерживает формат YUV, как вы знаете, поэтому вам действительно нужно найти способ сделать RGB <-> YUV преобразования.

Это очень интересный пост , поскольку он показывает , как загружать и создавать кадры YUV на диске , сохраняя при этом данные как IplImage.

...