• 62420阅读
  • 78回复

用Qt和FFmpeg写了个播放器 QtAV库 [复制链接]

上一主题 下一主题
离线novesky
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2012-11-03
— 本帖被 XChinux 设置为精华(2016-03-16) —
关键词: 播放器ffmpeg
阅读README很重要
欢迎大家来参与主页 http://wang-bin.github.io/QtAV

2015.12.21 QtAV 1.9.0

QtAV 1.9.0 发布了,该版本改进内容包括:
- 支持Windows Store。应用商店搜索qtav
- 给FFmpeg提交了winrt多线程支持的补丁,性能大有提升,已合并至上游
- 修复iOS部署和运行错误一些问题
- XAudio2 崩溃问题
- Android: 支持content协议,修复从相册打开无法播放问题;windows上编译、部署问题修复

- VA-API: 改善n卡支持;加入hevc, vp9,未测;EGL零拷贝渲染支持,性能最好,需要va-api 0.38(ubuntu15.10)和Qt>=5.5及intel显卡。其他一些改进
- 使用OpenGL, GLSL新接口,OpenGL ES3优化
- 支持播放前一帧
- QMLPlayer: 可以按住预览框拖动,处理安卓的home键、返回键...

- 其他更新请看
下载

2014.12.27 QtAV 1.4.2
- 提高seek速度。要感谢wm4(mpv主力开发者)的指点
- 优化音视频同步逻辑,软解播放高分辨率高帧率视频完胜其他播放器。其他播放器几乎不能看,包括硬解,除了mpv+vaapi。以后将有更好的优化。windows下效果略差。4k 120fps测试视频: http://pan.baidu.com/s/1sj6s40l
- 修复VA-API解码图像下方多出一条模糊的线问题。修复使用libav9时vaapi可能不工作的问题。
- ffmpeg运行时支持hevc dxva硬解的话就启用硬解。目前要使用LAVFilters的ffmpeg。
- Cedarv硬解优化
- 增加可扩展的视频输入源接口。支持qrc资源文件里的音视频播放(QtMultimedia还不支持)
- 异步加载
- 修复使用openal时多个播放器实例播放音频不正常问题
- 修复播放下一帧问题
- 修复截图不是当前帧问题。简化截图接口
- 修复qml视频画面抖动问题
- 正确处理文件名中的特殊字符。
- libass改为动态加载。依赖 https://github.com/wang-bin/capi
- 支持链接到ffmpeg静态库
- rgb48支持。opengl只支持rgb48le

2014.09.10 QtAV 1.4.0
下载:https://sourceforge.net/projects/qtav/files/release/1.4.0
- OpenGL优化,支持更多的格式,支持QML,对于Qt>=5.4支持opengl动态切换
- VAAPI: GLX直接渲染支持,性能大幅提升。检测显卡是否4k以防止系统崩溃.
- DXVA: 更多解码表面以提升性能防止画面抖动
- OSX的VDA硬解支持
- Android支持,部署更简单
- 字幕支持,包括qml
- OpenAL 改进,支持大多数平台
- FFmpeg的libavfilter支持
- 音频播放接口改变
- 简化OSX的部署和安装包制作
- bug修复

2014.05.30 QtAV1.3.4
- CUDA:修复播放时花屏、画面顺序跳动等问题
- VAAPI,DXVA:之前VAAPI的性能很差。现在intel gpu使用sse4.1来拷贝解码数据,性能提升明显。 VAAPI支持drm
- 使用ffmpeg新的硬解接口
- 修复切换解码器后画面显示不对甚至崩溃问题
- 加入avcodec、avformat和各解码器的一些高级选项。
- metadata 支持
- 优先使用流信息里的显示比例。感谢 Sandro Cavazzoni
- 修复文件名编码问题。之前貌似日语文件名打不开
- 修复带图片的音频不显示图片和不能拖动进度的问题
- 支持将QtAV安装为Qt的模块方便开发应用
详情见 http://wang-bin.github.io/qtav.org/blog/1.3.4.html


2014.01.29 QtAV 1.3.1

库相关:
- OpenAL初步支持
- 修复硬件解码时seek、网络丢包等情况下崩溃问题
- CedarX硬解支持。可以在pcDuino上硬解。感谢 Miroslav Bendik. 可以看他的视频 http://www.youtube.com/watch?v=u3mvDe3GBPI
- FFmpeg log和错误处理
- AVDictionary 支持
- Hi10bits 使用软解
- 还有其他诸多改进
播放器相关:
ctrl+滚动滚轮进行缩放,禁止屏保等
同时加入了界面更加 cool 的 QMLPlayer例子,在windows、mac、linux上都有不错的体验

2013.12.19 QtAV 1.3.0 发布
- windows下dxva硬解初步支持,目前拖动时间可能会有崩溃问题。vaapi目前性能很差
- 可选择音轨
- 可调节亮度、饱和度等
- 循环播放、播放列表、历史记录
- HEVC支持(FFmpeg)
- 优化网络电视界面、其他界面等
以下功能是库里支持但player未加ui的
- 一个视频播放多个输出窗口支持,支持裁剪,自定义filter




2013.07.04 QtAV1.2.2

改进的是音频播放,之前播放mp3和部分视频爆音的问题已无
任意控制播放速度(见图,或Ctrl+上/下来加减速度)
音量控制控件


1.2.1主要更新:
视频显示质量控制
修复显示比例不正确的问题。可以设为任意比例
修复一些崩溃、内存泄漏等错误


2013.05.27 QtAV1.2.0发布:
更新很多东西,主要有
1. player例子加入gui界面,易于操控。自带一些网络电视
2. 独创的播放时渲染引擎无缝动态切换。可以方便地对比各种渲染引擎的cpu使用率
3. X11下XV的支持(Qt4 only)
4. bug修复等





2013-03015
    新增了几个渲染方式,如opengl, direct2d, gdi。在我电脑上direct2d对性能提升非常明显。增加了OSD(现在的设计很烂),原来的O键改成了切换OSD。Ctrl+O是打开文件。
    切换视频大小比例按R。
    完善了qmake的工程框架,移植了很多Qt5里qmake内置函数到Qt4,用qmake语法写的,支持编译检测。若要重新配置请删除编译目录里的.qmake.cache再qmake,mingw可能qmake一次不够,需要两次(还没找到原因,我的pro写得太复杂了)。linux下支持make deb来生成安装包。
    支持VC(我vs2010编译出来的无法运行,2012正常,不解),方法见github 上的wiki。支持Qt5

    命令行:player [-vo qt|gl|d2d|gdi] [url/path]filename
    或者把player改名成player-gl, player-d2d, player-gdi也可以

2013-01-13更新
    已经比较稳定了。目前有一些国内外的开发者在使用了,用来显示摄像头实时视频蛮多的。
    还有很多东西要开发,比如组件化、硬件加速等


源码:https://github.com/wang-bin/QtAV
由于github即将关闭文件上传的功能,所以在sourceforge上也建了一个,可以下载mingw下编译所需的库

win下编译要用到的库如ffmpeg,portaudio可以在https://sourceforge.net/projects/qtav/files/depends 下载
希望对大家有所帮助。

了解了下视频解码和音视频同步的原理,于是一口气写了个播放器,感觉并不难。音频播放使用portaudio,在linux上貌似有问题。功能还比较简单,能正常播放视频。对比了mplayer、迅雷看看播放4G大小的视频的资源使用,它们都要200多M的内存,我的只要50多点,挺意外的。




支持快进快退、暂停继续、音量调节、单帧控制、截图等

TODO:字幕,长宽比例 etc


















离线uidab

只看该作者 1楼 发表于: 2012-11-05
回 楼主(novesky) 的帖子
顶一下!
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!

只看该作者 2楼 发表于: 2012-11-09
咱也来顶一下
奋起
离线yangkun52131

只看该作者 3楼 发表于: 2013-01-08
好东西,代码很清晰
离线toby520

只看该作者 4楼 发表于: 2013-01-08
没找到楼主所说的 mingw下编译要用到的库如ffmpeg,portaudio可以在那个页面的downloads里找
QtQML多多指教开发社区 http://qtclub.heilqt.com
将QtCoding进行到底
关注移动互联网,关注金融
开发跨平台客户端,服务于金融行业
专业定制界面
群号:312125701   373955953(qml控件定做)
离线lnjamn
只看该作者 5楼 发表于: 2013-01-10
能在N9上使用RMVB吗?
离线novesky

只看该作者 6楼 发表于: 2013-01-14
回 4楼(toby520) 的帖子
mingw-libs_extra那个压缩包, sourceforge里。或者自己编译也行。觉得好的话去顶一下哦
离线novesky

只看该作者 7楼 发表于: 2013-01-14
回 5楼(lnjamn) 的帖子
只要ffmpeg支持就可以。话说n9我还没试过
离线yangkun52131

只看该作者 8楼 发表于: 2013-02-28
不错的东西,在播放的时候有时候会出现白色块,还有时候出现花块。
离线tearring

只看该作者 9楼 发表于: 2013-03-05
已在vxworks上跑通 ^-^
离线ppdayz

只看该作者 10楼 发表于: 2013-03-05
楼主威武
离线blueseait

只看该作者 11楼 发表于: 2013-03-09
请问如何在这个项目中加入ffmpeg和portaudio支持?
离线blueseait

只看该作者 12楼 发表于: 2013-03-15
我用QtCreator进行编译和运行时,下载了网上mingw-libs_extra文件夹下面的文件,放到src目录下,并在libQtAV.pro文件中配置了ffmpeg的LIBS和INCLUDEPATH,并且注释掉了QtAV.pro中的qtCompileTest(avutil)|error("FFmpeg avutil is required, but compiler can not find it")等,可以通过编译并生成相应运行文件,但是运行的时候会报错。在QtCreator输出:
D:\TDDOWNLOAD\QtAV-master\build\bin\player-gdi.exe 启动中...
程序异常结束。
D:\TDDOWNLOAD\QtAV-master\build\bin\player-gdi.exe 退出,退出代码: -1073741515

直接运行生成的执行文件player-gdi.exe时报因计算机中丢失Qt5Core.dl,尝试重新安装该程序以解决此问题。
离线novesky

只看该作者 13楼 发表于: 2013-03-15
回 11楼(blueseait) 的帖子
windows下的话这里下载 https://sourceforge.net/projects/qtav/files/depends/
然后让编译器能找到头文件和库文件就行。
离线novesky

只看该作者 14楼 发表于: 2013-03-15
回 12楼(blueseait) 的帖子
请下载这里的https://sourceforge.net/projects/qtav/files/depends/
配置头文件和库的路径不需要修改pro,而是应该放在编译器能找到的目录,或者设置环境变量,如gcc的用CPATH增加头文件搜索路径,LIBRARY_PATH增加库搜索路径。vc用INCLUDE和LIB。
如果你注释掉了ffmpeg之外的qtCompileTest,那么那些功能不会被编译。
程序异常我也不清楚,你再试试吧。
离线novesky

只看该作者 15楼 发表于: 2013-03-15
回 4楼(toby520) 的帖子
离线novesky

只看该作者 16楼 发表于: 2013-03-15
回 9楼(tearring) 的帖子
不错不错!!
离线blueseait

只看该作者 17楼 发表于: 2013-03-16
楼主,谢谢你的指导,我的程序能正常通过编译了,但是在WIN7下用QtCreator建的工程还是不能运行,错误与上面写的一样,不知道是什么原因,请问楼主是否测试过win7+QtCreator环境的运行。另外,请问楼主最新源代码加入的OPENGL是什么版本,我下载了一个openGL加入后有些openGL函数找不到。再次谢谢楼主的无私奉献!
离线novesky

只看该作者 18楼 发表于: 2013-03-16
我的mingw是官网上的版本http://www.mingw.org,Qt4、5都是自己编译的。我用QtCreator、命令行都编译过没问题。OpenGL的什么函数找不到?为什么要自己下载OpenGL,mingw应该自带的吧?你的Qt是哪个版本?我来试试
离线blueseait

只看该作者 19楼 发表于: 2013-03-16
我下载了你说的官网上的版本mingw,还是有很多函数找不到,比如:
D:\qtav\QtAV-master\src\GLWidgetRenderer.cpp:100: 错误:'GL_SMOOTH' was not declared in this scope
D:\qtav\QtAV-master\src\GLWidgetRenderer.cpp:100: 错误:'glShadeModel' was not declared in this scope
D:\qtav\QtAV-master\src\GLWidgetRenderer.cpp:127: 错误:'glPushMatrix' was not declared in this scope
我用的qtcreator5.01版本,你试试吧
离线blueseait

只看该作者 20楼 发表于: 2013-03-16
不对,我用的是qtcreator2.6.2,qt库版本是5.0.1,直接安装网上下载的windows+mingw下编译过的qt5.0.1可安装版本,直接安装的。不加任何外部opengl也是以上错误找不到glShadeModel、glPushMatrix等函数。楼主看看吧
离线novesky

只看该作者 21楼 发表于: 2013-03-16
回 20楼(blueseait) 的帖子
这几个函数是都没有就奇怪了,感觉没有找到opengl的头文件。第一个错误是什么?
另外,Qt提供编译好的版本不能用mingw官网上的编译器,格式不兼容的,还是用Qt指定的mingw吧。
另外,这些都和QtCreator无关
离线blueseait

只看该作者 22楼 发表于: 2013-03-16
我直接用的Qt安装后自动分配的编译器,然后直接运行报:D:\qtav\QtAV-master\src\GLWidgetRenderer.cpp:27: 错误:GL/glext.h: No such file or directory
说找不到这个头文件。所以我才从外部加opengl,但是又与本身自带的有冲突。
离线novesky

只看该作者 23楼 发表于: 2013-03-17
回 22楼(blueseait) 的帖子
你把glext.h那行去掉,换回编译器自带的gl文件。有些gl带这个glext.h文件,有些没有,看来我要加个判断的宏
离线novesky

只看该作者 24楼 发表于: 2013-03-17
回 22楼(blueseait) 的帖子
我修改了代码,会检测是否需要包含glext.h,你试试看
离线blueseait

只看该作者 25楼 发表于: 2013-03-18
我在另外一台机器上(操作系统为win7)安装了qt5.0.1,并在qtcreator2.6.2中(安装qt5.0.1时自动安装的)进行编译,结果报找不到
D:\qtav\QtAV-master\src\GLWidgetRenderer.cpp:100: 错误:'GL_SMOOTH' was not declared in this scope
D:\qtav\QtAV-master\src\GLWidgetRenderer.cpp:100: 错误:'glShadeModel' was not declared in this scope
D:\qtav\QtAV-master\src\GLWidgetRenderer.cpp:127: 错误:'glPushMatrix' was not declared in this scope
这些变量和函数。
离线novesky

只看该作者 26楼 发表于: 2013-03-18
回 25楼(blueseait) 的帖子
我怀疑你没有opengl相关文件,不然不可能有这些错误的。include gl.h试试看?
离线novesky

只看该作者 27楼 发表于: 2013-03-18
回 25楼(blueseait) 的帖子
也有可能是OpenGL ES里没有这些。注释掉试试
离线novesky

只看该作者 28楼 发表于: 2013-03-24
回 25楼(blueseait) 的帖子
我看了下,是因为官方编译的 Qt5使用OpenGL  ES2 的缘故,区别还蛮大的。我在qmake工程里加了个检测,重新qmake一下最新代码再编译就行,如果不支持的就会disable掉opengl渲染
离线pbe_sedm

只看该作者 29楼 发表于: 2013-03-24
楼主,我有个提议,能不能写些博客啥的,说说你开发这款开源项目的一些经历,纯技术的,文字功底如何不打紧,也许这能吸引更多的中国程序员参与这个项目的开发,独乐乐不如众乐乐,你说是吧!非常诚恳的希望楼主考虑一下这个建议!
离线novesky

只看该作者 30楼 发表于: 2013-03-25
回 29楼(pbe_sedm) 的帖子
恩,谢谢你的建议,我四月份开始写写看。
离线gavial2011

只看该作者 31楼 发表于: 2013-04-09
谢谢楼主~
离线novesky

只看该作者 32楼 发表于: 2013-05-27
1.2.0 发布
离线ninsun

只看该作者 33楼 发表于: 2013-10-23
回 32楼(novesky) 的帖子
楼主大大,你能不能写个关于如何使用ffmpeg的简单介绍来着?
像是想要实现播放一个视频,首先要调用ffmpeg的哪个库的那个函数,接着再调用哪个库的那个函数,然后如何如何的这种简单的介绍?
不要详细的说明,只要把关键的函数与步骤说一下就好了。
现成的项目里面功能繁多,想要看出来最基本的用法很麻烦的,特别对于毫无概念的新手来说……
离线wei_cn129
只看该作者 34楼 发表于: 2013-11-09
回 楼主(novesky) 的帖子
求问楼主,我使用WinXP 32bit,VS2008,QT4.6.2能编译QtAV吗?因为我在您的下载目录中没有找到相关信息,跪谢!
离线novesky

只看该作者 35楼 发表于: 2013-11-21
回 34楼(wei_cn129) 的帖子
Qt4.7以上可以编译,再低点我没试过。有空了试试看
离线zhsj

只看该作者 36楼 发表于: 2013-12-04
一直在找d2d相关的东西,谢谢lz!
离线贵宾杨佳

只看该作者 37楼 发表于: 2013-12-08
win7 下直接用Qt creator 编译github上的源代码 出现   :-1: 错误:avutil is required, but compiler can not find it  !!不知道大家有没有碰到?
离线carmen816

只看该作者 38楼 发表于: 2013-12-13
对比了mplayer、迅雷看看播放4G大小的视频的资源使用,它们都要200多M的内存,我的只要50多点,挺意外的。
那是因为您的播放器,缓冲的是压缩帧,他们缓冲原始的音视频数据。


楼主的播放器,帧率和时间同步稍有些问题。
FPS 23.976,显示只有15帧左右。播放时间一长,音视频出现不同步。
视频同步音频的方案不够精确,音频本身可能存在累计误差



离线novesky

只看该作者 39楼 发表于: 2013-12-15
回 38楼(carmen816) 的帖子
那是因为您的播放器,缓冲的是压缩帧,他们缓冲原始的音视频数据

这个还真不知道,为什么要这么做?

不同步音频的话应该同步什么?系统时间?我现在的是有问题,来不及画的就丢掉
快速回复
限100 字节
 
上一个 下一个