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

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

介绍

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

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

解析

我们上次文章解析了父类 Queue,这次我们解析子类之一,AVPacketQueue。

我们先看 .h 的代码:

#pragma once
#ifndef AVPACKETQUEUE_H_
#define AVPACKETQUEUE_H_
#include "queue.h"#ifdef __cplusplusextern "C" {
#include"libavutil/avutil.h"
#include"libavformat/avformat.h"
#include"libavcodec/avcodec.h"
}#endif // __cplusplusclass AVPacketQueue{
public:AVPacketQueue();~AVPacketQueue();void Abort();int Size();int Push(AVPacket* val);AVPacket* Pop(const int timeout);
private:void release();Queue<AVPacket*> my_queue;
};#endif

大家可以注意一下,在这里我们的 AVPacketQueue 并没有直接继承 Queue,而是将 Queue 作为私有成员的一个变量。

其他的成员变量都是函数,其中只有 release 是私有成员。

接下来我们要解析五个函数:Abort,Size,Push,Pop,release,大家放心,代码量不大。

Abort:
void AVPacketQueue::Abort() {release();my_queue.Abort();
}

这个函数是负责程序中断的,其中引用的函数 release 我们等会讲。然后队列就使用了 Abort 函数,没了解的读者朋友可以看看前面的文章。

Size:
int AVPacketQueue::Size() {return my_queue.Size();
}

这也很好理解,就调用了 Queue 父类本身的 Size 函数,返回了队列长度。

Push:
int AVPacketQueue::Push(AVPacket* val) {return my_queue.Push(val);
}

同理,直接调用了父类的 Push 方法。

Pop:
AVPacket* AVPacketQueue::Pop(const int timeout) {AVPacket* avPack = nullptr;int ret = my_queue.Pop(avPack, timeout);if (ret < 0) {perror("AVPackeQueuet: Pop failed");} return avPack;
}

这里也同样调用了父类的 Pop 方法,不过首先还声明了一个 AVPacket 变量,因为这里的 Pop 函数不是简单的弹出,还要讲弹出的数据赋值给参数。

Release:
void AVPacketQueue::release() {while (true){AVPacket* packet = nullptr;int ret = my_queue.Pop(packet, 1);if(ret < 0){break;}else {av_packet_free(&packet);}}
}

这函数是释放相关资源。这是一个死循环函数,然后队列不断弹出数据,直到没有为止。

好了,那么 AVPacketQueue 我们就讲完了,下一篇文章我们会解析 AVFrameQueue。

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

相关文章:

  • android开发连接网络
  • Leetcode—141.环形链表【简单】
  • csapp深入理解计算机系统 bomb lab(1)phase_1
  • Redis数据的持久化
  • SpringCloud Alibaba详解
  • NoSQL 与传统数据库的集成
  • WPF中如何在MVVM模式下关闭窗口
  • 大数据Doris(二十六):数据导入(Routine Load)介绍
  • 【大数据分布并行处理】单元测试(五)
  • Spring中有哪几种方法获取HttpSession对象
  • 4 redis的HyperLogLog入门原理
  • java发送媒体类型为multipart/form-data的请求
  • 云课五分钟-0Cg++默认版本和升级-std=c++17
  • 将 Fedora 38 平滑升级至 Fedora 39
  • 工厂设计模式
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • Android框架之Volley
  • mongodb--安装和初步使用教程
  • Otto开发初探——微服务依赖管理新利器
  • php中curl和soap方式请求服务超时问题
  • tensorflow学习笔记3——MNIST应用篇
  • vue--为什么data属性必须是一个函数
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 好的网址,关于.net 4.0 ,vs 2010
  • 记录:CentOS7.2配置LNMP环境记录
  • 开发基于以太坊智能合约的DApp
  • 深度学习入门:10门免费线上课程推荐
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 移动端 h5开发相关内容总结(三)
  • 与 ConTeXt MkIV 官方文档的接驳
  • 原生js练习题---第五课
  • MyCAT水平分库
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • ###C语言程序设计-----C语言学习(3)#
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (论文阅读11/100)Fast R-CNN
  • (七)Java对象在Hibernate持久化层的状态
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (四)图像的%2线性拉伸
  • (一)认识微服务
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)平衡树
  • (转载)Google Chrome调试JS
  • .gitignore
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET 反射 Reflect
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • @ModelAttribute注解使用
  • [ solr入门 ] - 利用solrJ进行检索
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具