FFMPEG音视频API-----------------复用(编码)篇

news2024/10/23 21:40:30

1.获取AVFormatContext音视频格式上下文

根据后面的几个参数分配AVFormatContext(格式上下文)

参数1:AVFormatContext **ctx分配返回的地址

参数2:AVOutputFormat *oformat如果提供该参数则通过该参数分配结构体,如果是NULL则使用 const char *format_name, const char *filename分配结构体

参数3: const char *format_name音视频流的格式通常有flv与mpegts(ts)两种格式

参数4: const char *filename输出文件名称,这里分为输出到本地比如输出为ikun.ts ikun.flv文件,也可以输出到网络传输比如我们推流rtmp://192.168.1.21/live/mystream

返回值:函数返回一个整数值,用于指示操作的成功与否。如果成功,返回值大于或等于0;如果失败,返回一个负数的AVERROR错误码。
int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oformat,
                                   const char *format_name, const char *filename);

2.获取encoder编码器

这个api比较简单,就是根据enum AVCodecID id获取对应的编码器

如果成功则返回编码器地址,反之返回NULL

AVCodec *avcodec_find_encoder(enum AVCodecID id);

去库中可以查看AVCodecID的具体内容,其枚举了很多:

3.添加新的流AVStream

        添加一个新的流,这个流可以是音频、视频、字幕流

参数1:AVFormatContext音视频上下文,这里是我要把流添加到哪个上下文

参数2:添加流的编码器,通过这个编码器找添加什么样的流(如果这里的编码器设置为NULL的时候不会设定编码器上下文的参数,需要后面再次设定编码器上下文的信息)

成功后返回流地址,反之返回NULL

AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c);

4.分配编码器上下文

通过编码器const AVCodec *codec来分配编码器上下文,如果我们在上面添加流时候没有设置第二个参数,那么我们需要在这里手动配置流中的编码器上下文

成功返回编码器上下文地址,反之返回NULL

AVCodecContext *avcodec_alloc_context3(const AVCodec *codec);

5.关联编码器和编码器上下文

初始化一个编解码器上下文(AVCodecContext),使其准备好进行编码或解码操作。

通常编码器上下文会配置音频、视频的一些参数(采样率帧数等),如果我们绑定上下文和编码器,那么相当于告诉上下文以后的编码工作由指定的编码器来做

参数1:编码器上下文(配置参数)

参数2:编码器(find的)

参数3:可以填NULL

int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);

6.分配多媒体数据包AVPacket

类似于malloc,这里我们如何理解包和流的关系呢?

我认为包是一个处理音视频数据的基本元,比如我们接收一帧的数据是接收到一个packet即一个包,然后把包写入到流中,流相当于是很多个包,通过av_interleaved_write_frame 函数将包写入到流中

AVPacket *av_packet_alloc(void);

7.编码器上下文参数复制

如果配置好了上下文codec,但是并不是我们实际的编码器上下文使用该函数复制类似于mmcpy

int avcodec_parameters_from_context(AVCodecParameters *par,
                                    const AVCodecContext *codec);

把codec的参数复制到par

使用实例如下:    avcodec_parameters_from_context(videostream->codecpar, c);

        即把配置好的编码器上下文参数复制到videostream->codecpar,这里videostream是AVStream类型。

8.输入输出日志打印

用于打印关于输入或输出格式的详细信息。这包括持续时间、比特率、流、容器格式、程序、元数据、边数据、编解码器和时间基准等信息。该函数通常用于调试或当用户需要详细了解媒体文件的情况。

参数1:打印哪个音视频上下文信息

参数2:打印什么信息-1是所有信息

参数3:音视频上下文设置的地址,即本地存储or网络传输

参数4:这个音视频上下文是输入还是输出,输入(0)还是输出(1)

void av_dump_format(AVFormatContext *ic,int index, const char *url,int is_output);

9.初始化配置

当前面的编码器、编码器上下文、等都配置好后使用该函数对整体进行初始化

参数1:初始化的音视频上下文

参数2:选项,可以填NULL

int avformat_write_header(AVFormatContext *s, AVDictionary **options);

实战合成音视频流程中,新建的音视频流的时间基准在这个函数后变为合成流时间基准

---------------------------上面的是一系列的配置函数,下面是实际的功能函数---------------------------------

10.时间戳比较

参数1:a的时间戳

参数2:a的时间基准

参数3:b的时间戳

参数4:b的时间基准

时间戳×时间基就是时间

返回值:-1,a在b前     ;0相同;1,a在b后

int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b);

11.变换时间戳

参数1:变换谁的时间戳

参数2:源时间戳

参数3:目标时间戳

void av_packet_rescale_ts(AVPacket *pkt, AVRational tb_src, AVRational tb_dst);

通常pkt的时间戳是音频or视频的,然后我们把其原时间戳转化为合成流时间戳

12.把处理好的包放入合成流

这一步是最重要的,是把pkt(转换好时间基的包)放入oc,oc就是我们合成流的上下文

参数1:写到哪?

参数2:写谁?

这个函数的好处是会交替的写

int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt);

-----------------------------------------一些出口函数--------------------------------------------------------------

与linux驱动内容一样,我们定义了很多入口函数(初始化函数),那我们需要定义对应的出口函数(释放资源),避免内存的泄露

这些函数就不一一介绍了:

编码器上下文释放、buf释放、packet释放、音视频上下文释放、等等……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2213100.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用Microsoft Entra Application Proxy在无公网IP条件下安全访问内网计算机

在现代混合办公环境中,如何让员工能够从任何地方安全访问公司内部资源成为了企业的重要挑战。传统的VPN解决方案虽然可以满足需求,但有时配置复杂,并可能涉及公网IP的问题。为了解决这个问题,Microsoft Entra(原Azure …

WordPress 禁用上传媒体图片自动生成缩略图及多尺寸图片教程

一、在 设置-媒体-媒体设置 中几个尺寸大小的设置不勾选或设置为 0&#xff0c;如下图&#xff1a; 二、找到主题文件 function.php 文件&#xff0c;打开后&#xff0c;在 <?php 后面添加如下代码&#xff1a; function.php 文件路径一般为&#xff1a;WordPress网站根目录…

使用Matlab实现光线追迹详解(含代码)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

ExtraTree|GBDT|XGBoost模型原理

目录 1. 总述2. ExtraTree3. GBDT4. XGBoost 1. 总述 ExtraTree、GBDT 和 XGBoost 都是基于决策树的算法。ExtraTree属于Bagging&#xff08;装袋法&#xff09;方法&#xff0c;GBDT和XGBoost则属于Boosting&#xff08;提升树&#xff09;方法&#xff0c;通过逐步优化残差&…

U盘剪切文件丢失:原因、恢复方案与预防措施

一、U盘剪切文件的定义与特性 U盘剪切文件&#xff0c;是指用户在将文件从U盘移动到其他存储设备&#xff08;如电脑硬盘、其他U盘等&#xff09;时&#xff0c;通过操作系统的剪切功能&#xff0c;将文件从U盘中原位置删除&#xff0c;并暂存于系统剪贴板中&#xff0c;等待用…

双回路防静电监控仪安全保护生产全流程

在现代工业生产中&#xff0c;静电防护成为了确保安全生产的重要环节&#xff0c;尤其是在电子、化学等易燃易爆气体环境中。静电的存在不仅可能导致设备故障&#xff0c;还可能引发火灾或爆炸等严重事故。为了解决这一隐患&#xff0c;双回路防静电监控仪应运而生&#xff0c;…

java面试-每日随机(1014)

1、zk如何进行故障转移&#xff1f; 在 Zookeeper 集群中&#xff0c;当节点故障时&#xff0c;集群需要自动剔除故障节点并进行故障恢复&#xff0c;确保集群的高可用性和一致性。具体来说&#xff0c;当跟随者节点故障时&#xff0c;集群可以继续运行&#xff0c;但当领导节…

关于Keil Compiler Version 6 移植FreeRTOS-Kernel 出现 portmacro.h 错误 - __forceinline

问题现象 在移植FreeRTOS过程中&#xff0c;使用Keil ARM 编译器版本 6 编译代码时出现protmacro.h错误- __forceinline 相关信息&#xff1a; FreeRTOS版本&#xff1a;V11.1.0KEIL 编译器版本&#xff1a;Compiler Version 6Portable路径&#xff1a;RVDS/ARM_CM4F/ 问题解…

P327. 渔夫捕鱼算法问题

问题描述&#xff1a; A、B、C、D、E 这5个人合伙夜间捕鱼&#xff0c;凌晨时都已经疲惫不堪&#xff0c;于是各自在河边的树丛中找地方睡着了。第二天日上三竿时&#xff0c;A第一个醒来&#xff0c;他将鱼平分为5份&#xff0c;把多余的一条扔回河中&#xff0c;然后拿着自己…

雷池社区版如何使用静态资源的方式建立站点

介绍&#xff1a; SafeLine&#xff0c;中文名 “雷池”&#xff0c;是一款简单好用, 效果突出的 Web 应用防火墙(WAF)&#xff0c;可以保护 Web 服务不受黑客攻击。 雷池通过过滤和监控 Web 应用与互联网之间的 HTTP 流量来保护 Web 服务。可以保护 Web 服务免受 SQL 注入、X…

Mac 窗口切换技巧:大幅提高效率的必备指南

在日常使用 Mac 电脑的过程中&#xff0c;高效地切换窗口可以极大地提升工作效率。无论是在多个文档之间快速切换&#xff0c;还是在不同的应用程序之间自如跳转&#xff0c;掌握一些实用的窗口切换技巧能让你的操作如鱼得水。下面就为大家详细介绍一些 Mac 窗口切换的技巧。 …

[Linux] 逐层深入理解文件系统 (2)—— 文件重定向

标题&#xff1a;[Linux] 逐层深入理解文件系统 &#xff08;2&#xff09;—— 文件重定向 个人主页水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 一、文件的读取和写入 二、文件重定向的本质 1.手动模拟重定向的过程——把标准输出重定向到redir.txt 2.重定向…

支付宝开放平台-开发者社区——AI 日报「10 月 14 日」

1 大模型「强崩溃」&#xff01;Meta新作&#xff1a;合成数据有「剧毒」&#xff0c;1%即成LLM杀手 新智元&#xff5c;阅读原文 1%合成数据&#xff0c;就能让模型瞬间崩溃&#xff01;甚至&#xff0c;参数规模越大&#xff0c;模型崩溃越严重。Nature封面一篇论文证实&am…

Acwing 前缀与差分

1.一维前缀和 一维前缀和&#xff1a;S[i]a1a2a3a4…ai&#xff0c;要求a从a1开始&#xff0c;且S[0]0 前缀和的作用&#xff1a;给定一组序列数据&#xff0c;可以计算任意第l个数到第r个数的和&#xff0c;S[r]-S[l-1]&#xff08;这里就解释了为什么要求S[0]0&#xff0c;因…

电力电子技术(一)

变压器漏感对整流电路的影响&#xff1a;

Find My微型电磨机|苹果Find My技术与电磨机结合,智能防丢,全球定位

微型电磨机是一种多功能电动工具&#xff0c;主要用于打磨、抛光、雕刻、钻孔等多种作业。‌ 它由控制箱和电磨笔两部分组成&#xff0c;通过直流稳压电源供电&#xff0c;电磨笔以直流马达为驱动源&#xff0c;带动磨头进行高速旋转机械运动&#xff0c;配合不同材质、形状的磨…

制药企业MES与TMS的数据库改造如何兼顾安全与效率双提升

*本图由AI生成 在全球制造业加速数字化转型的浪潮中&#xff0c;一家来自中国的、年营业额超过200亿元的制药企业以其前瞻性的视角和果断的行动&#xff0c;成为该行业里进行国产化改造的先锋。通过实施数据库改造试点项目&#xff0c;该企业实现了其关键业务系统MES&#xff0…

请求的响应----状态码分为五大类(爬虫)

前言 一个爬虫的成功与否&#xff0c;在于你是否拿到了想要的数据&#xff1b;一个请求的成功与否&#xff0c;在于响应的状态码&#xff0c;它标明了当前请求下这个响应的结果&#xff0c;是好还是坏。上节课程学习了HTTPS和HTTP协议的各自优势&#xff0c;本节课程进入到请求…

C++: AVL树的实现

一.AVL树的旋转 AVL树是平衡搜索二叉树的一种。 平衡因子&#xff1a;节点右树的高度减左树的高度&#xff0c;AVL树规定平衡因子的绝对值小于2。若不在这个范围内&#xff0c;说明该树不平衡。 AVL树节点&#xff1a; struct AVLTreeNode {AVLTreeNode(const T& data …