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

【FFmpeg】avcodec_find_encoder和avcodec_find_decoder

目录

  • 1.avcodec_find_encoder
  • 2.avcodec_find_decoder
  • 3.小结

FFmpeg相关记录:

示例工程:
【FFmpeg】调用ffmpeg库实现264软编
【FFmpeg】调用ffmpeg库实现264软解
【FFmpeg】调用ffmpeg库进行RTMP推流和拉流
【FFmpeg】调用ffmpeg库进行SDL2解码后渲染

流程分析:
【FFmpeg】编码链路上主要函数的简单分析
【FFmpeg】解码链路上主要函数的简单分析

结构体分析:
【FFmpeg】AVCodec结构体
【FFmpeg】AVCodecContext结构体
【FFmpeg】AVStream结构体
【FFmpeg】AVFormatContext结构体
【FFmpeg】AVIOContext结构体
【FFmpeg】AVPacket结构体

函数分析:
【FFmpeg】avformat_open_input函数
【FFmpeg】avformat_find_stream_info函数
【FFmpeg】avformat_alloc_output_context2函数
【FFmpeg】avio_open2函数
【FFmpeg】avformat_write_header函数
【FFmpeg】av_write_frame函数

1.avcodec_find_encoder

函数的功能是用于查找一个编码器,定义位于libavcodec\allcodecs.c,函数调用了find_codec查找一个编码器

const AVCodec *avcodec_find_encoder(enum AVCodecID id)
{return find_codec(id, av_codec_is_encoder);
}

find_codec的定义如下,其中先调用了remap_deprecated_codec_id进行id的重映射,随后调用av_codec_iterate从codec_list当中取出一个codec,随后判断这个codec的id是否与输入的id匹配,如果匹配再检查这个codec的编码能力(capabilities)是否是experimental,如果不是experimental则返回这个codec

static const AVCodec *find_codec(enum AVCodecID id, int (*x)(const AVCodec *))
{const AVCodec *p, *experimental = NULL;void *i = 0;id = remap_deprecated_codec_id(id);while ((p = av_codec_iterate(&i))) {if (!x(p))continue;if (p->id == id) {if (p->capabilities & AV_CODEC_CAP_EXPERIMENTAL && !experimental) {experimental = p;} elsereturn p;}}return experimental;
}

remap_deprecated_codec_id的定义如下,代码上这里并没有实现,只说在将来可能会做id的映射

static enum AVCodecID remap_deprecated_codec_id(enum AVCodecID id)
{switch(id){//This is for future deprecatec codec ids, its empty since//last major bump but will fill up again over time, please don't remove itdefault                                         : return id;}
}

av_codec_iterate用于遍历codec_list当中的codec,从中取出一个codec

const AVCodec *av_codec_iterate(void **opaque)
{uintptr_t i = (uintptr_t)*opaque;const FFCodec *c = codec_list[i];ff_thread_once(&av_codec_static_init, av_codec_init_static);if (c) {*opaque = (void*)(i + 1);return &c->p;}return NULL;
}

2.avcodec_find_decoder

avcodec_find_decoder用于查找一个合适的解码器,与avcodec_find_encoder是类似的,只是查找的是解码器。两个函数都调用了find_codec进行具体的查找任务,区别在于传入的参数,一个是av_codec_is_encoder,另一个是av_codec_is_decoder

const AVCodec *avcodec_find_decoder(enum AVCodecID id)
{return find_codec(id, av_codec_is_decoder);
}

3.小结

这两个函数的主要任务是根据输入的AVCodecID查找一个合适的编码器或者解码器,如果查找到的编解码器不是experimental的,即可以直接使用,则将当前查找到的编解码器返回

CSDN : https://blog.csdn.net/weixin_42877471
Github : https://github.com/DoFulangChen

相关文章:

  • 《mysql篇》--查询(进阶)
  • TCP: 传输控制协议
  • 双非本 985 硕,我马上要入职上海AI实验室大模型算法岗
  • 嵌入式实验---实验五 串口数据接收实验
  • Webpack: Loader开发 (1)
  • 基于正点原子FreeRTOS学习笔记——时间片调度实验
  • pdfmake不能设置表格边框颜色?
  • UnityShader SDF有向距离场简单实现
  • 走进IT的世界
  • 51单片机第23步_定时器1工作在模式0(13位定时器)
  • 【设计模式】【行为型模式】【责任链模式】
  • NAS—网络附加存储
  • mysqldump全备份之后,如何只恢复一个库或者一个表
  • 中画幅巡检相机-SHARE 100M A10
  • Oracle中常用内置函数
  • 《Java编程思想》读书笔记-对象导论
  • 【笔记】你不知道的JS读书笔记——Promise
  • 【前端学习】-粗谈选择器
  • ES学习笔记(12)--Symbol
  • HTTP 简介
  • JSDuck 与 AngularJS 融合技巧
  • Linux Process Manage
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Mybatis初体验
  • Terraform入门 - 1. 安装Terraform
  • Zepto.js源码学习之二
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 电商搜索引擎的架构设计和性能优化
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 排序(1):冒泡排序
  • 让你的分享飞起来——极光推出社会化分享组件
  • 学习HTTP相关知识笔记
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​虚拟化系列介绍(十)
  • $.ajax()
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (翻译)terry crowley: 写给程序员
  • (分布式缓存)Redis分片集群
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (原創) 未来三学期想要修的课 (日記)
  • (转)Linq学习笔记
  • .bat批处理出现中文乱码的情况
  • .bat文件调用java类的main方法
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET Standard 的管理策略