最简单的 libVLC 播放器
libVLC 非常的强大,利用它可以很容易地实现 VLC Media Player 中的任何功能,比如:快速播放媒体、从中提取元数据,甚至是提取单个视频帧 ......
由于 libVLC 是跨平台的,因此在编写程序时,应尽可能的兼容多个系统。除此之外,我们后续还会添加一些 GUI 交互。所以从本节开始,会逐渐引入 Qt(当然了,你也可以选择自己擅长的其他 GUI 框架)。
为了介绍 libVLC 的用法,我们从最简单的播放器开始着手,来播放一个本地媒体或者网络串流,同时也能了解它的主要工作流程。
1
基本配置
配置 libVLC 比较简单,只需要引入相关库和头文件的路径就行了。但是在后续的示例中,这部分配置会被频繁的使用,所以为了方便起见,可以将其定义到一个独立的 pri 文件中(例如:libVLC.pri):
# vlc 相关配置
win32 {
INCLUDEPATH += $$PWD/../vlc-3.0.8/sdk/include
LIBS += -L$$PWD/../vlc-3.0.8/sdk/lib -llibvlc -llibvlccore
} else {
INCLUDEPATH += /usr/local/include
LIBS += -L/usr/local/lib -lvlc -lvlccore
}
然后在使用时,只需要在 pro 文件中包含这个 pri 就可以了:
include($$PWD/../libVLC.pri)
2
工作流程
在使用 VLC API 之前,需要先将 vlc/vlc.h 头文件包含进来:
#include
#include
using namespace std;
int main()
{
// vlc 播放相关代码
return 0;
}
对于使用 libVLC 的程序来说,必须先通过 libvlc_new() 函数初始化一个 VLC 实例。
当然了,还需要创建一个媒体以及播放器,媒体分为两类:
本地媒体:由 libvlc_media_new_path() 创建,参数为本地媒体路径。
网络媒体:由 libvlc_media_new_location() 创建,网络流可以是 HTTP、RTSP 等。
const char * localMrl = "F:\\Videos\\Sample.mkv";
const char * rtspMrl = "http://ivi.bupt.edu.cn/hls/cctv6hd.m3u8";
libvlc_instance_t *instance;
libvlc_media_player_t *player;
libvlc_media_t *media;
// 创建并初始化 libvlc 实例
instance = libvlc_new(0, nullptr);
// 创建一个媒体
media = libvlc_media_new_path(instance, localMrl);
// media = libvlc_media_new_location(instance, rtspMrl);
// 创建一个媒体播放器
player = libvlc_media_player_new_from_media(media);
一旦准备就绪,就可以开始播放了:
libvlc_media_player_play(player);
但是这里有个问题,播放是异步的,因此要想办法等一会儿,否则程序很快就会退出:
waitPlaying(player);
注意:这里是等待播放结束(完整播放),你也可以使用 sleep() 等待若干秒。
最后,在程序结束之前,建议释放下 libVLC 的相关资源:
// 释放 media
libvlc_media_release(media);
// 释放 media player
libvlc_media_player_release(player);
// 释放 libvlc 实例
libvlc_release(instance);
切记,这是一个很好的习惯!
等待的具体实现如下,只要不出错、不结束,就一直等着吧:
void waitPlaying(libvlc_media_player_t *mp)
{
libvlc_state_t state;
do {
state = libvlc_media_player_get_state(mp);
} while (state != libvlc_Error && state != libvlc_Ended);
}
3
测试程序
运行程序,来看看效果吧:
看什么看,没想到你是这样的大熊兔 O(∩_∩)O哈哈~!
·END·