FFMPEG自学二 ⾳频编码实战

news2025/2/24 3:48:25

一、FFmpeg编码流程

二、流程关键函数

avcodec_find_encoder:根据指定的AVCodecID查找注册的编码器。 
avcodec_alloc_context3:为AVCodecContext分配内存。 
avcodec_open2:打开编码器。 
avcodec_send_frame:将AVFrame⾮压缩数据给编码器。 
avcodec_receive_packet:获取到编码后的AVPacket数据,收到的packet需要⾃⼰释放内存。 
av_frame_get_buffer: 为⾳频或视频帧分配新的buffer。在调⽤这个函数之前,必须在AVFame上设 
置好以下属性:format(视频为像素格式,⾳频为样本格式)、nb_samples(样本个数,针对⾳频)、 
channel_layout(通道类型,针对⾳频)、width/height(宽⾼,针对视频)。 
av_frame_make_writable:确保AVFrame是可写的,使⽤av_frame_make_writable()的问题是,在 
最坏的情况下,它会在您使⽤encode再次更改整个输⼊frame之前复制它. 如果frame不可写, 
av_frame_make_writable()将分配新的缓冲区,并复制这个输⼊input frame数据,避免和编码器需 
要缓存该帧时造成冲突。 
av_samples_fill_arrays 填充⾳频帧 
flush encoder 调⽤⼀次 avcodec_send_frame(NULL)(返回成功),然后不停调⽤ 
avcodec_receive_packet() 直到其返回 AVERROR_EOF,取出所有缓存帧
avcodec_receive_packet() 返回 AVERROR_EOF 这⼀次是没有有效数据的,仅仅获取到⼀ 
个结束标志

三、PCM涉及的参数

1. Sample Rate : 采样频率。8kHz(电话)、44.1kHz(CD)、48kHz(DVD)。 
2. Sample Size : 量化位数。通常该值为16-bit。 
3. Number of Channels : 通道个数。常⻅的⾳频有⽴体声(stereo)和单声道(mono)两种类型,⽴体声包 含左声道和右声道。另外还有环绕⽴体声等其它不太常⽤的类型。 
4. Sign : 表示样本数据是否是有符号位,⽐如⽤⼀字节表示的样本数据,有符号的话表示范围为-128 ~ 127,⽆符号是0 ~ 255。有符号位16bits数据取值范围为-32768~32767。 
5. Byte Ordering : 字节序。字节序是little-endian还是big-endian。通常均为little-endian。字节序说 明⻅第4节。 
6. Integer Or Floating Point : 整形或浮点型。⼤多数格式的PCM样本数据使⽤整形表示,⽽在⼀些对 精度要求⾼的应⽤⽅⾯,使⽤浮点类型表示PCM样本数据(浮点数 float值域为 [-1.0, 1.0])。

四、FFmpeg中Packed和Planar的PCM数据区别

packed格式

1 AV_SAMPLE_FMT_U8, ///< unsigned 8 bits 
2 AV_SAMPLE_FMT_S16, ///< signed 16 bits 
3 AV_SAMPLE_FMT_S32, ///< signed 32 bits 
4 AV_SAMPLE_FMT_FLT, ///< float 
5 AV_SAMPLE_FMT_DBL, ///< double

只能保存在AVFrame的uint8_t *data[0];

planar格式

1 AV_SAMPLE_FMT_U8P, ///< unsigned 8 bits, planar 
2 AV_SAMPLE_FMT_S16P, ///< signed 16 bits, planar 
3 AV_SAMPLE_FMT_S32P, ///< signed 32 bits, planar 
4 AV_SAMPLE_FMT_FLTP, ///< float, planar 
5 AV_SAMPLE_FMT_DBLP, ///< double, planar 
6 AV_SAMPLE_FMT_S64, ///< signed 64 bits 
7 AV_SAMPLE_FMT_S64P, ///< signed 64 bits, planar

注:

planar为FFmpeg内部存储⾳频使⽤的采样格式,所有的Planar格式后⾯都有字⺟P标识。

Packed: L R L R L R L R 识记:Packed(拥挤的) 左拥右抱

Planar : L L L L ... R R R Planar (平面的) 分层

plane 0对于uint8_t *data[0]

plane 1对于uint8_t *data[1]

FFmpeg默认的AAC编码器不⽀持AV_SAMPLE_FMT_S16格式的编码,只⽀持

AV_SAMPLE_FMT_FLTP

FFmpeg⾳频解码后和编码前的数据是存放在AVFrame结构中的。

Packed格式,frame.data[0]或frame.extended_data[0]包含所有的⾳频数据中。

Planar格式, frame.data[i]或者frame.extended_data[i]表示第i个声道的数据(假设声道0是第⼀

个), AVFrame.data数组⼤⼩固定为8,如果声道数超过8,需要从frame.extended_data获取声道数

据。

五、PCM数据播放

ffplay -f f32le -ac 2 -ar 48000 a.pcm 播放格式为f32le,双声道,采样频率48000Hz的PCM数据

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

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

相关文章

LVGL Styles

LVGL StylesGet started按钮添加标签按钮添加风格滑动条值显示StylesSize stylesBackground stylesBorder stylesOutline stylesShadow stylesImage stylesArc stylesText stylesLine stylesGet started 按钮添加标签 /*** brief 按钮事件回调函数* param e */ void btn_eve…

【Python实战】一大波高颜值主播来袭:快看,某网站颜值排名,为了这个排名我可是大费周章啦,第一名不亏是你...(人脸检测+爬虫实战)

导语 民间一直有个传闻......「听说某站的小哥哥小姐姐颜值都很高哦&#xff01;」 &#xff08;不是颜值高才能加入&#xff0c;是优秀的人恰好颜值高&#xff09; 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末…

Qt C++ 自定义仪表盘控件03

简介仪表盘是工控领域不可缺少的一类软件UI元素&#xff0c;通常出现在各类电子看板软件上&#xff0c;以及一些高级的上位机软件界面上&#xff0c;目的是将繁杂的数据转化为可视化的图表能大幅提高后台管理效率。本文分享了几个经典常用的仪表盘控件&#xff0c;在项目中可以…

系列一、SQL

一、SQL分类 二、DDL 定义&#xff1a;Data Definition Language&#xff0c;数据定义语言&#xff0c;用来定义数据库对象(数据库&#xff0c;表&#xff0c;字段) 2.1、数据库操作 2.1.1、查询所有数据库 show databases; 2.1.2、查询当前数据库 select database(); 2.…

Pytorch平均池化nn.AvgPool2d()使用记录

【pytorch官方文档】&#xff1a;https://pytorch.org/docs/stable/generated/torch.nn.AvgPool2d.html?highlightavgpool2d#torch.nn.AvgPool2dtorch.nn.AvgPool2d()作用在由多通道组成的输入特征中进行2D平均池化计算函数torch.nn.AvgPool2d(kernel_size, strideNone, paddi…

在 ubuntu 中切换使用不同版本的 python

引言有时我们不得不在同一台 ubuntu 中使用不同版本的 python 环境。本文的介绍就是可以在 ubuntu 上同时安装几个不同版本的 python&#xff0c;然后你可以随时指定当前要使用的 python 版本。步骤检查当前的 python 版本$ python3 --version python 3.6.8我的版本是 3.6.8假设…

Renegade:基于MPC+Bulletproofs构建的anonymous DEX

1. 引言 白皮书见&#xff1a; Renegade Whitepaper: Protocol Specification, v0.6 开源代码见&#xff1a; https://github.com/renegade-fi/renegade&#xff08;Renegade p2p网络每个节点的核心网络和密码逻辑&#xff09;https://github.com/renegade-fi/mpc-bulletpr…

OSPF(开放式最短路径优先协议)、ACL(访问控制列表)、NAT

一、OSPF -- &#xff08;开放式最短路径优先协议&#xff09; 基于组播更新 --- 224.0.0.5 224.0.0.6 1、协议类型&#xff1a;无类别链路状态的IGP协议 无类别&#xff1a;带精确掩码链路状态&#xff1a;不共享路由&#xff0c;共享拓扑&#xff08;共享LSA&#xff09;…

Windows平台Python编程必会模块之pywin32

在Windows平台上&#xff0c;从原来使用C/C编写原生EXE程序&#xff0c;到使用Python编写一些常用脚本程序&#xff0c;成熟的模块的使用使得编程效率大大提高了。 不过&#xff0c;python模块虽多&#xff0c;也不可能满足开发者的所有需求。而且&#xff0c;模块为了便于使用…

产品未出 百度朋友圈“开演”

ChatGPT这股AI龙卷风刮到国内时&#xff0c;人们齐刷刷望向百度&#xff0c;这家在国内对AI投入最高的公司最终出手了&#xff0c;大模型新项目文心一言&#xff08;ERNIE Bot&#xff09;将在3月正式亮相&#xff0c;对标微软投资的ChatGPT。 文心一言产品未出&#xff0c;百…

[python入门㊿] - python如何打断点

目录 ❤ 什么是bug(缺陷) ❤ python代码的调试方式 ❤ 使用 pdb 进行调试 测试代码示例 利用 pdb 调试 退出 debug debug 过程中打印变量 停止 debug 继续执行程序 debug 过程中显示代码 使用函数的例子 对函数进行 debug 在调试的时候动态改变值 ❤ 使用 PyC…

el-cascader v-model 绑定值改变了,但是界面没变化

查了很多资料&#xff0c;解决办法各异&#xff0c;但以下两个没有用 &#xff08;1&#xff09;this.$forceUpdate()强制更新渲染&#xff0c;没用。 &#xff08;2&#xff09;使用v-if和this.ifPanel false去控制el-cascader的显示&#xff0c;目的也是重新渲染&#xff…

原生小程序中模板自定义组件事件

封装request.js请求文件目的&#xff1a;优化代码结构以及后期项目版本迭代和维护方便&#xff0c;提升代码的执行速度。假设:在原生page中使用基本写法创建ajax请求//发送请求了wx.request({url:"",method:"",data:"",success(res){//写业务操做…

数据分片(mycat)

1. 数据分片概念&#xff1a; 1.1. 分库分表 什么是分库分表&#xff1a; 将存放在一台数据库服务器中的数据&#xff0c;按照特定方式&#xff08;指的是程序开发的算法&#xff09;进行拆分&#xff0c;分散存放到多台数据库服务器中&#xff0c;以达到分散单台服务器负载的…

Vue使用distpicker插件实现省市级下拉框三级联动

前言 这几天做项目&#xff0c;想着用一个全国省市区插件&#xff0c;之前就知道有几种&#xff0c;比如通过JSON文件生成对应的区域下拉框&#xff0c;element-china-are插件&#xff0c;包括distpicker插件 今天主要介绍的是如何使用distpicker插件实现省市级三联跳动 官网…

2023年100道最新Android面试题,常见面试题及答案汇总

除了需要掌握牢固的专业技术之外&#xff0c;还需要刷更多的面试去在众多的面试者中杀出重围。小编特意整理了100道Android面试题&#xff0c;送给大家&#xff0c;希望大家都能顺利通过面试&#xff0c;拿下高薪。赶紧拿去吧~~文末有答案Q1.组件化和arouter原理Q2.自定义view&…

钣金行业mes解决方案,缩短产品在制周期

钣金加工行业具有多品种、小批量离散制造行业的典型特点。一些常见的下料车间、备料车间、冲压车间、冲剪生产线等。一般来说&#xff0c;核心业务是钣金加工的生产单位。 一般来说&#xff0c;与大规模生产相比&#xff0c;这种生产方式效率低、成本高&#xff0c;自动化难度…

ur3+robotiq ft sensor+robotiq 2f 140配置gazebo仿真环境

ur3robotiq ft sensorrobotiq 2f 140配置gazebo仿真环境 搭建环境&#xff1a; ubuntu: 20.04 ros: Nonetic sensor: robotiq_ft300 gripper: robotiq_2f_140_gripper UR: UR3 通过上一篇博客配置好ur3、力传感器和robotiq夹爪的rviz仿真环境后&#xff0c;现在来配置一下对…

【读书笔记】《深入浅出数据分析》第一章 分解数据

阅读第一章后&#xff0c;觉得本章重点不是在“分解数据”上&#xff0c;而是在对分析流程&#xff0c;分析步骤的引导。 1&#xff0c;确定问题 当业务方或者leader给你提诉求时&#xff0c;往往都是会比较模糊&#xff0c;他们会简单的说下诉求&#xff0c;然后给你一些数据…

Spark介绍

1、Spark是什么?类似与Hadoop的MapReduce的计算框架,基于map和reduce实现分布式计算,对比MapReduce可有效减少落盘次数,增加效率.任务之间通信交互不需要落盘,仅在shuffle时需要重新将数据排序分区落盘.Spark的缓存功能更加高效&#xff0c;特别是在SparkSQL中,一般是以列式存…