Отображение кадров YUV/RGB в окне FFPLAY

Я интегрировал собственный декодер в FFMPEG framework. Выход этого декодера - кадры YUV420, которые при необходимости я могу преобразовать в кадры RGB24.

Эти кадры генерируются в одной из моих пользовательских функций. Итак, что нужно сделать, чтобы отобразить эти кадры в FFPLAY окне? Есть ли какой-то определенный синтаксис или процедура?

Я действительно новичок в FFPLAY и достаточно искал эту тему в сети, но не нашел ничего, связанного с этой проблемой. Если кто-то может дать какие-либо ответы или предложения по этому поводу, это будет очень полезно для меня.

Заранее спасибо.

--С уважением


person Zax    schedule 20.11.2013    source источник
comment
Вы пытаетесь воспроизвести файл или ввод по каналу? Если файл, пожалуйста, предоставьте краткий образец. Вы используете кли-инструмент ffplay или программно?   -  person llogan    schedule 20.11.2013
comment
Если вы написали новый декодер для FFmpeg, который изначально выводит YUV 4:2:0, то FFplay просто сможет воспроизводить видео без каких-либо изменений. Вы уверены, что передаете цветовое пространство от вашего декодера к основному движку?   -  person Multimedia Mike    schedule 22.11.2013
comment
@MultimediaMike: Спасибо за ответ. Я ждал такого ответа. Да, я в своем собственном коде, т.е. C-коде, я могу сгенерировать кадр YUV 420. Однако, как я уже сказал вам, я действительно новичок в этом ffplay, у меня теперь есть идея относительно того, как передать цветовое пространство от моего декодера к основному движку. Любой документ или любая статья, которая может дать мне представление об этом, пожалуйста, опубликуйте ее в качестве ответа здесь, и я приму ее. --Жду твоего ответа.   -  person Zax    schedule 22.11.2013


Ответы (1)


Я немного заржавел в взломе кодеков для FFmpeg, но я только что проверил последний исходный код git и предполагаю, что вы работаете с той же копией. Кроме того, я предполагаю, что вы вставили свой декодер вместе с остальными кодеками в каталог libavcodec/ и что при сборке программы и запуске ffmpeg -formats вы увидите упоминание вашего нового декодера.

Если все это правда, то я предполагаю, что ваш модуль декодера экспортирует функцию init(), которая ожидает получить указатель на функцию AVCodecContext. Эта структура данных имеет элемент с именем pix_fmt, и в случае вашего декодера для него должно быть установлено значение AV_PIX_FMT_YUV420P, чтобы указать планарный YUV 4:2:0.

Если это не сработает, попробуйте использовать инструмент ffmpeg для декодирования файла в нулевую цель, просто чтобы проверить, что ваш декодер что-то делает:

ffmpeg -i yourfile.ext -f null /dev/null

Измените свой вопрос с выводом этой команды, чтобы дать нам дополнительные подсказки.

person Multimedia Mike    schedule 22.11.2013
comment
Спасибо за этот ответ. У меня есть декодер с инициализацией, но я не указал переменную пикселя fmt. Когда я получаю команду ffmpeg --decoders, я вижу имя своего декодера в списке. Но не должен ли я сопоставить этот выходной кадр с чем-то вроде кадра SDL (потому что ffplay использует библиотеки SDL)? И, как я уже сказал, кадр YUV генерируется не в том же потоке, что и другой декодер. Не могли бы вы пролить свет на этот вопрос? (я имею в виду отображение SDL) - person Zax; 22.11.2013
comment
Декодеру видео не нужно знать слой вывода видео. Декодер должен просто декодировать в наиболее эффективный пиксельный формат (планарный YUV 4:2:0), передать кадр обратно в движок, и пусть движок сам решит, что с ним делать. Результатом может быть окно SDL, или окно X11, или поверхность OpenGL, или файл на диске. Другими словами: базовое видео H.264 (найдите файл MP4) должно воспроизводиться с помощью ffplay. Видеодекодер H.264 выводит планарные данные YUV 4:2:0, а затем передает их обратно в модуль, который затем отправляет их в SDL. Так же должен вести себя и ваш декодер. - person Multimedia Mike; 22.11.2013
comment
Это просто потрясающе... Объяснение, которое вы только что предоставили. Большое спасибо :-) - person Zax; 22.11.2013