范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Qt音视频开发08ffmpeg内核优化(极速打开超时回调实时响应)

  一、前言
  最初编写这套视频解析组件的时候,面对的场景是视频监控行业,对应设备都是网络监控摄像机,传过来的都是rtsp这种视频流,做过这一块的人都知道,打开某个视频流默认耗时比较大,基本上在2s左右,那是因为ffmpeg接口内部读取的最大数据量 formatCtx->probesize(从源文件中读取的最大字节数)值是5000000,导致这里卡很久最耗时,可以调小来加快打开速度。还有一个参数就是从文件中读取的最大时长 formatCtx->max_analyze_duration,改成5个单位即可,5 * AV_TIME_BASE。当然这参数也不是一层不变的,需要根据实际的网络状态好坏来设置,ffmpeg内部接口值很大就是尽量考虑了网络环境很差的情况,所以默认值很大。基本上改了这两个参数以后在局域网中打开1080P的主码流都只要0.5s左右,比之前的2s提升了3倍以上。
  除了对打开速度进行特别优化之外,还有一块就是超时回调,毕竟实时的视频流这种,严重依赖网络环境的好坏,一旦网络环境不好,或者网络设备坏了,网线拔了,很容易卡主读取,在用 avformat_open_input 打开视频流的阶段也特别容易卡主很久,windows上默认30s左右,这么久肯定不能接受,所以需要有个机制可以自由控制最大等待时间,设置超时回调 formatCtx->interrupt_callback.callback 就很有必要的。
  以前采用过的策略是打开前去主动连接对应的IP地址和端口,通了说明设备在线,这种策略只适用于打开的时候,如果是运行过程中网络环境变坏了或者网线拔了之类的,依然识别不到,不可能开个定时器或者线程去检测,那样就太垃圾了,所以采用超时回调的做法是最好的最万能的。二、效果图
  四、相关代码bool FFmpegThread::initInput() {     //实例化格式处理上下文     formatCtx = avformat_alloc_context();     //设置超时回调(有些不存在的地址或者网络不好的情况下要卡很久)     formatCtx->interrupt_callback.callback = FFmpegHelper::avinterruptCallBackFun;     formatCtx->interrupt_callback.opaque = this;      //先判断是否是本地摄像头     AVInputFormatx *ifmt = NULL;     if (videoType == VideoType_Camera) { #if defined(Q_OS_WIN)         //ifmt = av_find_input_format("vfwcap");         ifmt = av_find_input_format("dshow"); #elif defined(Q_OS_LINUX)         //可以打开cheese程序查看本地摄像头(如果是在虚拟机中需要设置usb选项3.1)         //ifmt = av_find_input_format("v4l2");         ifmt = av_find_input_format("video4linux2"); #elif defined(Q_OS_MAC)         ifmt = av_find_input_format("avfoundation"); #endif     }      //打开输入(通过标志位控制回调那边做超时判断)     //其他地方调用 formatCtx->url formatCtx->filename 可以拿到设置的地址(两个变量值一样)     tryOpen = true;     QByteArray urlData = VideoHelper::getRightUrl(videoType, videoUrl).toUtf8();     int result = avformat_open_input(&formatCtx, urlData.data(), ifmt, &options);     tryOpen = false;     if (result < 0) {         debug("打开出错", "错误: " + FFmpegHelper::getError(result));         return false;     }      //根据自己项目需要开启下面部分代码加快视频流打开速度     //开启后由于值太小可能会出现部分视频流获取不到分辨率     if (decodeType == DecodeType_Fast2 && videoType == VideoType_Rtsp) {         //接口内部读取的最大数据量(从源文件中读取的最大字节数)         //默认值5000000导致这里卡很久最耗时(可以调小来加快打开速度)         formatCtx->probesize = 50000;         //从文件中读取的最大时长(单位为 AV_TIME_BASE units)         formatCtx->max_analyze_duration = 5 * AV_TIME_BASE;         //内部读取的数据包不放入缓冲区         //formatCtx->flags |= AVFMT_FLAG_NOBUFFER;     }      //获取流信息     result = avformat_find_stream_info(formatCtx, NULL);     if (result < 0) {         debug("找流失败", "错误: " + FFmpegHelper::getError(result));         return false;     }      //解码格式     formatName = formatCtx->iformat->name;     //某些格式比如视频流不做音视频同步(响应速度快)     if (formatName == "rtsp" || videoUrl.endsWith(".sdp")) {         useSync = false;     }      //设置了最快速度则不启用音视频同步     if (decodeType == DecodeType_Fast2) {         useSync = false;     }      //有些格式不支持硬解码     if (formatName.contains("rm") || formatName.contains("avi") || formatName.contains("webm")) {         hardware = "none";     }      //本地摄像头设备解码出来的直接就是yuv显示不需要硬解码     if (videoType == VideoType_Camera) {         useSync = false;         hardware = "none";     }      //过低版本不支持硬解码 #if (FFMPEG_VERSION_MAJOR < 3)     hardware = "none"; #endif      //发送文件时长信号(这里获取到的是秒)     duration = formatCtx->duration / AV_TIME_BASE;     duration = duration * 1000;     if (getIsFile()) {         //文件必须要音视频同步         useSync = true;         emit receiveDuration(duration);     }      QString msg = QString("格式: %1 时长: %2 秒 加速: %3").arg(formatName).arg(duration / 1000).arg(hardware);     debug("文件信息", msg);     return true; }  int FFmpegHelper::avinterruptCallBackFun(void *ctx) { #ifdef videoffmpeg     FFmpegThread *thread = (FFmpegThread *)ctx;     //2021-9-29 增加先判断是否尝试停止线程,有时候不存在的地址反复打开关闭会卡主导致崩溃     //多了这个判断可以立即停止     if (thread->getTryStop()) {         thread->debug("主动停止", "");         return 1;     }      //打开超时判定和读取超时判定     if (thread->getTryOpen()) {         //时间差值=当前时间-开始解码的时间(单位微秒)         qint64 offset = av_gettime() - thread->getStartTime();         int timeout = thread->getConnectTimeout() * 1000;         //没有设定对应值的话限定最小值3秒         timeout = (timeout <= 0 ? 3000000 : timeout);         if (offset > timeout) {             //thread->debug("打开超时", QString("设置: %1 当前: %2").arg(timeout).arg(offset));             return 1;         }     } else if (thread->getTryRead()) {         //时间差值=当前时间-最后一次读取的时间(单位毫秒)         QDateTime now = QDateTime::currentDateTime();         qint64 offset = thread->getLastTime().msecsTo(now);         int timeout = thread->getReadTimeout();         //没有设定对应值的话限定最小值3秒         timeout = (timeout <= 0 ? 3000 : timeout);         if (offset > timeout) {             //thread->debug("读取超时", QString("设置: %1 当前: %2").arg(timeout).arg(offset));             return 1;         }     } #endif     return 0; }

17岁中国天才少年不敌16号种子无缘澳网男单32强北京时间1月18日消息,2023赛季澳大利亚网球公开赛展开男单第二轮的较量。从资格赛突围的中国小将商竣程连丢三盘以464616不敌16号种子蒂亚弗,无缘第三轮。本届澳网男单赛场已无中国芯!紫光展锐V516获中国半导体创新和技术大奖手机中国新闻对于紫光展锐,可能大部分人都不太熟悉。根据手机中国掌握的信息,紫光展锐事实上是国内领先的半导体企业,也是国内少有的可以向智能手机厂商供应核心处理器的公司。在2022年,甘肃有座石窟,游客不多却藏中国第五大佛,还是蔚为壮观的世界遗产什么是炳灵寺石窟?要回答这个问题并不容易,首先需要从了解这座石窟的历史开始,根据法苑珠林文献记载,炳灵寺石窟的营造从晋泰始年开始,也就是公元265年,这样的开凿年代可是要比敦煌莫高(环境)诗意中国吹落琼花满世间凛凛冬日,寒潮来袭。近日,我国迎来大范围降温降雪天气,不知天上谁横笛,吹落琼花满世间,神州大地银装素裹,蔚为壮美。1月17日拍摄的湖南省湘西土家族苗族自治州龙山县大安乡翻身村雪景(何为恋童癖?这些人内心有多变态?家长请正确引导性教育恋童癖是指爱恋儿童的一种变态行为,是一种心理疾病,这种问题多发生在5岁到12岁之间的女孩和男孩之间。主要是熟人作案。因为他们有足够的时间和大把的机会,即便孩子再怎么解释,家长也不会科普丨你家的熊孩子可能是多动症?你们家的小朋友是否也有这样的问题上课爱做小动作,不遵守纪律,还会打扰其他同学听课上课不听讲,回家写作业什么也不知道上课坐不住,课间总是打闹,老师经常找家长学习跟不上,写作业拖拖拉拉韩国父母虐待1岁养女致死!把孩子当发泄工具殴打!令人作呕1岁婴儿,被养父母用棍子殴打,还用刀子割肉。甚至,她还被当作肉垫养母从沙发上跳下来狠狠踩踏,胰腺全部破裂!她在医院被抢救时,养父母在上节目,赚得盆满钵满。最离谱的是,这对养父母,竟孩子的玻璃心要怎么有效预防?前几天刷到一个美国心理咨询师的视频,提及预防孩子玻璃心需要从小给孩子灌输三句话1妈妈(爸爸)看到你已经很努力了,不过暂时没成功,这很正常,你能承受多大的失败,未来就能取得多大的成功嗨,星战克隆人粉们,是不是有时候记不清部队编号,看看盘点吧!1,第一必须给到大名鼎鼎的501男团啦,501军团由安那金天行者指挥,人员素质和质量跟其他军团相比较高,参加过第一次和第二次吉奥诺西斯战役,昂巴拉战役等等,一直存在到到第二次雅汶战喝水太多会中毒!多喝水,更要会喝水!感冒了,多喝水痛经了,多喝水便秘了,多喝水腹泻了,多喝水有事没事多喝水。似乎,多喝水就能解决一切问题水是喝得越多越好吗?有些朋友问,感冒了就不停地喝水,这样是不是就能够起到防治感冒肝气顺畅,宗筋有力,男子疲软,从肝论治,效果显著一说起男子身体虚,很多人第一反应就是肾虚了,其实在中医的范畴里,导致男性功能障碍的不仅仅只有肾虚,这也就是为什么很多患者虚了之后去补肾,却始终不见效果的原因。今天我们就讲一下肝对男
中国唯一被封禁千年的地方,任何人都不能进入,山水不输桂林一座被仙气接管的山,一座远离尘世的仙城!古往今来,中华大地广袤的山川河流中诞生了不少的禁区,严禁寻常人等出入。像在江西就有这么一座山,险峻兀傲,风景如画,却被封禁千年。被封之初,唐2023年性价比正规流量卡对比流量卡测评电信破冰卡编辑切换为全宽添加图片注释,不超过140字(可选)电信破冰卡免费领取电信破冰卡19元130G大流量长期套餐流量可转结httpsgantanhao。vipwebappmer重庆首趟团体旅客列车出发后续还将加开10余趟来源重庆日报网3月9日22时18分,3355次旅客列车载着600余名游客从重庆北站始发,驶往深圳东站,这是重庆地区今年加开的首趟团体旅客列车。旅客登上3355次旅客列车。通讯员王成一场在香港举办的颁奖典礼,暴露了对内地明星的恶近日,第16届亚洲电影节在香港举办,迎来了一场精彩的视觉盛宴,但随之而来的还有一些争议。亚洲电影节是中,日,韩三地重要的颁奖典礼,参展的电影来自多地,不少优秀的日本,韩国和国内电影吴千语出席香港名媛聚会,表现从容淡定,未嫁豪门已融入名流圈3月12日,香港名媛NellChen在个人社交账号上分享了聚会同框照,并留言透露出席了一场名流聚会。曝光的照片中,众人盛装现身,除了NellChen,还有多位名媛出镜,包括佳士得亚代表委员访谈丨全国人大代表曾超群突出硅钢主攻方向加速产业转型升级曾超群代表。湖南日报全媒体记者唐俊摄湖南日报全媒体记者陈奕樊政府工作报告指出,推动产业向中高端迈进围绕制造业重点产业链,集中优质资源合力推进关键核心技术攻关。这为娄底加速产业转型推太突然了!又一集团爆雷,连续2个跌停,股价一落千丈最近这段时间,可以看到一个现象,有好几家上市公司业绩预告爆雷了。而有那么一家上市公司更有意思,一开始业绩还是预喜的,结果,才过去没多久,就改口了,业绩立刻从预喜变成了巨亏。而这一集重磅!多地公积金政策有变!多地住房公积金政策出现新的变化。中新经纬梳理发现,南京驻马店等地力推带押过户,扬州咸阳等地支持商转公,达州等地支持公积金付首付款等。一起看看你所在的地方有没有调整吧!资料图高瑞峰摄连续上调退休人员养老金,这五类人员会多涨,能不能涨200元呢?视频加载中根据2023年国务院政府工作报告显示,五年来我国切实保障和改善民生,加快社会事业发展,其中关于加强社会保障和服务主要体现在以下四个方面一是,通过建立基本养老保险基金中央调出现这种红色丘疹千万别大意,可能是血管瘤!宝宝身上刚开始就是一个小红点红血丝或是红色的斑片,以为很快就可以消退了,没想到它却在很短的时间内就长大了。患者父母怎么也没想到短短时间内红疹竟成了血管瘤!血管瘤初期症状就是表现为小从脑身心三方面引导儿童面对挫折如何引导儿童正确对待挫折陪伴与倾听挫折是生活中不可避免的一部分,而正确对待挫折对于儿童的成长和发展至关重要。以下是从脑身心三个方面来回答如何引导儿童正确对待挫折,并给出一些方法建议