音视频项目—基于FFmpeg和SDL的音视频播放器解析(十八)
介绍
在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器
如果您不理解本文,可参考我的前一篇文章音视频项目—基于FFmpeg和SDL的音视频播放器解析(十七)
解析
之前解析的 fill_audio_pcm 函数有点复杂,先不继续讲这个了。
我们讲最后一个类 videooutput,可见这是负责视频播放的函数,先看 .h 文件
#ifndef VIDEOOUTPUT_H_
#define VIDEOOUTPUT_H_#ifdef __cplusplus
extern "C"{
#include"libavutil/avutil.h"
#include"SDL.h"
#include"libavutil/time.h"
}
#endif#include"avframequeue.h"
#include"avsync.h"class VideoOutput{
public:VideoOutput(AVSync* avsync, AVRational time_base, AVFrameQueue* frame_queue, int video_width, int video_height);~VideoOutput();int Init();int MainLoop();void RefreshLoopWaitEvent(SDL_Event* event);
private:void videoRefresh(double* remaining_time);AVFrameQueue* frame_queue = nullptr;SDL_Event event;SDL_Rect rect;SDL_Window* win = nullptr;SDL_Renderer* renderer = nullptr;SDL_Texture* texture = nullptr;AVSync* avsync = nullptr;AVRational time_base;int video_width = 0;int video_height = 0;uint8_t* yuv_buf = nullptr;int yuv_buf_size = 0;
};#endif
公有成员,都是构造函数,析构函数,初始化函数,循环函数,等待函数。
私有成员有比较多,我们这篇文章解析一下。
void videoRefresh(double* remaining_time); 负责刷新的函数
AVFrameQueue* frame_queue = nullptr; 视频帧数据队列
SDL_Event event; SDL 事件
SDL_Rect rect; SDL rectangle
SDL_Window* win = nullptr; SDL 窗口
SDL_Renderer* renderer = nullptr; SDL 渲染器
SDL_Texture* texture = nullptr; SDL 纹理
AVSync* avsync = nullptr; 负责音视频同步的类
AVRational time_base; 用于计算时间戳与帧率
int video_width = 0; 视频窗口的宽度
int video_height = 0; 视频窗口的高度
uint8_t* yuv_buf = nullptr; 存放 yuv 数据的数组
int yuv_buf_size = 0; 存放 yuv 数据的数组长度
好了,这篇文章讲解了 VieoOutput 类的私有成员变量,下一篇文章开始讲解函数。
欲知后事如何,请听下回分解。
相关文章:
音视频项目—基于FFmpeg和SDL的音视频播放器解析(十八)
介绍 在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本…...
绿色能源守护者:光伏运维无人机
随着我国太阳能光伏产业被纳入战略性新兴产业,光伏发电成为实现“双碳”目标的关键之一。在政策支持下,光伏产业维持高速发展,为迎接“碳达峰、碳中和”大势注入了强大动力。在这一背景下,复亚智能与安徽一家光伏企业合作…...
i已学赋能智慧教育时代的幼儿教育
伴随“教育数字化战略行动”的深入开展,智慧教育正式成为国家战略。智慧教育延伸至家校社教育的每个阶段。当前,为适应智慧教育发展趋势,我国制定了《中国教育现代化2035》《教育部关于加强“三个课堂”应用的指导意见》《教育信息化2.0行动计划》等文件。幼儿作为智慧教育、智…...
[栈迁移+ret滑梯]gyctf_2020_borrowstack
题目来源buuctf——gyctf_2020_borrowstack 参考链接https://www.shawroot.cc/2097.html 题目信息ubuntu16、64位 第一个read仅溢出一个机器字长,需要栈迁移 解题步骤栈偏移到全局变量bank中,ret2libcgadget 关键步骤 ret滑梯 第二个payload需要添…...
PTA:用函数实现从数列中删除一个数
题目: 编写一个函数实现:删除n个元素的数列中下标为k的元素。 测试程序将输入一个下标值,调用本函数,删除数列{1,4,13,9,6,11,18,14,25}中该下标位置的元素,并输出删除后的数列。 函数接口定义: void de…...
C++设计模式之工厂模式(中)——工厂模式
工厂模式 工厂模式介绍示例示例使用运行结果工厂模式与简单工厂模式区别 工厂模式 工厂模式在简单工厂模式的基础之上进行了改进。当需要生产的产品种类增加,可以通过新增子类工厂来生产,没有破坏程序设计原则中的开放封闭原则。 介绍 工厂模式先抽象…...
关于el-table的二次封装及使用,支持自定义列内容
关于el-table的二次封装及使用 table组件 <template><el-table ref"tableComRef" :data"tableData" border style"width: 100%"><el-table-column v-if"tableHeaderList[0]?.type selection" type"selection&…...
【Vue】Vue3 配置全局 scss 变量
variables.scss $color: #0c8ce9;vite.config.ts // 全局css变量css: {preprocessorOptions: {scss: {additionalData: import "/styles/variables.scss";,},},},.vue 文件使用...
C语言—二维数组
一、二维数组的创建 int arr[3][4];char arr[3][5];double arr[2][4]; 数组创建:“[ ]”中要给一个常量,不能使用变量 二、二维数组的初始化 int arr[3][4]{1,2,3,4};int arr[3][4]{{1,2},{4,5}};int arr[][4]{{2,3},{4,5}}; 前面的为行,…...
GUI加分游戏
需求目标 这个简单的游戏窗口包含一个得分标签和一个按钮。每次点击按钮时,得分增加1,并更新得分标签的显示。 效果 源码 /*** author lwh* date 2023/11/28* description 这个简单的游戏窗口包含一个得分标签和一个按钮。每次点击按钮时,…...
多线程的重要资料-信号量
(1)https://www.cnblogs.com/ike_li/p/8984186.html (2)C#关于AutoResetEvent的使用介绍 | 康瑞部落 (3)AutoResetEvent用法(一)_autoresetevent 的用法-CSDN博客 (4)c++ - Is there an easy way to implement AutoResetEvent in C++0x? - Stack Overflow (5)...
区块链相关技术、概念以及技术实现过程中的一些关键问题 Smart Contracts and Blockchains
作者:禅与计算机程序设计艺术 1.简介 2017年底,区块链已经成为众多投资人和技术人员最关注的话题之一。随着现实世界的不断复杂化、数字货币的流行以及IoT设备的普及,加密数字货币市场正变得越来越活跃。由于区块链具有去中心化、不可篡改、透明性、高并发等特点,使其在金…...
黑马点评Redis笔记
黑马点评Redis笔记 Redis基础篇:https://cyborg2077.github.io/2022/10/21/RedisBasic/ Redis实战篇:https://cyborg2077.github.io/2022/10/22/RedisPractice/ 一、手机号验证码注册登录 RandomUtil 生成定长随机数列 String code RandomUtil.ran…...
MX6ULL学习笔记 (一)交叉工具链的安装
前言: ARM 裸机、Uboot 移植、Linux 移植这些都需要在 Ubuntu 下进行编译,编译就需要编译 器,Ubuntu 自带的 gcc 编译器是针对 X86 架构的!而我们现在要编译的是 ARM 架构的代码,因为我们编译的代码是需要烧写到ARM板子…...
uni-app中的onLoad不执行
问题 想在onLoad()中发请求获取数据,却发现onLoad()根本不会执行 原因 这个页面没有在pages.json中配置,不属于uni-app中的页面 uni-app的文档也做出了说明,组件是无法使用页面级的onLoad等生命周期的 解决方法 uni-app除支持页面生命周…...
EFAK-v3.0.1版部署与使用
一、前言 EFAK((Eagle For Apache Kafka,以前称为Kafka Eagle)用于在使用 Topic 的情况下监控 Kafka 集群。包含Offset 的产生、Lag的变化、Partition的分布、Owner、Topic的创建以及修改的时间等信息。 二、环境&安装包 官方下载连接E…...
股票技术从初级到高级,从实盘进阶到摩尔缠论
一、教程描述 摩尔缠论是什么?一个伟大的缠论分支体系,由顶尖高手创立的缠论分支,这个顶尖高手,江湖上的代号为摩尔,可能是一个人,或者是一群人。摩尔缠论,基于缠论的核心思想与基础理论&#…...
力扣105. 从前序与中序遍历序列构造二叉树
栈 思路: 先序遍历:根、左子树、右子树;中序遍历:左子树、根、右子树;遍历先序遍历数组 prev,使用一个辅助栈缓存“根节点”;通过栈顶“根节点”与中序遍历数组 in 比较,确认是否到…...
Windows环境下的JDK安装与环境配置
一、JDK下载 1、打开Oracle官方网站下载页 Java Downloads | Oracle 中国 2、选择Java archive页,在版本列表中选择需要下载的版本 3、选择系统环境对应的版本,点击对应的下载按钮,弹出技术许可勾选框 4、勾选Oracle技术许可协议 5、输入Or…...
【密码学引论】Hash密码
第六章 Hash密码 md4、md5、sha系列、SM3 定义:将任意长度的消息映射成固定长度消息的函数功能:确保数据的真实性和完整性,主要用于认证和数字签名Hash函数的安全性:单向性、抗若碰撞性、抗强碰撞性生日攻击:对于生日…...
零基础部署MinerU 2.5-1.2B镜像:轻松实现PDF高质量结构化提取
零基础部署MinerU 2.5-1.2B镜像:轻松实现PDF高质量结构化提取 1. 引言 1.1 为什么需要PDF结构化提取 在日常工作和学习中,PDF文档是最常见的信息载体之一。然而,当我们需要从PDF中提取内容时,经常会遇到以下问题: …...
从流量包到攻击画像:一次APT攻击的深度取证WriteUp
1. 从流量包到攻击画像:APT攻击取证实战 那天下午接到应急响应通知时,我正在喝第三杯咖啡。客户发来的压缩包里只有一个5MB的pcap文件,但我知道这里面可能藏着整个攻击链条的关键证据。作为安全分析师,我们就像网络空间的法医&am…...
Python FastAPI 高并发项目结构
Python FastAPI 高并发项目结构解析 在当今高并发的互联网应用中,选择高效的框架和合理的项目结构至关重要。Python的FastAPI凭借其异步支持、高性能和简洁的语法,成为构建高并发服务的理想选择。仅靠框架本身无法充分发挥其潜力,合理的项目…...
一文搞懂 Spring Cloud:从入门到实战的微服务全景指南(建议收藏)妥
一、中间件是啥?咱用“餐厅”打个比方 想象一下,你的FastAPI应用是个高级餐厅。 ?? 顾客(客户端请求)来到门口。- 迎宾(CORS中间件):先看你是不是从允许的街区(域名)来…...
STM32F1轻量级USB HID键盘鼠标复合设备固件库
1. 项目概述KeyboardMouse 是一个面向 STM32F1 系列微控制器的轻量级 USB HID(Human Interface Device)固件库,专为实现复合型 USB 键盘与鼠标设备而设计。该库不依赖第三方 USB 协议栈(如 ST 的 USB Device Library 或 Keil ARM …...
Linux I/O 演进史:从管道到零拷贝,一篇串起个服务端核心原语右
前言 在使用 kubectl get $KIND -o yaml 查看 k8s 资源时,输出结果中包含大量由集群自动生成的元数据(如 managedFields、resourceVersion、uid 等)。这些信息在实际复用 yaml 清单时需要手动清理,增加了额外的工作量。 使用 kube…...
兼容FX3U源码的大神级编程资料:增加以太网下载功能,支持MODBUS-TCP与定位指令集
18650锂电池高温热失控引言 在工业控制、汽车电子和分布式系统领域,CAN(Controller Area Network)总线因其高可靠性、实时性和抗干扰能力而成为首选通信协议。本文深入分析基于STM32F10x微控制器的CAN网络通信模块,重点解析其如何…...
避坑指南:调整Intel/AMD平台PCIe超时设置前,你必须知道的CPU内部Timer架构
深入解析Intel/AMD平台PCIe超时机制:系统架构师必须了解的CPU内部Timer设计 在当今高性能计算和低延迟网络应用中,PCIe设备的稳定性和性能优化成为系统架构师面临的核心挑战之一。当FPGA加速卡突然停止响应,或者100G网卡出现间歇性数据丢失时…...
Java架构师知识框架总结
Java架构师的核心定位是“技术决策者、系统设计者、问题解决者”,需具备“广度深度”的知识储备,既要精通Java核心技术,也要掌握架构设计思维、工程化落地能力,同时能结合业务场景做出最优技术决策。以下是完整的知识框架…...
3分钟搞定Windows和Office激活:KMS_VL_ALL_AIO完全指南
3分钟搞定Windows和Office激活:KMS_VL_ALL_AIO完全指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活烦恼吗?还在为Office办公软件过期而头疼&am…...
