0 / 0 / 0
Регистрация: 22.02.2018
Сообщений: 25
|
||||||
1 | ||||||
Перевод изображения из AVFrame в массив RGBQUAD02.05.2018, 13:02. Показов 3005. Ответов 5
Метки нет (Все метки)
Здравствуйте!
Пишу программу для вывода видео на FFMpeg и столкнулся с следующей проблемой. При декодировании кадров видео я получаю кадры неопределённого формата в виде структур AVFrame. Поскольку вывод планируется в заранее созданное графическое окно, я хочу преобразовать каждый из этих кадров в массив RGBQUAD и вывести через DIBSection. Но как это сделать, используя стандартный набор библиотек FFMpeg?
0
|
02.05.2018, 13:02 | |
Ответы с готовыми решениями:
5
Перевод изображения в массив и обратно Перевод изображения в массив чисел Чтение RGBQUAD Подготовка AVFrame к записи |
2707 / 862 / 325
Регистрация: 10.02.2018
Сообщений: 2,042
|
|
02.05.2018, 16:47 | 2 |
Формат данных, которые получаются после декодирования зависит от кодека. Разные кодеки заточены под работу с разными форматами пикселя. Для mpeg-ов это обычно планарные YUV (AV_PIX_FMT_YUV420P или AV_PIX_FMT_YUV422P). В общем случае для определения формата нужно смотреть значение
AVCodecContext::pix_fmt или AVFrame::format .То, что вы называете RGBQUAD в спецификации ffmpeg именуется не планарным RGB, возможно AV_PIX_FMT_ARGB, AV_PIX_FMT_RGBA или что-то подобное. Вам нужно произвести конвертацию картинки из одного формата в другой. Для этих целей в ffmpeg есть функция sws_scale. Она занимается сразу двумя вещами: переводом формата пикселя и масштабированием. Если требуется только что-то одно, то всё равно нужно использовать её. Поищите примеры использования данной функции.
1
|
0 / 0 / 0
Регистрация: 22.02.2018
Сообщений: 25
|
|
02.05.2018, 18:20 [ТС] | 3 |
Спасибо за интформацию про функцию sws_scale. Но всё равно встаёт вопрос: как выводить конвертированное изображение в графическое окно, если функция sws_scale сохраняет обработанное изображение в структуру AVFrame, а как получить из неё массив RGBQUAD - непонятно.
0
|
2707 / 862 / 325
Регистрация: 10.02.2018
Сообщений: 2,042
|
|
02.05.2018, 19:20 | 4 |
Сообщение было отмечено Mad_Programmer как решение
Решение
А я не очень понимаю, что не понятно вам...
Если речь идёт о выводе средствами WinApi, то структура DIB секции аналогична структуре битов непланарной RGB картинки в ffmeg. Возможно, что единственное отличие будет в количестве байт для выравнивания строк. Берёте буфер картинки из AVFrame и используете его как биты для отрисовки в функции SetDIBitsToDevice, например. AVFrame::data[0] - буфер картинки, указатель на первый пиксель первой строки. AVFrame::linesize[0] - размер строки в байтах с учётом выравнивания. Кликните здесь для просмотра всего текста
Код
Width (pixels) |<--------------------------------------------------->| | | | pixel 1 pixel 2 pixel W | align | |<------------->|<------------->| |<------------->|<------->| | | | | | | +---+---+---+---+---+---+---+---+ +---+---+---+---+---------+------- line 1 | R | G | B | A | R | G | B | A | ... | R | G | B | A | /// | | +---+---+---+---+---+---+---+---+ +---+---+---+---+---------+ | line 2 | R | G | B | A | R | G | B | A | ... | R | G | B | A | /// | | +---+---+---+---+---+---+---+---+ +---+---+---+---+---------+ | Height (lines) ... | +---+---+---+---+---+---+---+---+ +---+---+---+---+---------+ | line H | R | G | B | A | R | G | B | A | ... | R | G | B | A | /// | | +---+---+---+---+---+---+---+---+ +---+---+---+---+---------+------- | | | | | linesize (bytes) | |<------------------------------------------------------------->| PS Про код из первого сообщения. Если это реальный код вашей программы, то он работать не будет. В функцию декомпресии должен подаваться реальный пакет с прочитанными данными (packet), а не пустой свежесозданный (p_avpkt).
0
|
0 / 0 / 0
Регистрация: 22.02.2018
Сообщений: 25
|
|
02.05.2018, 19:41 [ТС] | 5 |
Спасибо за замечание, а то я не мог понять что у меня с кадром не так и почему sws_scale говорит, что неправильно заданы указатели на исходное изображение.
0
|
0 / 0 / 0
Регистрация: 22.02.2018
Сообщений: 25
|
||||||
05.05.2018, 21:13 [ТС] | 6 | |||||
Ну вот, получился такой код:
0
|
05.05.2018, 21:13 | |
05.05.2018, 21:13 | |
Помогаю со студенческими работами здесь
6
Ffmpeg сохранить AVFrame в .bmp или .jpg Перевод изображения в монохромное Перевод изображения в текст Перевод изображения в спектр Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |