当前位置: 首页 > news >正文

音视频项目—基于FFmpeg和SDL的音视频播放器解析(七)

介绍

在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器

如果您不理解本文,可参考我的前一篇文章音视频项目—基于FFmpeg和SDL的音视频播放器解析(六)

解析

我们这篇文章解析 decodethread 的四个函数,Init,Start,Stop,Run,如果您对于 decodethread 不是很了解,建议您先去看看上篇文章基于FFmpeg和SDL的音视频播放器解析(六)

Init 函数
int DecodeThread::Init(AVCodecParameters* par){if(!par){return -1;}codec_ctx = avcodec_alloc_context3(nullptr);int ret = avcodec_parameters_to_context(codec_ctx, par);if(ret < 0){return -1;}AVCodec* codec;if(codec_ctx->codec_id == AV_CODEC_ID_H264){codec = avcodec_find_decoder_by_name("h264_qsv");}else {codec = avcodec_find_decoder(codec_ctx->codec_id);}if(!codec){return -1;}ret = avcodec_open2(codec_ctx, codec, nullptr);if(ret < 0){return -1;}return 0;
}

这个初始化函数主要负责 AVCodecContext 的初始化。

首先,运用了 avcodec_alloc_context3 为 AVCodecContext 变量 codec_ctx 分配内存。

接着,我们可以看到 avcodec_parameters_to_context 函数,用于将一个 AVCodecParameters 结构体转换为 AVCodecContext 结构体。AVCodecParameters 是 FFmpeg 中用于表示编解码器参数的结构体,包含了编解码器的类型、比特率、帧率、分辨率等信息。而 AVCodecContext 是 FFmpeg 中用于表示编解码器上下文的结构体,包含了编解码器的状态、输入输出缓冲区等信息。

然后,我们需要找相应的解码器并且打开它。

于是,先做一个条件判断,如果解码器上下文的 codec_id 是 AV_CODEC_ID_H264,这是一个 H.264 编解码器的标识符,则通过 “h264_qsv” 的名字找编解码器。否则,调用 avcodec_find_decoder 函数查找合适 codec_ctx 的解码器。总体上,就是一个查找解码器的方法。

然后,就是打开操作了,avcodec_open2 就是打开解码器的操作,比较容易理解。

Start、Stop 函数
int DecodeThread::Start(){mythread = new thread(&Run, this);if(!mythread){return -1;}return 0;
}int DecodeThread::Stop(){Thread::Stop();
}

这段代码不长,比较好理解。

Start 函数就是 new 了一个线程,Stop 函数就是调用了父类 Thread 的 Stop,作用就是终止线程和释放资源。

好了,我们还剩下一个函数 Run,这比较多,我们下一篇文章再讲。

欲知后事如何,请听下回分解。

相关文章:

音视频项目—基于FFmpeg和SDL的音视频播放器解析(七)

介绍 在本系列&#xff0c;我打算花大篇幅讲解我的 gitee 项目音视频播放器&#xff0c;在这个项目&#xff0c;您可以学到音视频解封装&#xff0c;解码&#xff0c;SDL渲染相关的知识。您对源代码感兴趣的话&#xff0c;请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本…...

Sql Server 2017主从配置之:发布订阅

使用发布订阅模式搭建Sql Server 2017主从同步&#xff0c;类似事件通知机制&#xff0c;基本可以做到准实时同步&#xff0c;可以同时做到一对多的数据同步。 不过发布订阅模式&#xff0c;只能同时数据&#xff0c;不能同步表结构。在创建发布的时候&#xff0c;需要选择需要…...

聊聊logback的EvaluatorFilter

序 本文主要研究一下logback的EvaluatorFilter EvaluatorFilter ch/qos/logback/core/filter/EvaluatorFilter.java public class EvaluatorFilter<E> extends AbstractMatcherFilter<E> {EventEvaluator<E> evaluator;Overridepublic void start() {if …...

解决vue 部分页面缓存,部分页面不缓存的问题

前端时间项目迭代&#xff0c;其中有个需求 在vue里面&#xff0c;有a.b.c三个页面&#xff0c;要达到的效果是从a页面进去b页面&#xff0c;b页面需要刷新&#xff0c;但若从b页面进入c页面了以后再回到b页面&#xff0c;b页面需要保留之前的值&#xff0c;不做刷新&#xff1…...

修完这个 Bug 后,MySQL 性能提升了 300%

最近 MySQL 官方在 8.0.35 上修复了一个 bug&#xff1a; 这个 bug 是由 Mark Callaghan 发现的。Mark 早年在 Google MySQL 团队&#xff0c;后来去了 Meta MySQL&#xff0c;也主导了 RocksDB 的开发。 Mark 在 #109595 的 bug report 给出了非常详细的复现步骤 在官方修复后…...

【C/PTA】数组进阶练习(二)

本文结合PTA专项练习带领读者掌握数组&#xff0c;刷题为主注释为辅&#xff0c;在代码中理解思路&#xff0c;其它不做过多叙述。 目录 7-1 字符串逆序7-2 字符串替换7-3 统计字符出现次数7-4 IP地址转换7-1 删除重复字符7-2 说反话-加强版7-3 数组-回文串7-4 数组-无聊的菇菇…...

Mysql MMM

MMM概述 MMM(Master-Master replication manager for MvSQL&#xff0c;MySQL主主复制管理器&#xff09; 是一套支持双主故障切换和双主日常管理的脚本程序。 MMM 使用 Perl 语言开发&#xff0c;主要用来监控和管理MySQL Master-Master&#xff08;双主&#xff09;复制&…...

GDPU 数据结构 天码行空10

目录 数据结构实验十 树遍历应用一、【实验目的】二、【实验内容】三、【实验源代码】⭐ CPP版⭐ c语言版 四、实验结果 数据结构实验十 树遍历应用 一、【实验目的】 1、了解树的建立方法 2、掌握树与二叉树的转化及其遍历的基本方法 3、掌握递归二叉树遍历算法的应用 二、…...

CD36 ; + Lectin;

CD2 LIMP-2&#xff0c; LGP85 SR-BI&#xff0c; CD36&#xff1b; 清道夫受体蛋白CD36超家族的成员是 脂质代谢 和 先天免疫 的重要调节因子。它们识别正常和修饰的脂蛋白&#xff0c;以及与病原体相关的分子模式。 该家族由三个成员组成&#xff1a; SR-BI &am…...

Git 分支管理

目录 列出分支 删除分支 分支合并 合并冲突 几乎每一种版本控制系统都以某种形式支持分支&#xff0c;一个分支代表一条独立的开发线。 使用分支意味着你可以从开发主线上分离开来&#xff0c;然后在不影响主线的同时继续工作。 Git 分支实际上是指向更改快照的指针。 有…...

Vue23全局事件总线

Vue2&3全局事件总线 Vue2全局事件总线 功能&#xff1a;可以解决所有组件之间通信传数据的问题原理&#xff1a;通过一个共享对象&#xff0c;将所有组件全部绑定到对象上&#xff0c;即可通过这个对象实现组件与组件之间的传递数据&#xff0c;而这个共享对象叫做全局事件…...

GEM5 Garnet DVFS / NoC DVFS教程:ruby.clk_domain ruby.voltage_domain

简介 gem5中的 NoC部分是Garnet实现的&#xff0c;但是Garnet并没有单独的时钟域&#xff0c;而是保持ruby一致&#xff0c;要做noc的DVFS&#xff0c;便是要改ruby的 改电压 #这里只是生成一个随便变量名&#xff0c;存一下值。改是和频率一起的 userssaved_voltage_domain…...

java命令 jmap 堆参数分析

jmap -heap pid 展示pid的整体堆信息 bash-4.4# jmap -heap 10 Attaching to process ID 10, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.172-b11using thread-local object allocation. Garbage-First (G1) GC with 8 th…...

OpenCV C++ 图像处理实战 ——《OCR字符识别》

OpenCV C++ 图像处理实战 ——《OCR字符识别》 一、结果演示二、tesseract库配置2.1下载编译三、OCR字符识别3.1 文本检测方式3.1.1 RIL_BLOCK3.1.2 RIL_PARA3.1.3 RIL_TEXTLINE3.1.4 RIL_WORD3.1.5 RIL_SYMBOL3.2 英文文本检测3.3 中英文本检测四、源码测试图像下载总结一、结…...

在MySQL中创建新的数据库,可以使用命令,也可以通过MySQL工作台

摘要:在本教程中,你将学习如何使用MySQL CREATE DATABASE语句在MySQL数据库服务器上创建新数据库。 MySQL CREATE DATABASE语句简介 要在MySQL中创建新数据库,可以使用CREATE DATABASE语句。以下说明了CREATE DATABASE语句的基本语法: CREATE DATABASE [IF NOT EXISTS] …...

2311rust到31版本更新

1.27.1稳定版 在此修补程序前,下例在编译器内部恐慌. fn main() {let a vec!["".to_string()];a.iter().enumerate().take_while(|(_, &t)| false).collect::<Vec<_>>(); }1.27.1拒绝上述代码,并显示以下错误消息: error[E0507]: cannot move ou…...

【Python百宝箱】视觉算法秀:Python图像处理舞台上的巅峰对决

前言 在数字化时代&#xff0c;图像处理技术已经成为科技和计算机领域中不可或缺的一部分。从医学影像到计算机视觉&#xff0c;图像处理为我们提供了无限的可能性。Python作为一种灵活而强大的编程语言&#xff0c;在图像处理领域表现出色&#xff0c;拥有丰富的库和工具。本…...

Flutter 中在单个屏幕上实现多个列表

今天&#xff0c;我将提供一个实际的示例&#xff0c;演示如何在单个页面上实现多个列表&#xff0c;这些列表可以水平排列、网格格式、垂直排列&#xff0c;甚至是这些常用布局的组合。 下面是要做的&#xff1a; 实现 让我们从创建一个包含产品所有属性的产品模型开始。 …...

YOLOv8 加持 MobileNetv3,目标检测新篇章

🗝️YOLOv8实战宝典--星级指南:从入门到精通,您不可错过的技巧   -- 聚焦于YOLO的 最新版本, 对颈部网络改进、添加局部注意力、增加检测头部,实测涨点 💡 深入浅出YOLOv8:我的专业笔记与技术总结   -- YOLOv8轻松上手, 适用技术小白,文章代码齐全,仅需 …...

.gitignore 文件——如何在 Git 中忽略文件和文件夹详细教程

文章目录 什么是 .gitignore 文件&#xff1f;.gitignore 文件是用来做什么的&#xff1f;如何创建一个 .gitignore 文件&#xff1f;在 .gitignore 文件中应包括什么&#xff1f;如何在 Git 中忽略一个文件和文件夹如何忽略以前提交的文件 什么是 .gitignore 文件&#xff1f;…...

基于MATLAB Robotics Toolbox的机械臂轨迹规划仿真与数据可视化分析

基于MATLAB Robotics Toolbox的机械臂轨迹规划仿真与数据可视化分析 摘要 机械臂轨迹规划是机器人学研究的核心问题之一,直接影响工业机器人的作业精度、运动平稳性和工作效率。本文以六自由度PUMA560型机械臂为研究对象,利用Peter Corke开发的Robotics Toolbox for MATLAB…...

StructBERT情感分类镜像实操手册:supervisorctl服务管理教程

StructBERT情感分类镜像实操手册&#xff1a;supervisorctl服务管理教程 1. 快速了解StructBERT情感分类 StructBERT情感分类模型是一个专门针对中文文本情感分析的工具&#xff0c;基于阿里达摩院的StructBERT预训练模型进行微调。它能快速准确地判断一段中文文字表达的是积…...

告别系统资源占用困扰:sguard_limit智能优化工具实现性能提升全指南

告别系统资源占用困扰&#xff1a;sguard_limit智能优化工具实现性能提升全指南 【免费下载链接】sguard_limit 限制ACE-Guard Client EXE占用系统资源&#xff0c;支持各种腾讯游戏 项目地址: https://gitcode.com/gh_mirrors/sg/sguard_limit 在数字生活中&#xff0c…...

Python自动化脚本:高效实现CSV到Little_R格式的批量转换

1. 为什么需要CSV到Little_R格式的转换&#xff1f; 在日常数据处理工作中&#xff0c;我们经常会遇到需要将数据从一种格式转换为另一种格式的需求。特别是对于气象研究人员和数据工程师来说&#xff0c;CSV和Little_R这两种格式的转换尤为常见。CSV&#xff08;Comma-Separat…...

告别重复造轮子:用快马一键生成qoderwork官网开发骨架,效率倍增

作为一个经常需要搭建官网的前端开发者&#xff0c;我深刻理解那种面对空白项目时的无力感。每次新建项目&#xff0c;光是搭建基础框架、配置路由、设计布局就要花掉大半天时间。最近尝试用InsCode(快马)平台生成qoderwork官网的骨架代码&#xff0c;效率提升简直惊人。 为什么…...

快速体验Seed-Coder-8B-Base:通过简单API调用实现代码自动生成

快速体验Seed-Coder-8B-Base&#xff1a;通过简单API调用实现代码自动生成 1. 为什么选择Seed-Coder-8B-Base 在当今快节奏的开发环境中&#xff0c;代码自动生成工具已经成为提升效率的必备利器。Seed-Coder-8B-Base作为一款专为代码生成优化的开源模型&#xff0c;具有以下…...

如何快速提升游戏效率:英雄联盟智能工具完整指南

如何快速提升游戏效率&#xff1a;英雄联盟智能工具完整指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为英雄联盟游戏中的繁琐操作和…...

2026年,哪款AI最适合写小说?创作者的终极工具指南

在2026年的今天&#xff0c;AI写作工具已经深度融入小说创作的全流程。对于网文作者、短剧编剧和漫剧创作者而言&#xff0c;选择一款合适的AI工具&#xff0c;不仅能提升创作效率&#xff0c;更能直接影响作品的商业化潜力。然而&#xff0c;面对市面上琳琅满目的AI工具&#…...

3大核心功能解决B站资源保存难题:BiliTools跨平台工具箱深度评测

3大核心功能解决B站资源保存难题&#xff1a;BiliTools跨平台工具箱深度评测 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTo…...

JSXBIN高效解码工具:突破Adobe脚本加密的技术方案与实战指南

JSXBIN高效解码工具&#xff1a;突破Adobe脚本加密的技术方案与实战指南 【免费下载链接】jsxer A fast and accurate JSXBIN decompiler. 项目地址: https://gitcode.com/gh_mirrors/js/jsxer 技术原理揭秘 二进制结构解析&#xff1a;JSXBIN如何存储代码信息&#xf…...