Я пытаюсь использовать libVLC в качестве видеодекодера для проекта обнаружения движения. Ранее я использовал библиотеки ffmpeg, но некоторые проблемы с файлами Matroska привели меня сюда. Наряду с воспроизведением видео с правильной скоростью, я также хочу иметь возможность получать один кадр за другим с максимальной скоростью, с которой может справиться моя система, поскольку, как только пользователь устанавливает некоторые параметры, я хочу, чтобы алгоритм обнаружения движения выполнялся через видео так быстро, как может. Мой код установки libVLC выглядит следующим образом (обработка ошибок и незначительные детали опущены для краткости):
const char* vlc_argv[] =
{
"--no-audio", /* skip any audio track */
};
libvlc_instance_t* inst = libvlc_new(sizeof(vlc_argv) / sizeof(*vlc_argv), vlc_argv);
auto media = libvlc_media_new_path (inst, filename.c_str());
player = libvlc_media_player_new_from_media(media);
libvlc_media_release(media);
// Needed to initialize the player ?
libvlc_media_player_play(player);
libvlc_media_player_pause(player);
fps = libvlc_media_player_get_fps(player);
length = libvlc_media_player_get_length(player);
width = libvlc_video_get_width(player);
height = libvlc_video_get_height(player);
// TODO: Add libvlc_video_set_callbacks to set up callbacks to render to memory buffer
Однако у меня остались следующие вопросы:
libvlc_media_player_play
затем libvlc_media_player_pause
?get
функции (fps, length, width, height
) все возвращают ноль. Нужно ли делать что-то вроде чтения первого кадра, чтобы получить эти значения, и если да, то как я должен знать, насколько большим должен быть мой буфер декодированных кадров?Обычная система воспроизведения действительно не предназначена для декодирования без разметки. Вам нужно будет использовать потоковый вывод, для которого еще нет программируемого API.
get
звонки возвращают ноль, потому что вам нужно подождать, пока дорожки не будут созданы.
Других решений пока нет …