ffmpeg rtsp转hls_Qt音视频开发24-ffmpeg音视频同步

## 一、前言

用ffmpeg来做音视频同步,个人认为这个是ffmpeg基础处理中最难的一个,无数人就卡在这里,怎么也不准,本人也是尝试过网上各种demo,基本上都是渣渣,要么仅仅支持极其少量的视频文件比如收到的数据包是一帧视频一帧音频的,要么根本没法同步歪七八糟的,要么进度跳过去直接蹦蹦蹦崩溃的,其实最完美的音视频同步处理demo就是ffplay,我亲测过几十种各种各样的音视频本地文件,数十种视频流文件,都是非常完美,当然啦这是亲生的啦,不完美还玩个屁。

如果仅仅是播放视频流(不带音频流),可能不需要音视频同步,所以最开始只做rtsp视频流播放的时候根本没有考虑同步的问题,因为没遇到也不需要,等到后期发现各种rtmp、http、m3u8这种视频流的时候,问题大了去了,他是hls格式的视频流文件一次性过来的,一个个小视频文件过来的,如果没有同步的话,意味着突然之间刷刷刷的图片过去很多,下一次来的又是刷刷的,这就需要自己计算同步了,上次接收到的数据包放入队列,到了需要显示的时候就显示。

常用的音视频同步方法:

1. 通过fps来控制,fps表示一秒钟播放多少帧,比如25帧,可以自行计算一帧解码用掉的时间,一帧占用(1000/25=40毫秒),通过延时来处理,这其实是最渣渣的办法。

2. 记住开始解码的时间startTime,通过av_rescale_q计算pts时间,两者的差值就是需要延时的时间,调用av_usleep来延时,这种只有部分文件正常,很多时候不正常。

3. 音频同步到视频,视频时钟作为主时钟,没试过,网上很多人说这个办法不好。

4. 视频同步到音频,音频时钟作为主时钟,没试过,据说大部分人采用的此办法。

5. 音视频同步到外部时钟,外部时钟作为主时钟,最终采用的办法,容易理解互不干扰,各自按照外部时钟去同步自己。

6. ffplay自身内置了三种同步策略,可以通过参数来控制采用何种策略,默认是视频同步到音频。

## 二、功能特点

1. 多线程实时播放视频流+本地视频+USB摄像头等。

2. 支持windows+linux+mac,支持ffmpeg3和ffmpeg4,支持32位和64位。

3. 多线程显示图像,不卡主界面。

4. 自动重连网络摄像头。

5. 可设置边框大小即偏移量和边框颜色。

6. 可设置是否绘制OSD标签即标签文本或图片和标签位置。

7. 可设置两种OSD位置和风格。

8. 可设置是否保存到文件以及文件名。

9. 可直接拖曳文件到ffmpegwidget控件播放。

10. 支持h265视频流+rtmp等常见视频流。

11. 可暂停播放和继续播放。

12. 支持存储单个视频文件和定时存储视频文件。

13. 自定义顶部悬浮条,发送单击信号通知,可设置是否启用。

14. 可设置画面拉伸填充或者等比例填充。

15. 可设置解码是速度优先、质量优先、均衡处理。

16. 可对视频进行截图(原始图片)和截屏。

17. 录像文件存储支持裸流和MP4文件。

18. 音视频完美同步,采用外部时钟同步策略。

19. 支持seek定位播放位置。

20. 支持qsv、dxva2、d3d11va等硬解码。

21. 支持opengl绘制视频数据,极低CPU占用。

22. 支持安卓和嵌入式linux,交叉编译即可。

## 三、效果图

3bee34fd803a344145d56a11a8094e33.png

## 四、相关站点

1. 国内站点:[https://gitee.com/feiyangqingyun/QWidgetDemo](https://gitee.com/feiyangqingyun/QWidgetDemo)

2. 国际站点:[https://github.com/feiyangqingyun/QWidgetDemo](https://github.com/feiyangqingyun/QWidgetDemo)

3. 个人主页:[https://blog.csdn.net/feiyangqingyun](https://blog.csdn.net/feiyangqingyun)

4. 知乎主页:[https://www.zhihu.com/people/feiyangqingyun/](https://www.zhihu.com/people/feiyangqingyun/)

5. 体验地址:[https://blog.csdn.net/feiyangqingyun/article/details/97565652](https://blog.csdn.net/feiyangqingyun/article/details/97565652)

## 五、核心代码

void FFmpegSync::run(){    reset();    while (!stopped) {        //暂停状态或者队列中没有帧则不处理        if (!thread->isPause && packets.count() > 0) {            mutex.lock();            AVPacket *packet = packets.first();            mutex.unlock();            //h264的裸流文件同步有问题,获取不到pts和dts,暂时用最蠢的办法延时解决            if (thread->formatName == "h264") {                int sleepTime = (1000 / thread->videoFps) - 5;                msleep(sleepTime);            }            //计算当前帧显示时间 外部时钟同步            ptsTime = getPtsTime(thread->formatCtx, packet);            if (!this->checkPtsTime()) {                msleep(1);                continue;            }            //显示当前的播放进度            checkShowTime();            //0-表示音频 1-表示视频            if (type == 0) {                thread->decodeAudio(packet);            } else if (type == 1) {                thread->decodeVideo(packet);            }            //释放资源并移除            thread->free(packet);            mutex.lock();            packets.removeFirst();            mutex.unlock();        }        msleep(1);    }    clear();    stopped = false;}bool FFmpegSync::checkPtsTime(){    bool ok = false;    if (ptsTime > 0) {        if (ptsTime > offsetTime + 100000) {            bufferTime = ptsTime - offsetTime + 100000;        }        int offset = (type == 0 ? 1000 : 5000);        offsetTime = av_gettime() - startTime + bufferTime;        if ((offsetTime <= ptsTime && ptsTime - offsetTime <= offset) || (offsetTime > ptsTime)) {            ok = true;        }    } else {        ok = true;    }    return ok;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1119. Pre- and Post-order Traversals (30)

友情提示&#xff1a;这题非常值得自己思考独立做出来&#xff0c;请反复确认后再往下拉 1119. Pre- and Post-order Traversals (30) 时间限制400 ms内存限制65536 kB代码长度限制16000 B判题程序Special作者CHEN, YueSuppose that all the keys in a binary tree are distinc…

单招计算机英语面试口语,单招面试英语自我介绍范文 自我介绍说什么

单招面试英语自我介绍范文 自我介绍说什么2018-03-11 10:50:17文/李男学好英语就意味着可能有更多的机会&#xff0c;单招面试中英语自我介绍也是很重要的。那么&#xff0c;英语自我介绍说什么呢&#xff1f;下面小编整理了一些英语自我介绍范文&#xff0c;供大家参考&#x…

jsp中导入jsf标签库_初学jsf,自制的标签使用时报错?解决办法

当前位置:我的异常网 Java Web开发 初学jsf&#xff0c;自制的标签使用时报错&#xff1f;解决办法初学jsf&#xff0c;自制的标签使用时报错&#xff1f;解决办法www.myexceptions.net 网友分享于&#xff1a;2013-09-12 浏览&#xff1a;10次初学jsf&#xff0c;自制的标签…

bzoj 2245 [SDOI2011]工作安排【最小费用最大流】

其实不用拆点&#xff0c;对于每个人我们假装他是\( s[i]1 \)个点&#xff0c;可以由他向T点分别连\( s[i]1 \)条边&#xff0c;容量为\( t[i][j]-t[i][j-1]\)&#xff0c;由S点向所有产品i连容量为c[i]的边&#xff0c;由所有产品向能制造它的人连容量为inf的边。 因为是最小费…

angularjs directive scope变化为啥html,学习AngularJs:Directive指令用法(完整版)

本教程使用AngularJs版本&#xff1a;1.5.3摘要&#xff1a;Directive(指令)笔者认为是AngularJ非常强大而有有用的功能之一。它就相当于为我们写了公共的自定义DOM元素或CLASS属性或ATTR属性&#xff0c;并且它不只是单单如此&#xff0c;你还可以在它的基础上来操作scope、绑…

通信、计算机、电子相关专业技术工作

中国联合网络通信有限公司&#xff08;福建分公司2018招聘&#xff09;<1>IT工程师相应岗位&#xff08;软件方向&#xff09;岗位需求1.以C/C等计算机语言为主要武器&#xff0c;参与公司IT开发、维护、优化2.根据公司发展和业务需求进行软件设计、参与代码开发、系统测…

python可视化报表制作教程_如何使用Python快速制作可视化报表

数据可视化能力已经越来越成为各岗位的基础技能。领英的数据报告显示&#xff0c;数据可视化技能在2017年中国最热门技能中排名第一。就数据分析而言&#xff0c;可视化探索几乎是你正式进行数据分析的第一步&#xff0c;通过SQL拿到数据之后&#xff0c;我们需要使用可视化方法…

vfp程序改错 计算机和英语,vfp程序改错教案.doc

Visual Foxpro程序改错〖第1题〗(练习题所在文件夹:163)*题目&#xff1a;该程序完成口令检验功能。输入三次不正确退出。*注意&#xff1a;不可以增加或删除程序行&#xff0c;也不可以更改程序的结构。SET TALK OFFCLEARass1"AbCdEf"TT1DO WHILE TT<410,20 SAY …

青春

青春 最后一班午夜列车&#xff0c;悄悄地带走了青春&#xff0c;溪水淌过的路终将不会倒流而去。 青春就像一件新买的衬衫&#xff0c;尽管新颖夺目&#xff0c;却始终逃不了岁月的洗礼&#xff0c;一遍一遍的脱去新颖的靓丽&#xff0c;尽管你小心的呵护&#xff0c;终将守护…

lisp遍历表中所有顶点_三十张图片让你彻底弄明白图的两种遍历方式:DFS和BFS...

1 引言遍历是指从某个节点出发&#xff0c;按照一定的的搜索路线&#xff0c;依次访问对数据结构中的全部节点&#xff0c;且每个节点仅访问一次。  在二叉树基础中&#xff0c;介绍了对于树的遍历。树的遍历是指从根节点出发&#xff0c;按照一定的访问规则&#xff0c;依次…

未来教育计算机二级预测c,二级C语言(附光盘)(全国计算机等级考试预测试卷与真考题库)...

摘要&#xff1a;高质量预测试卷 首创命题模拟系统,专家层层把关,瞄准每年的更新试题 最新版无纸化考试题库 提供1035道题,所有试题均有正确答案与详尽解析 无纸化真考模拟系统 操作环境,评分机制与真实考试系统的完全一致,带您提前"进入"考场 名师视频课堂 机考误区…

通用测试用例大全

为方便平时写测试用例&#xff0c;整理如下&#xff1a; 功能条件测试步骤测试数据预期结果备注搜索或查询 单独遍历各查询条件&#xff0c;测试按各查询条件是否都能够查询出相应的值. 查询出符合条件的记录 设置界面上所有查询条件进行查询,单击查询按钮后&#xff0c;测试执…

cαr怎么发音_【英语拼读发音规则】连读、略读、重读、断句、语调……

在说汉语的时候&#xff0c;我们讲究的是“字正腔圆、掷地有声”&#xff0c;而英语恰恰相反&#xff0c;它需要将一句话中的某些重点词汇突出&#xff0c;弱化非重点词汇。所以&#xff0c;对已经习惯了“字正腔圆”的我们来讲&#xff0c;就会觉得英语听起来“太含含糊糊”了…

中职计算机英语c答案,中职高考计算机试题及答案-20210622105004.docx-原创力文档...

* 1&#xff0e;计算机采用“存储程序”原理的提出者是()A&#xff0e;莫尔B&#xff0e;比尔盖茨C&#xff0e;冯 诺依曼D&#xff0e;科得2&#xff0e;下列表示计算机运行速度的是()A. 7200转B. 2GHZC&#xff0e; 20GD. 1024 x 768像素(l00101 ) 2 对应的十进制数是( )A. 3…

WEB网站测试思路

1、链接测试&#xff1a;a:进入页面后点击链接是否正常跳转 b:单独将链接复制到浏览器里面是否正常展示页面&#xff08;如果需要登录的网站&#xff0c;还需要考虑个人中心等需要登录的功能在未登录成功时以及登录成功后直接通过链接打开的情况&#xff09; 2、菜单测试&#…

计算机病毒属于什么类工具,什么是计算机病毒?有哪些类型

病毒定义一、计算机病毒(Computer Virus)在《中华人民共和国计算机信息系统安全保护条例》中被明确定义&#xff0c;病毒指“编制或者在计算机程序中插入的破坏计算机功能或者破坏数据&#xff0c;影响计算机使用并且能够自我复制的一组计算机指令或者程序代码”。而在一般教科…

织梦缩略图自动补齐绝对路径_[教程]织梦CMS缩略图和文章内容图片自动转化为带域名的绝对路径...

今天又接了个织梦CMS的有偿服务,客户想要后台添加文章内容的时候,缩略图自动变成带上绝对路径的格式.比如我们默认的缩略图是这样的 /uploads/allimg/150814/123P2NB-0-lp.png 他想要的效果是这样的 http://fcz8k.com/uploads/allimg/150814/123P2NB-0-lp.png大家懂我意思了吧…

Net学习日记_ASP.Net_MVC_新语法笔记

01.新语法 本章中主要讲解.Net框架性语法。开发者可以使用新语法提高编程的效率以及代码的运行效率&#xff1b;其本质都是“语法糖”&#xff0c;由编译器在编译时转成原始语法。 1 自动属性 Auto-Implemented Properties 2 隐式类型 var 3 对象初始化器 与 集合初始化器 { …

燕山大学数字通信计算机仿真代码,燕山大学数字通信计算机仿真课程设计模板.doc...

??数字通信计算机课设??程序代码?//?SigTranmit.cpp:?implementation?of?the?SigTranmit?class.?//?//??#include?"stdafx.h"?#include?"ASK.h"?#include?"SigTranmit.h"?#include???#ifdef?_DEBUG?#undef?THIS_FILE…

inventor如何钣金出弧面_Inventor教程之钣金多规则

钣金多规则是继钣金多实体之后&#xff0c;Inventor 在钣金模块功能的又一重要增强。钣金多规则基于钣金多实体的基础上&#xff0c;完善了用户需要在不同实体上赋予不同板厚、展开规则、折弯释压形状、拐角释压形状以及尺寸等针对各实体的个性化设置。使用户可以把钣金多规则和…