基于QT的视频播放器

项目的需要播放rtsp视频流,因此选择开源的ffmpeg作为解码开发包,并且要使用QT开发。照例,在开始之前先去GitHub上看一看有没有比较成熟的封装,果然找到了几个比较好用的。经过测试,它们都能解码rtsp视频流,但是画面的显示效果差别比较大,可能是因为不熟悉这些sdk的使用,写的demo太简单,没有加入正确的优化吧。下面依次简单介绍一下:

原生的FFmpeg

原作者的文章在这里QT下使用ffmpeg播放视频范例

先看一下使用这个原生方案的效果吧。

播放器中显示的视频都是mkv格式文件经过live555产生rtsp视频流,live555服务器部署在同一个局域网内,不存在网络延迟的情况。

可以看到第一个和第四个视频画面是比较完整的,花屏的频率很低,但是只有第四个是流畅播放的,其他三个都存在人眼可见的卡顿。

QtAV 项目

项目地址基于Qt和FFmpeg的跨平台高性能音视频播放框架

使用这个框架编写的demo效果:

可以看到和直接使用原生的FFmpeg效果差不多。但是它对FFmpeg和Qt widget封装的很好,使用很简便。对提高项目开发效率非常有利。

VLC-Qt 项目

项目地址Quickly create a fully functional cross-platform media player。使用方法也是非常方便,封装的VlcWidgetVideo类可以方便的显示和控制视频播放。我按照作者给出的例子vlc-qt/examples写的demo的效果如下:

可以看到,这是目前效果最好的,画面基本没有花屏,每个都能流畅播放,也达到了项目需求的效果。

可能是因为该框架是基于vlc封装的吧,vlc是在ffmpeg编解码库的基础上开发的框架,加入了很多自己的模块,有自己的封装与优化,所以才会更能自动选择最佳的解码方式吧。

常用的开源编码解码库

FFmpeg

项目地址A complete, cross-platform solution to record, convert and stream audio and video.

这个应该算是几乎所有播放器的根基了,音视频的编码解码都要依赖或部分依赖这个框架,应用非常广泛。像是暴风影音、QQ影音、KMPlayer等等都是基于FFmpeg库的。其他一部分基于此开发的播放器或项目可以在这里看到 Projects incorporate from FFmpeg

这个框架的说明文档也很详细,如果要深入学习视频编码解码的话,建议学习这个。

Libav

项目地址Libav provides cross-platform tools and libraries to convert, manipulate and stream a wide range of multimedia formats and protocols.

Libav是FFmpeg的一个分支吧(程序员也有小情绪的,一言不合就另起炉灶),功能和用法几乎一样。他和FFmpeg的基础都是这几个库

  • libavcodec provides implementation of a wider range of codecs.
  • libavformat implements streaming protocols, container formats and basic I/O access.
  • libavutil includes hashers, decompressors and miscellaneous utility functions.
  • libavfilter provides a mean to alter decoded Audio and Video through chain of filters.
  • libavdevice provides an abstraction to access capture and playback devices.
  • libswresample implements audio mixing and resampling routines.
  • libswscale implements color conversion and scaling routines.

这几个库应该是两个项目共同维护的吧😂

VLC

项目地址VLC Developers Corner

VLC是一个强大的社区VideoLAN创作的视频播放器,相信用过这个播放器的人肯定不少,尤其是在Linux平台上。VLC的核心就是libvlc库,这个库也是VideoLAN其他应用软件的基础。
libvlc

There are some very important dependencies: gettext (NLS) for international support (required), libdvbpsi for MPEG-TS files and streams support, libmad for MP3 audio decoding, libmpeg2 for MPEG1 and MPEG2 video support, FFmpeg or libav (libavcodec, libavformat, libpostproc, libswscale and optionally libavio) for MPEG4 and most other audio and video codecs, and many file formats, liba52 for Dolby (AC3) sound, dvdread and dvdnav for DVD playback, live555 for RTSP stream playback, etc.

For audio output, you will need probably alsa-lib (on Linux) and/or libpulse (for PulseAudio). For video output, you will normally need XCB/XVideo and/or OpenGL/GLX. And Qt4 is required to get the GUI support.

从官网的Wiki上看,VLC项目也是用到了FFmpeg作为大部分格式的解码器,同时也有自己的解码器。我觉得VLC的播放效果比FFmpeg要好,应该是因为在FFmpeg的基础上有所优化吧。

目前直接从官网下载的程序安装文件是不带sdk的,需要选择平台后下载压缩包(7z Zip),压缩包里面都带有sdk。也可以直接去归档库下载,里面安装包、压缩包都有。

MPlayer

项目地址MPlayer播放器

Linux用户应该不会对mplayer陌生,这是一个优秀的命令行播放器。它号称是这个星球上最强的播放器,没有之一😂
MPlayer
但是它不仅仅只是一个命令行播放器,它有非常多的GUI,在Linux、Windows、Mac OS上都有非常漂亮的界面,可以在这里看到官网收集到的一些播放器前端MPlayer Frontends

它同样也用到了FFmpeg

MPV

项目地址mpv is a fork of mplayer2 and MPlayer. It shares some features with the former projects while introducing many more.

从简介可以看出,mpv player是MPlayer的一个分支,同样是一个命令行播放器。但是MPV的播放窗口更美观,功能更丰富,特别像是个GUI了,可以看一下它的播放界面mpv上面有可以点击的按钮,对于不熟悉用键盘操控的人来说,可以非常方便的用鼠标控制播放。
大名鼎鼎的国产Linux发行版-Deepin的播放器Deepin movie就是使用的MPV和FFmpeg在QT5上开发的。还有moonplayer也是基于MPV的,其他采用MPV库的播放器可以在这里看到Applications using mpv。这里面一个有意思的播放器MPV-EASY Player,配置简单,并且非常接近原生的体验。

虽然很不要脸,但是还请您多多打赏 ^_^