3

我正在尝试将 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除了调用then之外,有没有更直接的方法来初始化媒体播放器而不开始播放libvlc_media_player_pause
  2. 所有get函数 ( fps, length, width, height) 都返回零。我是否需要做一些事情,比如读取第一帧来获取这些值,如果是这样,我应该怎么知道我的解码帧缓冲区必须有多大?
4

1 回答 1

3

来自 VLC 开发人员

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

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

于 2013-07-02T15:10:50.817 回答