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

FFMPEG-FLV-MUX编码

一、流程图

在这里插入图片描述

二、结构体

1 .AVOutputFormat

一、核心功能与作用
  1. 封装格式描述
    AVOutputFormat保存了输出容器格式的元数据,包括:

    • 短名称name):如flvmp4
    • 易读名称long_name):如FLV (Flash Video)
    • MIME类型mime_type):如video/x-flv
    • 文件扩展名extensions):如flv
  2. 默认编码格式设置
    指定音视频流的默认编码格式ID(如audio_codecvideo_codec),例如FLV默认音频编码为MP3,视频编码为FLV1。

  3. 操作函数接口
    定义封装过程中的关键函数指针,包括:

    • write_header:写入文件头部;
    • write_packet:写入数据包;
    • write_trailer:写入尾部信息。
  4. 链表存储
    FFmpeg将所有支持的AVOutputFormat实例以链表形式存储,便于动态查找和管理。

二、结构体关键字段解析
typedef struct AVOutputFormat {const char *name;            // 格式短名称(如"flv")const char *long_name;       // 易读全称const char *mime_type;       // MIME类型const char *extensions;      // 文件扩展名enum AVCodecID audio_codec;  // 默认音频编码IDenum AVCodecID video_codec;  // 默认视频编码IDint flags;                   // 控制封装行为的标志位const struct AVCodecTag **codec_tag; // 支持的编码器标签列表struct AVOutputFormat *next; // 链表指针int priv_data_size;          // 私有数据大小// 函数指针(如write_header、write_packet等)
} AVOutputFormat;
三、 重要字段说明:
  • flags标志位
    控制封装行为,例如:

    • AVFMT_GLOBALHEADER:要求编码器生成全局头(如H.264的SPS/PPS);
    • AVFMT_VARIABLE_FPS:允许可变帧率封装,适用于直播流。
  • codec_tag编码器标签
    定义支持的编码器列表,按优先级排序,用于匹配最佳编码器。

  • priv_data_size私有数据
    存储格式特定的上下文信息(如FLV的FLVContext),用于自定义参数。

四、使用场景与示例
1. 获取输出格式

通过文件名或扩展名查找支持的封装器:

AVOutputFormat *fmt = av_guess_format("flv", NULL, NULL);  // 获取FLV封装器
2. 初始化封装上下文

AVOutputFormat绑定到AVFormatContext

AVFormatContext *oc = NULL;
avformat_alloc_output_context2(&oc, fmt, NULL, "output.flv");  // 关联格式并分配上下文
3. 自定义封装器实现

以FLV为例,需实现关键函数接口:

AVOutputFormat ff_flv_muxer = {.name = "flv",.long_name = "FLV (Flash Video)",.priv_data_size = sizeof(FLVContext),  // 私有上下文.audio_codec = AV_CODEC_ID_MP3,.video_codec = AV_CODEC_ID_FLV1,.write_header = flv_write_header,      // 自定义头部写入.write_packet = flv_write_packet,      // 数据包写入逻辑
};
五、与其他组件的关系
  1. AVFormatContext
    AVOutputFormat作为其oformat成员,驱动封装流程。

  2. AVCodecContext
    通过audio_codecvideo_codec关联默认编码器参数,影响流配置。

  3. 私有数据(如FLVContext
    存储格式特定的上下文信息,例如FLV的元数据或时间戳处理逻辑。

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

相关文章:

  • 青少年编程与数学 02-020 C#程序设计基础 05课题、数据类型
  • React vs Vue.js:选哪个框架更适合你的项目?
  • Kafka|基础入门
  • ADS学习笔记(五) 谐波平衡仿真
  • MySQL存储引擎对比及选择指南
  • 【IDEA问题】springboot本地启动应用报错:程序包不存在;找不到符号
  • PETR- Position Embedding Transformation for Multi-View 3D Object Detection
  • Prompt Tuning与自然语言微调对比解析
  • 二十七、面向对象底层逻辑-SpringMVC九大组件之HandlerAdapter接口设计
  • QT软件开发环境及简单图形的绘制-图形学(实验一)-[成信]
  • 项目部署一次记录
  • 单例模式,饿汉式,懒汉式,在java和spring中的体现
  • 一文带你彻底理清C 语言核心知识 与 面试高频考点:从栈溢出到指针 全面解析 附带笔者手写2.4k行代码加注释
  • 【Redis】第1节|Redis服务搭建
  • 数据结构第5章 树与二叉树(竟成)
  • # 深入解析BERT自然语言处理框架:原理、结构与应用
  • ai学习--python部分-1.变量名及命名空间的存储
  • Cadence学习笔记之---PCB过孔替换、封装更新,DRC检查和状态查看
  • Java基础 Day21
  • 系统开发和运行知识
  • Elasticsearch 分片驱逐(Shard Exclusion)方式简析:`_name`、`_ip`、`_host`
  • 【C++高级主题】异常处理(四):auto_ptr类
  • STM32CubeMX配置使用通用定时器产生PWM
  • WebSphere Application Server(WAS)8.5.5教程第十四讲:JPA
  • Linux系统调用深度剖析
  • 动态规划-918.环形子数组的最大和-力扣(LeetCode)
  • Docker 镜像标签(Tag)规范与要求
  • STM32:Modbus通信协议核心解析:关键通信技术
  • 线程封装与互斥
  • 鸿蒙OSUniApp 开发实时天气查询应用 —— 鸿蒙生态下的跨端实践#三方框架 #Uniapp