2015-03-11 2 views
0

Мне нужно сохранить все кадры из видео MPEG4 или H.264 в YUV-кадры с использованием библиотеки C++. Например, в формате .yuv, .y4m или .y. Затем мне нужно прочитать эти кадры, как цифровые файлы, и изменить некоторые образцы (значение Y). Как я могу это сделать без преобразования в RGB?API FFMPEG: декодирование кадров MPEG в YUV и изменение этих кадров

И как хранить значения AVFrame-> данных? Где хранятся Y-, U- и V-значения?

Спасибо и извините за мой английский =)

ответ

1

Если вы используете libav * для декодирования, вы получите кадры в своем родном цветовом (обычно YUV 420) Но это то, что когда-либо было выбрано во время кодирования. Предполагая, что вы в YUV420 или преобразовать в YUV420 y: AVFrame->data[0], u: AVFrame->data[1], v: AVFrame->data[2]

Для Y, 1 байт на пиксель AVFrame->data[0][(x*AVFrame->linesize[0]) + y] Для U и V его 4 байта на pixles (разрешение квартале Y плоскости). Таким образом, AVFrame->data[1][(x/2*AVFrame->linesize[1]) + y/2], AVFrame->data[2][(x/2*AVFrame->linesize[2]) + y/2]

+0

О, спасибо! И не могли бы вы рассказать мне смысл «lineize»? – Vaigard

+0

То есть, все образцы яркости хранятся в данных массива [0] последовательно от линии к строке? И обработка 'pFrame-> data [0] [y + pFrame-> width]' дает мне первый образец второй строки? – Vaigard

+0

Да, они сохраняются последовательно. Нет 'y + pFrame-> width' не даст вам вторую строку. 'y + pFrame-> linesize [0]' will. Размер строки (также называемый шаг) - это количество байтов на строку. Это может быть больше (но не меньше) этой ширины, если есть дополнение. см. здесь https://msdn.microsoft.com/en-us/library/windows/desktop/aa473780%28v=vs.85%29.aspx – szatmary

Смежные вопросы