使用libVLC作为视频解码器

Using libVLC as a video decoder

本文关键字:视频解码 解码器 视频 libVLC 使用      更新时间:2023-10-16

我正在尝试使用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

然而,我留下了以下问题:

  1. 有没有更直接的方法来初始化媒体播放器而不开始播放除了调用libvlc_media_player_play然后libvlc_media_player_pause ?
  2. 所有get函数(fps, length, width, height)都返回零。我是否需要做一些事情,比如读取第一帧来获得这些值,如果是这样,我怎么知道我解码的帧缓冲区必须有多大?

来自VLC开发人员:

  1. 常规的播放系统真的不适合无节奏解码。你需要使用流输出,目前还没有可编程的API。

  2. get调用返回零,因为您需要等待直到轨道创建。