ffplay简介
本文为相关课程的学习记录,相关分析均来源于课程的讲解,主要学习音视频相关的操作,对字幕的处理不做分析
ffplay播放器的意义
ffplay.c是FFmpeg源码⾃带的播放器,调⽤FFmpeg和SDL API实现⼀个⾮常有⽤的播放器。
ffplay实现了播放器的主体功能,掌握其原理对于我们独⽴开发播放器⾮常有帮助。
ffplay大致框架

播放初始化
- 初始化packet queue
- 初始化frame queue
- 初始化外部时钟clock
- 创建数据读取线程read frame
线程的划分
- 数据读取线程
- 打开媒体⽂件
- 开对应码流的decoder以及初始化对应的audio、video、subtitle输出队列
- 创建decoder线程,audio、video和subtitle的解码线程独⽴
- 调⽤av_read_frame读取packet,并根据steam_index放⼊不同stream对应的packet队列
- ⾳频解码
- 从packet queue读取packet,解出frame后放⼊frame queue
- 视频解码
- 从packet queue读取packet,解出frame后放⼊frame queue
- 字幕解码
- 从packet queue读取packet,解出frame后放⼊frame queue
- ⾳频播放(或者回调函数)
- 从frame queue读取frame进⾏播放
- 视频播放(ffplay⽬前是在main主线程进⾏视频播放)
- 从frame queue读取frame进⾏播放
- 字幕播放
- ffplay⽬前是在main主线程进⾏字幕播放) 从frame queue读取frame进⾏播放
- 控制响应(播放/暂停/快进/快退等)(ffplay⽬前是在main主线程进⾏播放控制 event loop)
packet队列的设计
- 线程安全,⽀持互斥、等待、唤醒
- 缓存数据⼤⼩
- 缓存包数
- 队列播放可持续时间
- 进队列/出队列等
frame队列的设计
- 线程安全,⽀持互斥、等待、唤醒
- 缓存帧数
- ⽀持读取数据⽽不出队列
- 进队列/出队列等
⾳视频同步
- ⾳频同步
- 视频同步
- 外部时钟同步
相关文章:
ffplay简介
本文为相关课程的学习记录,相关分析均来源于课程的讲解,主要学习音视频相关的操作,对字幕的处理不做分析 ffplay播放器的意义 ffplay.c是FFmpeg源码⾃带的播放器,调⽤FFmpeg和SDL API实现⼀个⾮常有⽤的播放器。 ffplay实现了播…...
mysql之limit语句详解
一、介绍 LIMIT是MySQL内置函数,其作用是用于限制查询结果的条数。 二、使用 1. 语法格式 LIMIT [位置偏移量,] 行数 其中,中括号里面的参数是可选参数,位置偏移量是指MySQL查询分析器要从哪一行开始显示,索引值从0开始ÿ…...
4.while循环
1、while语句的语法结构如下: while语句可以在条件表达式为真的前提下,循环执行指定的一段代码,直到表达式不为真时结束循环。 1.1while语法结构 while(条件表达式){// 循环体} 执行思路: 1、执行思路 当条件表达式结果为tru…...
【雕爷学编程】 MicroPython动手做(35)——体验小游戏2
知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…...
mouseover 和 mouseenter
mouseover 和 mouseenter 事件是 JavaScript 中常用的两个鼠标事件,它们有一些区别: 触发条件: mouseover 事件在鼠标指针从元素外部进入元素内部时触发,包括子元素。换句话说,只要鼠标进入元素或其子元素,就会触发 mo…...
[JavaScript游戏开发] 绘制Q版地图、键盘上下左右地图场景切换
系列文章目录 第一章 2D二维地图绘制、人物移动、障碍检测 第二章 跟随人物二维动态地图绘制、自动寻径、小地图显示(人物红点显示) 第三章 绘制冰宫宝藏地图、人物鼠标点击移动、障碍检测 第四章 绘制Q版地图、键盘上下左右地图场景切换 文章目录 系列文章目录前言一、本章节…...
CI/CD持续集成持续发布(jenkins)
1.背景 在实际开发中,我们经常要一边开发一边测试,当然这里说的测试并不是程序员对自己代码的单元测试,而是同组程序员将代码提交后,由测试人员测试; 或者前后端分离后,经常会修改接口,然后重新…...
Qt5.14.2+QtCreator+PDB 查看源码
1. 在Creator添加源码 2. 安装PDB文件 Qt下载时没有整合最新的PDB文件下载,如果没有安装PDB文件,即使安装了src也无法调试。 双击MaintenanceTool.exe->设置->资料档案库->临时资料档案库->添加按钮,添加如下下载源:…...
DOM基础获取元素+事件基础+操作元素
一.DOM简介 DOM,全称“Document Object Model(文档对象模型)”,它是由W3C定义的一个标准。 在实际开发中,我们有时候需要实现鼠标移到某个元素上面时就改变颜色,或者动态添加元素或者删除元素等。其实这些效…...
MATLAB——感知神经网络学习程序
学习目标:从学习第一个最简单的神经网络案例开启学习之路 感知器神经网络 用于点的分类 clear all; close all; P[0 0 1 1;0 1 0 1]; %输入向量 T[0 1 1 1]; %目标向量 netnewp(minmax(P),1,hardlim,lea…...
SpringBoot中事务失效的原因
SpringBoot中事务失效的原因 文章目录 SpringBoot中事务失效的原因一、事务方法非public修饰二、非事务方法调用事务方法三、事务方法的异常被捕获四、事务异常类型不对五、事务传播行为不对六、没有被Spring管理6.1、暴漏代理对象6.2、使用代理对象 常见的事务失效原因包括如下…...
Webstorm的一些常用快捷键
下面是Webstorm的一些常用快捷键: ctrl shift n: 打开工程中的文件,目的是打开当前工程下任意目录的文件。ctrl j: 输出模板ctrl b: 跳到变量申明处ctrl alt T: 围绕包裹代码(包括zencoding的Wrap with Abbreviation)ctrl []: 匹配 {}[]ctrl F1…...
系统集成项目成本管理
在项目中,成本是指项目活动或其组成部分的货币价值或价格,包括为实施、完成或创造该活动或其组成部分所需资源的货币价值。具体的成本一般包括直接工时、其他百接费用、间接工时、其他间接费用以及采购价格。 项目全过程所耗用的各种成本的总和为项目成本…...
Spring Boot整合ES的两种方式
使用Spring Data Elasticsearch Starter 在Spring Boot中整合Elasticsearch的方式之一是使用Elasticsearch的官方Spring Data Elasticsearch Starter。该Starter提供了对Elasticsearch的高级集成,简化了配置和管理Elasticsearch客户端。 下面是使用Spring Data E…...
Ajax_3 Ajax原理+ (XMLHttpRequest + Promise )+ 封装一个axios插件库,实现功能。
Ajax_3 Ajax原理 01-Ajax原理-XMLHttpRequest 使用XMLHttpRequest 步骤: 创建XMLHttpRequest对象配置请求方法请求url网址监听loadend事件,接受响应结果发起请求 需求:使用XMLHttpRequest对象与服务器通信 代码示例 // 1. 创建 XMLHttpReq…...
计算机网络(7) --- UDP协议和TCP协议
计算机网络(6) --- https协议_哈里沃克的博客-CSDN博客https协议https://blog.csdn.net/m0_63488627/article/details/132112683?spm1001.2014.3001.5501 目录 1.补充知识 1.PORT端口号 2.端口号范围划分 3.知名端口号 2.UDP协议 1.UDP报头 2.U…...
Jenkins 修改默认管理员帐号
1、新增一个新的超级管理员用户,并验证能正常登录 2、进入 Jenkins 用户管理目录: /data/software/jenkins/users 3、修改超级管理文件夹的名称为其他名称,如:mv admin_*** ifadm_*** 4、重启Jenkins容器...
FK-坦克大战制作(一)菜单制作
1、Cocos Creator新建2d项目 2.在资源管理器中新建场景menu 新建scences文件夹》新建场景》改名为menu 3.在层级管理器的Canvas下新建Layout节点,并在此节点下新建Label标签 4.双击Label,在属性检查器中进行编辑 5. 添加动画:(对文本进行放大…...
39.利用matlab寻找素数(matlab程序)
1.简述 MATLAB嵌套循环允许使用一个循环在另一循环内,下面用一个嵌套循环来把所有从1到100的素数显示出来。 2.代码 %% 学习目标:寻找素数 clear sum5; %求0~100素数之和 ss0; %用来标定是否是素数,0表示不是 p…...
卡尔曼滤波算法demo
代码 learn_kalman.py #codingutf-8 import numpy as np import time from kinematic_model import freedrop from controller import kalman_filterimport matplotlib.pyplot as plt # 支持中文 import matplotlib as mpl mpl.rcParams[font.family]SimHei plt.rcParams[a…...
Visual C++运行库修复终极指南:AIO打包方案解决Windows系统兼容性难题
Visual C运行库修复终极指南:AIO打包方案解决Windows系统兼容性难题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾遇到过打开游戏或软件时…...
【C/C++】libusb实战:从零构建ADB USB通信框架
1. 为什么需要自己实现ADB USB通信? 很多开发者第一次接触ADB时,都是直接使用官方提供的adb命令行工具。这个工具确实方便,但当你需要深度定制Android设备调试流程,或者开发自动化测试框架时,官方工具就显得不够灵活了…...
Cerebras即将IPO,246亿美元订单加身,能否挑战英伟达?
市值5.5万亿美元英伟达迎来强劲对手市值5.5万亿美元的英伟达,迎来了强劲对手。马上,芯片公司Cerebras就要在纳斯达克IPO。它的IPO价格定为189美元,募资55.5亿美元,估值达到564亿美元(约合人民币3800亿元)。…...
Cursor智能体工具包:从代码助手到自主编程代理的进化
1. 项目概述:从“智能代码补全”到“自主编程代理”的进化如果你和我一样,在过去一两年里深度使用过Cursor,那么你对它的第一印象大概率是“一个集成了AI的现代化代码编辑器”。它确实把智能代码补全、聊天式编程和代码理解做到了一个新高度&…...
AI驱动全栈开发:RapidFireAI如何实现端到端自动化与效率革命
1. 项目概述:当AI遇上“速射”,一个全栈开发者的效率革命最近在GitHub上闲逛,发现一个名字很酷的项目——RapidFireAI/rapidfireai。光看名字,“RapidFire”(速射)加上“AI”,就让人感觉这玩意儿…...
Go语言轻量级Web框架Copaweb:从设计哲学到实战部署全解析
1. 项目概述:一个轻量级Web应用框架的诞生最近在GitHub上闲逛,发现了一个挺有意思的项目,叫Copaweb,作者是leoalvesousa。乍一看这个名字,可能会联想到“世界杯”或者“奖杯”,但它的实际定位是一个用Go语言…...
前端学习打卡Day9:CSS 关系选择器、综合实战案例|古诗鉴赏网页制作
一、今日学习目标掌握 CSS四种关系选择器的语法、选择范围、使用场景,能区分后代 / 子代、邻接兄弟 / 通用兄弟选择器的差异。理解古诗网页案例的布局结构,能独立分析布局逻辑、读懂代码并知晓优化方向。能结合关系选择器优化网页样式,实现精…...
ESP32无人机飞控:从零到一的完整开源飞行器开发指南
ESP32无人机飞控:从零到一的完整开源飞行器开发指南 【免费下载链接】esp-drone Mini Drone/Quadcopter Firmware for ESP32 and ESP32-S Series SoCs. 项目地址: https://gitcode.com/GitHub_Trending/es/esp-drone 想要亲手打造一架能稳定飞行、可编程控制…...
抖音下载神器:如何一键批量保存无水印视频和音乐?
抖音下载神器:如何一键批量保存无水印视频和音乐? 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallbac…...
别再只会按回车了!ChatGPT换行、分段、写代码的3种正确姿势(含移动端技巧)
ChatGPT高效输入指南:从换行技巧到结构化表达的艺术 在数字创作与AI交互的时代,每个按键背后都藏着提升效率的秘密。当大多数人还在用原始的单行输入与ChatGPT对话时,掌握格式化输入技巧的用户已经获得了截然不同的交互体验——他们的代码保持…...
