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

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

介绍

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

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

解析

我们今天文章将会解析负责解码的线程 decodethread,我们先看看 .h 文件的代码:

#ifndef DECODETHREAD_H_
#define DECODETHREAD_H_

#include"thread.h"
#include"avpacketqueue.h"
#include"avframequeue.h"

class DecodeThread : public Thread
{
public:
    DecodeThread(AVPacketQueue* packet_queue, AVPacketQueue* frame_queue);
    ~DecodeThread();
    int Init(AVCodecParameters* par);
    int Start();
    int Stop();
    void Run();
private:
    AVCodecContext* codec_ctx = nullptr;
    AVPacketQueue* packet_queue = nullptr;
    AVFrameQueue* frame_queue = nullptr;
};

#endif

可以看到,其实结构上与负责解封装的线程 demuxthread 差不多,公有函数都有构造函数,析构函数,Init,Start,Stop,Run。不过私有成员发生了一些变化,之前的 AVFormatContext 变成了现在的 AVCodecContext,之前的包队列(AVPacketQueue)变成了现在的帧队列(AVFrameQueue)。

有兴趣的朋友可以看看下面的 demuxthread 源码对比一下:

#ifndef DECODETHREAD_H_
#define DECODETHREAD_H_

#include"thread.h"
#include"avpacketqueue.h"
#include"avframequeue.h"

class DecodeThread : public Thread
{
public:
    DecodeThread(AVPacketQueue* packet_queue, AVPacketQueue* frame_queue);
    ~DecodeThread();
    int Init(AVCodecParameters* par);
    int Start();
    int Stop();
    void Run();
private:
    AVCodecContext* codec_ctx = nullptr;
    AVPacketQueue* packet_queue = nullptr;
    AVFrameQueue* frame_queue = nullptr;
};

#endif

最后,我们看一些构造函数,其余的呢我们下一篇文章再讲。

DecodeThread::DecodeThread(AVPacketQueue* packet_queue, AVPacketQueue* frame_queue){
    this->packet_queue = packet_queue;
    this->frame_queue = frame_queue;
}

这比较好理解,就是将两个私有成员,一个包队列(AVodecPacket),一个帧队列(AVFrameQueue)进行初始化。

好了,今天的知识理解起来比较轻松,不做总结了。

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


http://www.kler.cn/news/133745.html

相关文章:

  • 多线程(初阶)
  • 【IPC】消息队列
  • 针对CSP-J/S的每日一练:Day9
  • Sqlite安装配置及使用
  • vscode中Chinese (Simplified)汉化无效解决方法
  • 我叫:选择排序【JAVA】
  • 教程:使用 Keras 优化神经网络
  • qml制作简单的播放器--MediaPlayer
  • 如何使用贝锐花生壳内网穿透远程访问JupyterNotebook?
  • springboot项目yml文件中使用${}配置
  • linux下安装python3.8(有坑)
  • ping命令使用示例解析
  • ubuntu20.04在docker下运行ros-noetic进行开发
  • 【电路笔记】-最大功率传输
  • vulhub redis-4-unacc
  • ​软考-高级-系统架构设计师教程(清华第2版)【第14章 云原生架构设计理论与实践(P496~526)-思维导图】​
  • 文本向量化
  • PTA-6-42 设计门票(抽象类)
  • [C/C++] 数据结构 LeetCode:用队列实现栈
  • 【碰碰球】弹珠游戏-微信小程序项目开发流程详解
  • 【短文】【踩坑】可以在Qt Designer给QTableWidge添加右键菜单吗?
  • 最长回文子序列 递归与动态规划
  • 【精选】项目管理工具——Maven详解
  • STM32的启动流程
  • 数据双向 双向数据绑定
  • 【Promise12数据集】Promise12数据集介绍和预处理
  • odoo16前端框架源码阅读——env.js
  • 深度优化数据库性能:Linux 内核参数调整解析
  • ChatGPT 从零到一打造私人智能英语学习助手
  • 【JavaEE初阶】计算机是如何工作的