参与项目开发: https://github.com/wang-bin/QtAV

下载编译好的文件等:https://sourceforge.NET/projects/qtav

win下编译好的可执行文件及编译所需的文件在这:https://sourceforge.net/projects/qtav

win下编译要用到的库如ffmpeg,portaudio可以在https://sourceforge.Net/projects/qtav/files/depends下载

2013.05.27 QtAV1.2.0发布:
更新很多东西,主要有

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

  5. 1.1.10还包含mac下的安装包。Linux?不需要我编译把。
    编译了个ubuntu1204上的:http://sourceforge.net/projects/qtav/files/QtAV%201.1.11/QtAV_1.1.11_ubuntu1204_i386.deb/download
    需要装ffmpeg相关的libavcodec54等包,还要Qt。其实还是自己编译方便。而且现在支持直接
make deb

的方式来生成deb包了,不过我对包的结果不太了解,可能不太规范。
命令行:

player [-vo qt|gl|d2d|gdi] [url/path]filename

或者把player改名成player-gl, player-d2d, player-gdi也可以

我ubuntu上初始化音频非常慢,不知是代码问题还是系统问题。。。

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

2013-02-28更新:
windows下编译所需的FFmpeg和portaudio头文件和库文件放在了https://sourceforge.net/projects/qtav/files/depends

支持MinGW和MSVC编译加入了几个windows下的渲染方法,修复了些bug,等等等等国内外有几个公司用到了我的项目。还有葡萄牙最古老的一所大学的一个博士在他的人机交互项目中也会使用,哈哈

2013-01-13更新:

目前播放已经很稳定了,除了频繁seek有时会崩溃(还不知道为什么)。该项目已经有国外的几个开发者在使用了,比如有几个意大利的开发者就用它来显示摄像头的实时监控视频。我会把一些成功的案例贴在项目页面上。TODO: 组件化,某些组件实现硬件加速;外部时钟(保证无音频流也能正常播放);更优化的数据包队列结构;字幕;等等。。。很久以前就想用FFmpeg做个播放器,用Qt做gui。但是能力有限。网上大多数都是讲ffplay的,ffplay代码太长看着不舒服没花时间看。最近有个项目要用到视频播放功能,一开始用了phonon,用起来方便,但是有点不足,比如gui用的是QWidget的组件,我是希望用graphics framework ,自定义功能也不多。最重要的是我重装win8后不能工作,于是决定还是自己动手写个比较靠谱。知道原理之后发现并不难。

多线程

其实总体思路还是比较简单的,用3个线程(除掉主线程),一个是分离器(demuxer)的线程,它的工作就是读取并分解音视频流,把数据包放到音/视频包的队列里。另外两个线程就是音频(播音频会阻塞)和视频解码播放线程了,它们的工作就是读取队列里的数据包进行解码,然后输出到窗口或音频设备。

同步

看到网上讨论比较多的就是音视频同步,最开始其实我很傻地根据视频的帧率设置个timer,每隔多少个毫秒进行读取解码输出,也就一个线程,这个非常不精确。后来测试了下音频播放,发现不像视频那样循环得快了就播放速度变快,音频的播放速率最后会稳定到正常速度的(还不知道为什么,貌似要改变音频速率就要resample一下),怪不得别人经常说要把视频同步到音频。理解这点之后操作起来就非常简单了,音频解码的数据包里有个时间戳pts(有时候分离好后要处理下),播放这个包时记下这个时间戳,视频线程要播放视频包时时间戳和音频的对比下,快了就wait一下,慢了就赶紧播或者丢帧,这样处理后同步就没问题了。很简单,代码也很短,效果也很好。

缓冲

 还有一个要注意的是分离线程应该分离多少数据包,因为你让那个线程不停地跑的话一会儿整个视频就被读取光了,没必要,而且非常占内存,而你播放的时候并不需要那么多数据包。所以可以设置个缓冲,音视频包队列堆积到一定数量后就wait一下让解码播放线程继续跑一会,当队列里的数据包比较少的时候唤醒分离线程,叫它继续读取点数据。这样,可以把播放器的内存占用降到很小。我做了个简单的对比,用mplayer、迅雷看看还有我的播放器播放一个4G大小的视频,那两个播放器内存都要200多M,我的稳定在50多点,效果很明显啊!而且对播放流畅度神马的无影响。音频播放目前用的是portaudio。windows上没问题,linux上有点问题。不知道有没有其他的跨平台的库可以播放音频。播放器也刚刚开始做,目前功能还比较简单,就是能正常播放视频了。不能seek,不支持字幕。还有个bug,就是缩放窗口时经常崩溃,我也崩溃了,还没找到原因。废话了这么多,最后贴上项目网址:https://github.com/wang-bin/QtAV

下载编译好的文件:https://sourceforge.net/projects/qtav/

欢迎大家共同学习交流音视频播放的问题,也欢迎参与写播放器

基于FFmpeg和Qt的播放器 QtAV库相关推荐

  1. C++基于ffmpeg和QT开发播放器~学习笔记

    C++基于ffmpeg和QT开发播放器 B站网址 https://www.bilibili.com/video/BV1h44y1t7D8?p=2&spm_id_from=pageDriver ...

  2. 最简单的基于FFMPEG+SDL的音频播放器

    ===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...

  3. 最简单的基于FFMPEG+SDL的音频播放器 ver2 (采用SDL2.0)

    ===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...

  4. 最简单的基于FFMPEG SDL的音频播放器

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! ==== ...

  5. 最简单的基于FFMPEG+SDL的音频播放器:拆分-解码器和播放器

    ===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...

  6. 最简单的基于FFMPEG+SDL的音频播放器 拆分-解码器和播放器

    ===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...

  7. 基于Ffmpeg解码器的简单播放器(a simple audio player based on Ffmpeg)

    这是一个基于Ffmpeg解码器的简单播放器,怎么在Windows上编译Ffmpeg可以在网上找到很多,开发环境是Windows XP SP3+VS2008,其中DirectSound控制单元来自jdk ...

  8. C++实战手把手教您用ffmpeg和QT开发播放器--01音视频基础知识

    笔记:https://blog.csdn.net/tainjau/article/category/9272757 音视频基础知识 封装.解码.重采样.像素格式 1.MPEG-4 MPEG-4标准将众 ...

  9. 【开源项目】基于C++使用ffmpeg和QT开发播放器

    音视频基础知识 1.MPEG-4是一套用于音频,视频信息的亚索编码标准. 2.常见的封装格式 MP4  MOV AVI:压缩标准可以任意选择 FLV :FLV封装格式详细参考 TS:直播流媒体使用: ...

最新文章

  1. php 远程下载图片到本地
  2. 阶段3-团队合作\项目-网络安全传输系统\sprint0-产品规划与设计\第2课-产品功能模型设计...
  3. tensorflow常见问题
  4. 可扫爆服务器系统,可扫可爆云服务器
  5. axios 参数为payload的解决方法
  6. 第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛(同步赛)解题报告
  7. display属性_Numpy知识点(1)讲解实操安装/属性/数组创建/运算
  8. 数据分析师免费课程网址
  9. 【SpringMVC学习07】SpringMVC中的统一异常处理
  10. java null指针_注意:java 这些地方经常发生 NullPointerException(空指针)异常
  11. Spark部署模式、任务提交
  12. mysql驱动和版本问题_MysqlJDBC驱动版本与Mysql版本的对应问题解决
  13. 文件夹目录权限实现方法总结(附代码)
  14. 【日常】python脚本系列:拳皇13一键出招以及连段实现
  15. 解决win10计算机管理中没有本地用户和组
  16. GitHub Actions 快速入门
  17. 创维E900V21E/E900V22E_S905L3B/S905L2B通刷_支持5621DS无线_完美语音线刷固件
  18. JVM 垃圾回收器 ZGC
  19. tableviewCell复用 重叠问题
  20. (Stockx)爬虫Requests 403(Please verify you are a human)解决方法

热门文章

  1. ABP 中“To”方法使用解析(类型转换公共方法)
  2. 深度学习基础笔记(MLP+CNN+RNN+Transformer等等)
  3. 【BCT认证】Bonjour Conformance Test教程
  4. 最新虚幻5引擎(UE5)游戏性能的影响详解
  5. Win10局域网远程
  6. EasyUI 给input 赋值
  7. 于娟《生命日记》——复旦大学教师于娟对大学生健康的建议
  8. 统计阶乘结果的末尾0的个数
  9. 辅助信息服务器,我开启了辅助核算 要去哪里增加新的辅助信息?
  10. 【maven】将本地jar导入本地maven仓库