在我以前的实际项目中,曾利用 libvlc 去解码音视频媒体数据(如 RTSP、本地文件 等),通过其提供的回调函数接口,攫取 RGB图像 进行图像分析,如 人脸识别、运动检测 等一类的产品应用。除此之外,只要提供适当的 MRL,配合选项参数,VLC 还可以进行屏幕录制、摄像头图像采集、麦克风音频采集 等功能。
我在网上参看过很多人提供的示例源码,实现流程都很初潜,只适合当作学习的 Demo 来看,与实际的项目应用还有很多问题要解决。为此,在这里公开我封装 libvlc 的 C++ 类,方便TA人吧!
一、获取源码
1. 下载地址
2. 编译提醒
这个测试程序,是使用 QtCreator 写的 Qt 界面程序,调用我封装好的 vlc_mgrabber_t 类实现了一个简单的播放器。MFC的我也写过相应的测试程序,这里就不重复提供代码了。
因 libvlc 库相关的 dll 文件太多、太大,上传不易,所以在完成编译后,需要另外将 libvlc 的 dll 拷贝至 exe 程序目录中才能运行,我使用的 libvlc 版本是 vlc-3.0.7.1 版,下面是下载地址:
拿到下载后的压缩文件,解压出来,将 libvlc.dll、libvlccore.dll 和 plugins 整个目录 这几个拷贝到 exe 程序目录即可。另外,有一点需要特别提醒,压缩包中的 sdk 目录 是我们开发时需要用到的头文件和链接文件。
3. 测试程序截图
二、如何使用
使用 vlc_mgrabber_t 很简单,我们只需实现主要的 视频回调、音频回调、事件回调 三个接口,然后调用其基本操作接口进行 打开、关闭 操作,就可完成基本的工作流程。下面,我逐个说明这些接口的调用方式。
1. 基本操作流程
主要操作接口的声明如下:
class vlc_mgrabber_t
{
......
public:
/**********************************************************/
/**
* @brief Startup the libvlc.
*/
static x_int32_t startup(x_int32_t xit_argc, const x_char_t * const * xct_argv;
/**********************************************************/
/**
* @brief Cleanup the libvlc.
*/
static x_void_t cleanup(void);
public:
/**********************************************************/
/**
* @brief 设置回调接口。
*
* @param [in ] xfunc_vptr : 视频图像的回调函数接口。
* @param [in ] xfunc_aptr : 音频数据的回调函数接口。
* @param [in ] xfunc_eptr : 操作事件的回调函数接口。
* @param [in ] xpvt_context : 回调的用户上下文描述信息。
*/
inline x_void_t set_callback(xfunc_video_cbk_t xfunc_vptr,
xfunc_audio_cbk_t xfunc_aptr,
xfunc_event_cbk_t xfunc_eptr,
x_pvoid_t xpvt_context)
{
m_xfunc_video_cbk = xfunc_vptr;
m_xfunc_audio_cbk = xfunc_aptr;
m_xfunc_event_cbk = xfunc_eptr;
m_xpvt_xfunc_ctxt = xpvt_context;
}
/**********************************************************/
/**
* @brief 打开工作流程(操作前请先调用 set_callback() 设置好回调参数)。
*
* @param [in ] xht_instance : 关联的 libvlc 实例句柄(若为 X_NULL,则取全局的实例句柄)。
* @param [in ] xszt_media_file : 音视频文件路径名。
* @param [in ] xszt_options : 附加的参数选项(使用 " :" (空格+':')进行分隔的字符串集,为 X_NULL 时,则忽略)。
* @param [in ] xut_video_nbits : 视频回调操作时的 RGB 图像位数(24 或 32)。
*
* @return x_int32_t
* - 成功,返回 0;
* - 失败,返回 错误码。
*/
x_int32_t open(x_handle_t xht_instance,
x_cstring_t xszt_media_file,
x_cstring_t xszt_options,
x_uint32_t xut_video_nbits);
/**********************************************************/
/**
* @brief 关闭工作流程。
*/
x_void_t close(void);
......
public:
......
/**
* Set movie position as percentage between 0.0 and 1.0.
* This has no effect if playback is not enabled.
* This might not work depending on the underlying input format and protocol.
*
* \param xft_pos the position
*/
x_void_t set_position(x_float_t xft_pos);
......
/**
* Set mute status.
*
* \param xbt_status If status is X_TRUE then mute, otherwise unmute
* \warning This function does not always work. If there are no active audio
* playback stream, the mute status might not be available. If digital
* pass-through (S/PDIF, HDMI...) is in use, muting may be unapplicable. Also
* some audio output plugins do not support muting at all.
* \note To force silent playback, disable all audio tracks. This is more
* efficient and reliable t