使用LibVlc解决视频播放中的部分问题

使用LibVlc解决视频播放中的部分问题

标签(空格分隔): libvlc


简介libvlc

vlc是一个开源的、跨平台的视频播放器。VLC支持大量的音视频传输、封装和编码格式.详情可访问 http://www.videolan.org 了解。
libVLC :VLC核心模块,被广泛做为多媒体库进行二次封装和开发。

安装包

以前在Windows下使用libVLC 时都是直接到官网下VLC安装包,安装后目录下有个SDK文件夹。最近要用到新版的SDK,安装完最新VLC后没看到目录下有SDK文件夹。后来找了下,在另一个地方可以下载到。

下载地址:http://download.videolan.org/pub/videolan/vlc/

在这个地址可以下载到各个版本的VLC,点击进入某个版本,下载windows下7z格式压缩包,解压即可得到相应的SDK。

使用libvlc 解决自定义流播放问题

两个常用播流接口

  1. LIBVLC_API libvlc_media_t *libvlc_media_new_location(
    libvlc_instance_t *p_instance,
    const char * psz_mrl );
    常用于特定的给定媒体资源位置, 列如有效的URL,rtm,onvif等。

  2. LIBVLC_API libvlc_media_t *libvlc_media_new_path(
    libvlc_instance_t *p_instance,
    const char *path );
    常用于本地多媒体文件的播放。

  3. LIBVLC_API libvlc_media_t *libvlc_media_new_callbacks(
    libvlc_instance_t *instance,
    libvlc_media_open_cb open_cb,
    libvlc_media_read_cb read_cb,
    libvlc_media_seek_cb seek_cb,
    libvlc_media_close_cb close_cb,
    void *opaque );
    除上述俩种常见的播放方式外,安防行业一般会使用私有协议的自定义流。而对自定义流进行 解封装、解密等操作后,将处理后的流再次进行播放和控制是一个相对麻烦的处理过程。使用libvlc的对应接口 可以减少对应处理和控制流程,降低开发难度。
    里面的主要回调包含:
    typedef int (*libvlc_media_open_cb)(void *opaque, void **datap,
    uint64_t *sizep);
    typedef ssize_t (*libvlc_media_read_cb)(void *opaque, unsigned char *buf,
    size_t len);
    typedef int (*libvlc_media_seek_cb)(void *opaque, uint64_t offset);
    typedef void (*libvlc_media_close_cb)(void *opaque);

其中 当多路自定义流回放时候 opaque 可以用于区分或标识对应的自定义流。
自定义流播放的重点typedef ssize_t (*libvlc_media_read_cb)(void *opaque, unsigned char *buf,size_t len);
buf缓冲区的起始地址,用于将数据读入(相当于vlc 从这个buf里接收我们输入的自定义媒体内容)
len (buf的长度)

注意事项:
1.如果没有立即可用的数据,则回调应休眠。 例如 Sleep(20);
2.避免死锁情况。
3.特别是,如果播放停止,则回调应返回错误; return -1
如果不返回,则libvlc_media_player_stop()将永远不会返回

使用libvlc 解决流转文件存储问题

由于libvlc 并没直接封装录像接口,所以在解决流的文件存储问题时 我使用的是
利用libvlc_media_add_option 和vlc的命令结合的笨方式 解决流文件的存储问题。
QString parm = QString(":sout=#duplicate{dst=display,dst=std{access=file,mux=mp4,dst=%1}").arg(m_recordPath);
libvlc_media_add_option(vlc_media, parm.toStdString().c_str());

部分libvlc参数调优

libvlc_media_add_option(vlc_media, ":rtsp=tcp"); //连接方式
libvlc_media_add_option(vlc_media, ":codec=ffmpeg");
libvlc_media_add_option(vlc_media, ":avcodec-threads=1");
libvlc_media_add_option(vlc_media, ":avcodec-hw=any"); //硬件解码
libvlc_media_add_option(vlc_media, ":network-caching=200"); //缓存
libvlc_media_add_option(vlc_media, ":prefetch-buffer-size=1024");  //预装取缓冲大小512K
libvlc_media_add_option(vlc_media, ":prefetch-read-size=65535");   //预装取读取大小64K

你可能感兴趣的:(c++)