【音视频】ffplay源码解析-FrameQueue队列

news2025/2/24 2:58:49

帧队列架构位置

在这里插入图片描述


结构体源码

FrameQueue结构体

/* 这是一个循环队列,windex是指其中的首元素,rindex是指其中的尾部元素. */
typedef struct FrameQueue {
    Frame	queue[FRAME_QUEUE_SIZE];        // FRAME_QUEUE_SIZE  最大size, 数字太大时会占用大量的内存,需要注意该值的设置
    int		rindex;                         // 读索引。待播放时读取此帧进行播放,播放后此帧成为上一帧
    int		windex;                         // 写索引
    int		size;                           // 当前总帧数
    int		max_size;                       // 可存储最大帧数
    int		keep_last;                      // = 1说明要在队列里面保持最后一帧的数据不释放,只在销毁队列的时候才将其真正释放
    int		rindex_shown;                   // 初始化为0,配合keep_last=1使用
    SDL_mutex	*mutex;                     // 互斥量
    SDL_cond	*cond;                      // 条件变量
    PacketQueue	*pktq;                      // 数据包缓冲队列
} FrameQueue;

Frame结构体

// 用于缓存解码后的数据
typedef struct Frame {
    AVFrame		*frame;         // 指向数据帧
    AVSubtitle	sub;            // 用于字幕
    int		serial;             // 帧序列,在seek的操作时serial会变化
    double		pts;            // 时间戳,单位为秒
    double		duration;       // 该帧持续时间,单位为秒
    int64_t		pos;            // 该帧在输入文件中的字节位置
    int		width;              // 图像宽度
    int		height;             // 图像高读
    int		format;             // 对于图像为(enum AVPixelFormat),
                                // 对于声音则为(enum AVSampleFormat)
    AVRational	sar;            // 图像的宽高比(16:9,4:3...),如果未知或未指定则为0/1
    int		uploaded;           // 用来记录该帧是否已经显示过?
    int		flip_v;             // =1则旋转180, = 0则正常播放
} Frame;

内存管理

  • 一个环形循环数组队列
    • 数组队列适合于事先明确了缓冲区的最⼤容量的情形
    • 避免假队空----定义一个size
  • 写端位于解码线程,读端位于播放线程
  • 锁机制—线程安全

引申知识点—队列假队空

概念

如果只用一个连续数组表示一个队列,没有其他标志位

  • 队空:头指针==尾指针
  • 队满:头指针==尾指针

则无法判断队列状态是队满还是队空

解决办法

一共有三种解决办法

  • 方法1:数组最后一个空间不存放元素
  • 方法2:加一个当前元素数量size
  • 方法3:加一个队满标志位flag

队列大小设置

因为这⾥存储的是解码后的数据,队列缓存不宜设置过⼤

一般为限制缓存

视频帧队列<=3

音频帧队列<=9

字幕帧队列<=16

在这里插入图片描述

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

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

相关文章

第二证券:什么是a股b股?

在我国的股市中&#xff0c;我们经常会听到“A股”和“B股”这两个名词。那么&#xff0c;终究什么是A股和B股呢&#xff1f; 首先&#xff0c;A股全称为“A股票”&#xff0c;是指在我国境内上市的以人民币计价的股票。A股首要面向国内出资者&#xff0c;只要具有必定条件的内…

如何快速检测代理IP质量?方法与工具全干货

一直以来&#xff0c;IP代理都是出海跨境业务的刚需。质量好的IP代理&#xff0c;除了在跨境业务产生巨大作用&#xff0c;在SEO监控、爬虫抓取、市场研究等领域也发挥着很大的作用。但是&#xff0c;对于IP代理的质量检测是我们选择高标准IP代理的一句&#xff0c;我们一般都会…

美国零售电商平台Target,值得入驻吗?如何入驻?

Target 是美国最大的零售商之一&#xff0c;在品牌出海为大势所趋的背景下&#xff0c;它在北美电商中的地位节节攀升。Target 商店在众多垂直领域提供各种价格实惠的自有品牌&#xff0c;吸引越来越多的跨境商家入驻&#xff0c;如美妆、家居、鞋服、日用百货等&#xff0c;随…

Mybatis学习笔记12 分页插件

Mybatis学习笔记11 缓存相关_biubiubiu0706的博客-CSDN博客 (5) select distinct top(<取数说明>) <选择 列表> (1) from <表1> <连接类型> join <表2> ON <连接条件> (2) where <筛选条件> (3) group by <分组条件> (4) havi…

linux下链接

linux下链接用法 ln链接格式与介绍 linux下链接用法一、链接的使用格式二、链接的介绍 一、链接的使用格式 链接&#xff1a; 格式&#xff1a; ln 源文件 链接文件 硬链接 ln -s 源文件 链接文件 软连接 硬链接文件占磁盘空间 但是删除源文件不会影响硬链接文件 软链接文件不…

秒杀场景设计

1.活动页面静态化处理 没有到活动时间页面静态化处理避免访问服务端 2.使用cdn让用户可以获取就近的所需静态页面内容 3.限制用户同一时间点击次数 4.把商品库存提前放入redis&#xff0c;秒杀请求直接操作redis防止操作直接落库打崩数据库 5.使用lua脚本操作redis保证操作…

transformer系列2---transformer架构详细解析

transformer详细解析 Encoder1 输入1.1 Embedding 词嵌入1.1.1 Embedding 定义1.1.2 几种编码方式对比1.1.3 实现代码 1.2 位置编码1.2.1 使用位置编码原因1.2.2 位置编码方式1.2.3 位置编码代码 2 注意力 Attention2.1 自注意力self-attention2.1.1 QKV含义2.1.2 自注意力公式…

微信图文如何替换成自己的二维码?

二维码样式中的二维码目前都是小蚂蚁的二维码&#xff0c;如何替换成自己的二维码&#xff0c;其实也很简单&#xff0c;就像替换样式中的图片一样&#xff0c;首先点击二维码&#xff0c;选择工具条中的“换图”&#xff0c;然后在弹出来的框中填入二维码图片的链接地址或者直…

招股书更新9版终上市,飞沃科技能否躲过风电红利后的黯淡?

文丨熔财经 作者丨文泽 碳达峰、碳中和成为主旋律目标下&#xff0c;作为可再生能源主力的风电产业迎来了发展的“黄金时代”。与新能源相关的上下游企业也赚的“盆满钵满”。 在此背景下&#xff0c;飞沃科技(301232.SZ)历经4轮问询&#xff0c;更新9版招股书终于登陆资本市…

Command not found 解决方法

前言&#xff1a;要更新code上服务器用GUI失败&#xff0c;$ patch_delivery_gui&#xff0c;报错&#xff1a;patch_delivery_gui: command not found&#xff0c;上次编TA也是这个问题 写了个脚本&#xff1a;这个脚本会先检查ifconfig、firewall-cmd和vim命令是否可用&#…

ExcelServer EXCEL服务器使用- 用户、角色权限配置

Excel文件服务器搭建 搭建Excel服务器 1、登录 默认 用户名 Admin 密码 3 2、角色管理 添加修改角色 角色配置在 系统管理->角色.fexm文件夹下 可以像修改excel文件一样 修改角色 3、用户管理 添加修改用户 用户的修改在 系统管理->用户.fexm 可以像excel一样编辑用户…

27、Flink 的SQL之SELECT (窗口聚合)介绍及详细示例(4)

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

机器人中的数值优化(十七)—— 锥与对称锥

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考&#xff0c;主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等&#xff0c;本系列文章篇数较多&#xff0c;不定期更新&#xff0c;上半部分介绍无约束优化&#xff0c;…

http的网站进行访问时候自动跳转至https

通常情况下我们是用的都是http的路径&#xff0c;对于https的使用也很少&#xff0c;但是随着https的普及越来越多的域名访问需要用到https的&#xff0c;这个我们就演示怎么设置在我们对一个http的网站进行访问时候自动跳转至https下。 用到的工具及软件: 系统&#xff1a;wi…

规划基础知识

1 规划简介 在规划中&#xff0c;我们通过结合高精地图&#xff0c;定位和预测来构建车辆轨迹。 规划的第一步就是路线导航&#xff0c;侧重于如何从地图上的A前往B&#xff0c;在进行路径规划时&#xff0c;将地图数据作为输入&#xff0c;并输出可行驶路径。 在Apollo中&…

亚马逊商品详情数据接口

亚马逊商品详情数据接口可以用于获取商品详情信息&#xff0c;包括但不限于商品ID、商品标题、商品描述等。这些信息可以用于多种用途&#xff0c;例如&#xff1a; 了解商品信息&#xff0c;帮助消费者做出购买决策。整合其他平台或网站的数据&#xff0c;提供全面的商品信息…

成集云 | 金蝶云星空与旺店通ERP集成(旺店通主管供应链)| 解决方案

源系统成集云目标系统 方案介绍 金蝶云星空是一款ERP企业管理软件&#xff0c;致力于为企业提供整体解决方案。金蝶财务软件种类功能齐全&#xff0c;能够全面满足企业的不同阶段、不同功能需求。帮助企业建立规范的业务流程&#xff0c;提升管理能力&#xff0c;降…

怎么设置IP白名单

IP白名单是一种网络安全机制&#xff0c;用于限制只允许特定的IP地址或IP地址范围通过访问控制。在本文中&#xff0c;我将详细解释IP白名单的概念、用途以及如何设置IP白名单。 **1. 什么是IP白名单&#xff1f;** IP白名单是一种访问控制列表&#xff0c;它允许或阻止特定的…

Django Web开发入门基础

官方有很详细的文档&#xff0c;但是看过几遍之后如果要翻找还是有点麻烦&#xff0c;本文算作是学习笔记&#xff0c;提取一些关键点记录下来&#xff0c;另附上官方教程 Writing your first Django app 注&#xff1a; 文中的指令使用py&#xff0c;是在Windows上&#xff0c…

室外配电箱防护等级总结、基础大样图

一、室外配电箱防护等级规范条文归纳&#xff1a; 1、《城市夜景照明设计规范》JGJ/T 163-2008&#xff0c;8.3.5&#xff1a; 照明设备所有带电部分应采用绝缘、遮拦或外护物保护&#xff0c;距地面2.8m以下的照明设备应使用工具才能打开外壳进行光源维护。室外安装照明配电箱…