Войти
видео плеерСтатьи

Рендеринг видео картинки

Автор:

Вывод видео на экран

После того, как я определился со средой разработки и движком декодирования видео и аудио передо мной встал важный вопрос, а как собственно заставить картинку выводиться на экран? Для этого есть 2 способа:

Способ первый:
В состав API LibVLC есть функция libvlc_media_player_set_hwnd(hWnd). Что она делает вы уже, наверное, догадались! Данная функция заменяет стандартный хэндл окна на пользовательский, куда будет выводиться видео. И все бы хорошо, но есть маленькая проблемка, как пото поверх этого окна выводить анимацию и полупрозрачные элементы? Погуглив в интернете, я нашел много статей по этому поводу, большинство которых сводилось к созданию второго окна(transcluent) и отрисовкой на нем элементов. Однако такой способ я счел излишне сложным, запутанным и в конечном счете неправильным...

Способ второй:
В состав библиотеки LibVLC входит плагин VMem. Основная его задача - рендерить видео картинку в память. В API есть функция (libvlc_video_set_callbacks) по установке callbacks functions которые будут вызываться при рендеринге картинки и будут передавать указатель на участок памяти, куда будет сохраняться картинка.Более подробно о том, какие параметры принимает данная функция можно прочитать на здесь. Получив картинку ее можно выводить на экран спросите вы? Как бы не так. Существует небольшая проблемка, связанная с данным модулем VMem. Перед тем как вызвать функцию проигрывания, следует установить ширину, высоту а также pitch(размер строки в байтах) изображения в памяти. Но до тех пор, пока видео не начало проигрываться мы не знаем истинного размера потока. А потом, во время проигрывания видео мы не можем сказать этому модулю, что размер картинки изменился. Вот картинка, поясняющая данную проблему:

Работа модуля VMem-2 | Рендеринг видео картинки

Рис.1. Работа модуля VMem


Замкнутый круг? Да, так и есть и чтобы разорвать его, мне пришлось подправить исходники LibVLC, а точнее его модуля VMem. Более подробно о том как был скомпилен VLC и что пришлось переписать будет рассказано в следующей статье.

#DirectX, #VLC

16 ноября 2010 (Обновление: 17 ноя. 2010)

Комментарии [6]