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

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

介绍

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

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

解析

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

我们先看 .h 的代码:

#pragma once
#ifndef AVPACKETQUEUE_H_
#define AVPACKETQUEUE_H_
#include "queue.h"

#ifdef __cplusplus

extern "C" {
#include"libavutil/avutil.h"
#include"libavformat/avformat.h"
#include"libavcodec/avcodec.h"
}

#endif // __cplusplus


class 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。

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


http://www.kler.cn/a/133313.html

相关文章:

  • html数据类型
  • 计算机毕业设计Python+大模型中医养生问答系统 知识图谱 医疗大数据 中医可视化 机器学习 深度学习 人工智能 大数据毕业设计
  • 使用热冻结数据层生命周期优化在 Elastic Cloud 中存储日志的成本
  • 122、java的LambdaQueryWapper的条件拼接实现数据sql中and (column1 =1 or column1 is null)
  • python爬虫(二)爬取国家博物馆的信息
  • 【深度学习】学习率介绍(torch.optim.lr_scheduler学习率调度策略介绍)
  • vite+react+typescript 遇到的问题
  • 远程创建分支本地VScode看不到分支
  • stm32 HSUSB
  • vscode运行dlv报错超时
  • 用5000字讲清楚压敏电阻
  • 基础模型的自然语言处理能力综述
  • Linux tc 使用
  • 李沐的学习Pytorch环境配置
  • 【数据结构】希尔排序(最小增量排序)
  • 大数据基础设施搭建 - Hadoop
  • R语言和RStudio的下载安装(非常简便舒适)
  • LeetCode701. Insert into a Binary Search Tree
  • 欢迎各位加入知识星球,带各位进入新的领域
  • 《2020年最新面经》—字节跳动Java社招面试题
  • 腾讯云CVM服务器标准型/高IO/计算/大数据使用场景及选择说明
  • C++ 日期推算
  • AM@函数展开成幂级数@间接法@常用麦克劳林幂级数展开公式
  • QEMU显示虚拟化的几种选项
  • 解锁数据安全之门:探秘迅软DSE的文件权限控制功能
  • 【ES常用查询】基于ElasticsearchRestTemplate及NativeSearchQuery的查询