播放器缓存队列bug解决方案

背景

我在开发一个播放器的缓存队列时,遇到一个bug,导致包和帧无法被下一个模块读取

找了半天,原来是队列中的包和帧数据要进行内容的刷新暂存

包数据和帧数据不能直接放入队列

//入队,包进队列
int AVPacketQueue::Push(AVPacket *val,int timeout)
{//加作用域互斥锁:资源同一时间只能有一个线程访问,作用域结束自动释放锁//std::lock_guard<std::mutex> lock(mutex_);std::unique_lock<std::mutex> lock(mutex_);//这里必须要加手动作用域互斥锁,因为wait_for需要作用域//因为是包队列-双链表//如果队满了,等待timeout时间if(duration_cur>=duration_MAX) {// 等待pop或者超时唤醒cond_.wait_for(lock, std::chrono::milliseconds(timeout), [this] {return duration_cur<duration_MAX;});}//如果依然队满,就直接返回-1if(duration_cur>=duration_MAX){return -1;}//入队:出现问题的代码,这里是直接把包指针存放到队列中了,但是在ffmpeg中不能直接存放,必须要先搞一个新包,然后刷新暂存数据queue_.push(val);//增加队列缓存时间,强转成mslong ms = static_cast<long>(av_rescale(val->duration, 1000, AV_TIME_BASE));this->duration_cur+=ms;cond_.notify_one();//条件变量:通知其他线程可以继续执行return 0;
}

解决方案

//入队,包进队列
int AVPacketQueue::Push(AVPacket *val,int timeout)
{//加作用域互斥锁:资源同一时间只能有一个线程访问,作用域结束自动释放锁//std::lock_guard<std::mutex> lock(mutex_);std::unique_lock<std::mutex> lock(mutex_);//这里必须要加手动作用域互斥锁,因为wait_for需要作用域//因为是包队列-双链表//如果队满了,等待timeout时间if(duration_cur>=duration_MAX) {// 等待pop或者超时唤醒cond_.wait_for(lock, std::chrono::milliseconds(timeout), [this] {return duration_cur<duration_MAX;});}//如果依然队满,就直接返回-1if(duration_cur>=duration_MAX){return -1;}//入队:一定注意,必须要重新申请空间,不然会指向同一段地址,而且后面要释放对应的数据包av_packet_freeAVPacket *tmp_packet = av_packet_alloc();av_packet_move_ref(tmp_packet, val);queue_.push(tmp_packet);//增加队列缓存时间,强转成mslong ms = static_cast<long>(av_rescale(val->duration, 1000, AV_TIME_BASE));this->duration_cur+=ms;cond_.notify_one();//条件变量:通知其他线程可以继续执行return 0;
}

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

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

相关文章

Linux基础命令(二)

1.ls命令 命令格式&#xff1a; ls -a -l -h Linux路径 &#xff08;1&#xff09; 直接使用ls&#xff0c;不加选项和参数。 ls 将会以平铺形式&#xff0c;列出当前文件夹下的内容&#xff1a; &#xff08;2&#xff09;加上参数 ls / 将会列出/目录下的内容。 -a选项…

JVM垃圾回收算法介绍

堆的分代和区域 &#xff08;年轻代&#xff09;Young Generation&#xff08;eden、s0、s1 space&#xff09; Minor GC &#xff08;老年代&#xff09;Old Generation &#xff08;Tenured space&#xff09; Major GC|| Full GC &#xff08;永久代&#xff09;Permanent…

关注用户信息卡片

效果展示 CSS 知识点 box-shadow 属性回顾CSS 变量回顾 实现页面整体布局 <div class"card"><div class"box"><!-- 视频 --><div class"vide_box"><video src"user.mp4" type"video/mp4" aut…

UDP与TCP协议

很抱歉&#xff0c;我之前写好的UDP与TCP文章不小心被删了&#xff0c;所以&#xff0c;这篇文章只有一半&#xff0c;后面我会尽快补全。 在完成HTTPS的学习后&#xff0c;我们就完成了应用层的所有讲解&#xff0c;下面我们开始讲解传输层&#xff0c;这一层常用的协议为TCP…

什么是CSGO大行动,2023年CSGO大行动时间预测

什么是CSGO大行动&#xff0c;2023年CSGO大行动时间预测 什么是CSGO大行动&#xff0c;2023年CSGO大行动时间预测 那天群里在提大行动&#xff0c;不明所以的新同学在问&#xff0c;什么是大行动&#xff0c;是不是官方红锁大行动要来了&#xff1f;当然不是&#xff0c;别自己…

Springboot高频应用注解

本文旨在记录开发中遇到的SpringBoot高频注解&#xff0c;并针对其具体应用记录。 一、LOMBOK相关注解 Slf4j 目的在于使用Log的日志功能&#xff0c;可以在JAVA中自动生成日志记录器&#xff01;使用时在类上添加Slf4j注解后即可以在类中调用log方法如 可以 调用 log.info …

面试十分钟不到就被赶出来了,问的实在是太变态了...

从外包出来&#xff0c;没想到算法死在另一家厂子 自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到8月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有个兄弟内…

云计算:掌控未来,一触即发!

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是尘缘&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f449;点击这里&#xff0c;就可以查看我的主页啦&#xff01;&#x1f447;&#x…

springboot时间管理系统springboot47

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…

Linux笔试面试题

Linux笔试面试题 1、Linux的锁机制&#xff1f; 1、互斥锁&#xff1a;mutex&#xff0c;保证在任何时刻&#xff0c;都只有一个线程访问该资源&#xff0c;当获取锁操作失败时&#xff0c;线程进入阻塞状态&#xff0c;等待所释放。 2、读写锁&#xff1a;rwlock&#xff0c;…

从培训班出来之后找工作的经历,教会了我五件事.....

我是非计算机专业&#xff0c;由于专业不好实习急着就业有过一些失败的工作经历后&#xff0c;跑去参加培训进入IT这行的。 之前在报名学习软件测试之前我也很纠结&#xff0c;不知道怎么选择机构。后面看到有同学在知乎上分享自己的学习经历&#xff0c;当时对我的帮助很大。…

美芯片禁令再次扩大,波及英伟达、AMD以及intel等科技公司 | 百能云芯

拜登政府17日宣布&#xff0c;计划停止英伟达&#xff08;Nvidia&#xff09;、超微半导体以及英特尔等科技公司设计的先进AI芯片输出中国大陆&#xff0c;英伟达&#xff08;Nvidia&#xff09;昨日股价重挫4.68%至每股439.38美元&#xff1b;天风国际证券分析师郭明錤表示&am…

Elasticsearch介绍及插件head和kibana下载

目录标题 一、Elasticsearch介绍二、Elasticsearch下载三、Elasticsearch-head四、Elasticsearch-kibana 一、Elasticsearch介绍 Elasticsearch是什么? Elasticsearch 是一个基于Lucene的分布式搜索和分析引擎&#xff0c;ES是elaticsearch简写&#xff0c;Elasticsearch是一…

解决vue3 + vite + ts 中require失效的问题(require is not defind)

require is not defind因为require是属于webpack的方法&#xff0c;vite中找不到这个方法肯定报错 解决办法 通过vite官网了解到新的引入方式&#xff0c;我使用了其中一种 imgList: [{name: "lj",src: new URL(../../assets/img/applyList.png, import.meta.url).…

图像检索算法 计算机竞赛

文章目录 1 前言2 图像检索介绍(1) 无监督图像检索(2) 有监督图像检索 3 图像检索步骤4 应用实例5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 图像检索算法 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff…

.npmrc 使用详解

配置.npmrc之后需要&#xff1a; 清理项目目录中的 node _modules 目录(package-lock.json,umi)。清理 node cache: npm cache clear --force&#xff1b;{ 此步骤必须&#xff0c;主要是大家的电脑经过多年使用后&#xff0c;npm 配置比较混乱&#xff0c;为了避免或者减少配…

监听子组件props变量的变化

如果你需要监听 props 值的变化,可以使用一个计算属性来实现。计算属性会自动监听 props 对象的变化,并在依赖的 props 发生变化时触发相应逻辑。 props: { count: { type: Number, default: 0 } }, computed: { countWatcher: function() { // 在计算属性中可…

LLM 系列 | 21 : Code Llama实战(上篇) : 模型简介与评测

引言 小伙伴们好&#xff0c;我是《小窗幽记机器学习》的小编&#xff1a;卖热干面的小女孩。 个人CSDN首页&#xff1a;JasonLiu1919_面向对象的程序设计,深度学习,C-CSDN博客 今天开始以2篇小作文介绍代码大语言模型Code Llama。上篇主要介绍Code Llama的基本情况并基于Hug…

怎么多号发圈和批量加好友?

你知道怎么多号发圈和批量加好友吗&#xff1f; 我们都知道&#xff0c;微信号多&#xff0c;管理起来是一件相当麻烦的事。 那发圈和加好友&#xff0c;多号的话&#xff0c;那是相当大的工作量&#xff0c;那有没有什么办法可以多号同时进行发圈和加人吗&#xff1f; 当然有的…

Linux高性能服务器编程 学习笔记 第十六章 服务器调制、调试和测试

Linux平台的一个优秀特性是内核微调&#xff0c;即我们可以通过修改文件的方式来调整内核参数。 服务器开发过程中&#xff0c;可能会碰到意想不到的错误&#xff0c;一种调试方法是用tcpdump抓包&#xff0c;但这种方法主要用于分析程序的输入和输出&#xff0c;对于服务器的…