多媒体播放器构建-VlcQT的使用(Mac版)

2021-02-14  本文已影响0人  要厉害的

前言:本文章将介绍如何在Mac上使用QT和VlcQT库构建流媒体播放器。通过本文讲解可一步步实现可用的流媒体播放器。

作为架构师如何让技术能力不越来越生疏?《软件架构基础》一书给出了几点建议,其中一点:

... is to do frequent proof of concepts or POCs.

经常去做一些概念性的验证。刚好最近有个项目上需要自建C端的流媒体播放客户端,这里基于VlcQT库进行POC,加速整个团队对于项目的评估和执行进度。

环境:操作系统为macOS High Sierra,QT的版本是5.14.1,QT Creator4.11.1,Vlc版本为3.0.11.1,VlcQT版本为1.2.0。

一、QT

1、安装

mac上面安装QT非常简单,官网下载页面找到合适的版本下载按照步骤安装即可,这里就不再赘述了。

注:这里下载的是QT Creator综合开发环境,里面会包含QT的基础组件。

2、什么是QT?

QT能够提供了众多的可定制可视化组件(对话框、活动条、菜单等等),构建图形化程序(GUI,graphical user interface)相对快捷。

QT具有良好的可移植性,Windows、Linux和Mac上都可以将原先的代码移植过去重新构建运行。QT可以使用C++开发,目前也有pyQT,支持用Python语言开发。同时QT提供了丰富的功能库,比如Qt封装的OpenGL对于2D和3D开发的支持,比如Qt MultiMedia对于多媒体的支持。

如果有一定的C++基础,QT的开发非常友好。QT Creator 上的示例大概有100-200个,看看例子基本上就能学个大概。主要的学习点在于信号和槽机制、各种功能库、UI设计(Qt Designer)、QML(移动端,脚本编程)四个方面。

QT欢迎界面

面对客户的一些使用偏好(不喜欢使用B/S架构)、功能、性能需求,很多C端的GUI程序是基于QT开发。

3、什么是QT Creator?

QT Creator是集成了QT的综合开发环境(IDE)。可进行项目管理、GUI设计、文本编辑、编译构建等开发活动。

二、libVLC

VlcQT库基于libVLC库实现,libVlC可以在应用程序中使用提供多媒体播放的能力。大名鼎鼎的VLC便是基于该库实现的,即VLC能够提供的能力可以通过该库都实现。libVLC由C语言实现。

1、安装

安装VLC即可安装libVLC组件,在Mac上使用brew安装即可:

brew install vlc

libVLC提供libvlc.dylib  libvlccore.dylib两个Mac环境下的动态链接库。这些库在VlcQT运行时需要的依赖。

2、libVLC

整个VLC软件的层级架构如下所示。上层的应用(VLC是多媒体播放软件,VLMC是非线性视频创作软件。)基于libVLC开发。libVLC又基于libVLCcore实现,而libVLCcore是由众多模块组成。众多模块来自于ffmpeg和live555的构件,这部分需要熟悉流媒体处理过程:

- Demuxer 解复用,把合在一起的音频和视频信息分离。

- Mux 封装复用,将音视频信息混合进入一个文件,可方便传输。

- Decoder 解码,对音视频信息进行解码。

- Vout 视频输出

- Aout 音频输出

- Ogg 一种音频压缩标准,提供函数库

- x264 基于H264等的视频编解码

- Theora 视频压缩编码器

。。。。。。

VlC软件架构示意


三、安装VlcQT库

VlcQT库向QT开发环境集成了VLC的多媒体播放能力。该库在QT官方的marketplace也有出现。

这里采用源码编译的方式安装环境。先用git将仓库拉到本地,在命令行里运行命令:

 git clone git://github.com/vlc-qt/vlc-qt.git

 git submodule init

 git submodule update

之后,进行编译安装。Mac上需要安装CMake。然后进入源码目录利用cmake命令创建Makefile然后编译安装。一通操作命令如下:

export PATH=$PATH:/<your path to QT>/clang_64/bin

mkdir build

make prepare

cmake ..

make -j8

make install

该过程主要会生成和安装VLCQtCore、VLCQtWidgets、VLCQtQml相关的头文件和动态库。这些头文件和动态库会在案例编译的时候使用。

四、案例使用

官方的用例代码运行起来花了点时间。主要是VlcQT的头文件路径和动态库的配置。

1、下载源码

可以在github上面下载VlcQT实现的简单播放器的例子。

2、导入QT工程

打开QT Creator将Simpler Player的工程导入。导入的工程含QT的工程文件.pro,项目的头文件和cpp文件。

simpler-player的工程结构

3、修改.pro文件

需要根据具体的路径修改QT工程文件的路径。LIBS指向具体的库路径,INCLUDEPATH寻找头文件。

src.pro中修改内容

注:当在这些路径中找不到头文件和库文件的时候可以拷贝.h和.dylib文件至指定路径。

4、运行时出现的问题

正常情况下,工程已经能够编译成功。运行时可能会出现问题。

dyld: Library not loaded @rpath/VLCQtCore.framework/Versions/1.2.0/VLCQtCore

Referenced from: XXXX 

Reason: image not found

程序异常结束。 

该问题是Mac的可执行文件在运行的时候找不到能够加载的动态库。根本原因是生成的执行文件内动态路径库出现了错误。错误的两个库分别是VLCQtCore和VLCQtWidgts。

一种方式是通过otool -L 命令查看可执行文件的内引用的各项动态库链接。之后使用install_name_tool 修改可执行文件的动态库地址。

应该还有一种方式让@rpath生效,由于时间原因,暂时没有去尝试。

install_name_tool使用的例子:

install_name_tool -change <用otool -L查出来的错误地址>  <正确的地址> <所修改的程序>

install_name_tool -change

@rpath/VLCQtCore.framework/Versions/1.2.0/VLCQtCore

/usr/local/lib/VLCQtCore.framework/Versions/1.2.0/VLCQtCore

/<path to simple-player>/simple-player

我在这个环节卡了很久,最终参考这篇文章完成修改,运行成功。

Simpler-player运行并播放成功

五、VlcQT分析

VlcQT库的使用可以参考官方在线文档,描述还是比较清楚,几个主要的类:

VlcInstance 提供Vlc的句柄,用来操作VlcQT库,比如查看Vlc库的版本。

VlcMedia 可以播放的媒体,可以是本地或远程的媒体信息。

VlcMediaPlayer 是最基础的媒体播放器,提供了播放功能。

VlcMediaPlayer::setVideoWidget设置视频播放的关联控件。VlcMediaPlayer::open打开媒体文件或者流。VlcMediaPlayer::stop停止播放多媒体。

VlcWidgetVideo 提供视频播放和鼠标控制的组件。

VlcWidgetVolumeSilder 提供可视化音量控制和展示的组件。

VlcWidgetSeek 提供时间整体和已播放时间(elapsed time)的组件。

后记

VlcQT库自2017年已经很久没有更新过了,不是很确定是否可以在实际项目中稳定运行。这样的库最怕遇到问题,因为社区不活跃所以很多事情问不来,都要自己解决。

实现视频播放器还有几个参考方案:

1、Qt+opencv+播放流的路径,不过这种方式不支持音频。据一些文章描述使用openCV,CPU会占用很满。

2、Qt原生QMediaPlayer,具体没看,可能只能支持http的地址。而且依赖平台自身的播放器。比如Linux上依赖gstreamer等。

3、QtAV这是国人发起的一个基于QT和ffmpeg的音视频播放框架,用C++实现。目前还在git上面维护,并且有2.7K的🌟,加入了ffmpeg项目,应该是个相当不错的开源框架了。过段时间有机会一定试用一下。

上一篇下一篇

猜你喜欢

热点阅读