当前位置: 首页 > 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,这比较多,我们下一篇文章再讲。

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

http://www.lryc.cn/news/235852.html

相关文章:

  • Sql Server 2017主从配置之:发布订阅
  • 聊聊logback的EvaluatorFilter
  • 解决vue 部分页面缓存,部分页面不缓存的问题
  • 修完这个 Bug 后,MySQL 性能提升了 300%
  • 【C/PTA】数组进阶练习(二)
  • Mysql MMM
  • GDPU 数据结构 天码行空10
  • CD36 ; + Lectin;
  • Git 分支管理
  • Vue23全局事件总线
  • GEM5 Garnet DVFS / NoC DVFS教程:ruby.clk_domain ruby.voltage_domain
  • java命令 jmap 堆参数分析
  • OpenCV C++ 图像处理实战 ——《OCR字符识别》
  • 在MySQL中创建新的数据库,可以使用命令,也可以通过MySQL工作台
  • 2311rust到31版本更新
  • 【Python百宝箱】视觉算法秀:Python图像处理舞台上的巅峰对决
  • Flutter 中在单个屏幕上实现多个列表
  • YOLOv8 加持 MobileNetv3,目标检测新篇章
  • .gitignore 文件——如何在 Git 中忽略文件和文件夹详细教程
  • 【数据结构(二)】单链表(3)
  • 创新案例|云服务平台HashiCorp是如何构建开源社区实现B2B增长飞轮
  • 2024年软件测试面试必看系列,看完去面试你会感谢我的!!
  • 01ctfer 文件上传
  • 2.2 调用星火大模型的API
  • 云原生是整个信息化行业的未来,一文彻底搞懂云原生
  • 【Redis】RedisTemplate最全的常用方法
  • 图像倾斜角度求取-Radon变换
  • 如何在本地搭建Oracle数据库实现公网环境下通过PLSQL工具进行远程访问
  • 时序预测 | Python实现ConvLSTM卷积长短期记忆神经网络股票价格预测(Conv1D-LSTM)
  • qtpdfium的编译及读取pdf文件和一些简单操作