使用libVLC作为视频解码器

时间:2013-05-05 00:28:11

标签: c++ c decode libvlc

我正在尝试将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)都返回零。我是否需要做一些事情,比如读取第一帧以获取这些值,如果是这样,我怎么知道我的解码帧缓冲区必须有多大?

1 个答案:

答案 0 :(得分:3)

From a VLC developer

  1. 常规播放系统实际上并不适用于无空间解码。您需要使用流输出,目前尚无可编程API。

  2. get次调用返回零,因为您需要等到创建曲目。