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

FFMPEG自学二 ⾳频编码实战

一、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.lryc.cn/news/15343.html

相关文章:

  • ​一致魔芋在北交所上市:市值突破11亿元,吴平夫妇为实控人​
  • 进程或线程终止是否会释放锁
  • mysql复制表提示某些为null字段无效
  • 【数据库】redis 配置文件与发布订阅
  • ChatGPT来了,英语不能丢,但我不想上班
  • 【LeetCode】二叉树的直径 [E](二叉树)
  • Mybatis框架详解(全)
  • 2023年爆火的csgo搬砖项目详细拆解,steam搬砖长期稳定
  • C语言实现动态管理通讯录信息系统(静态通讯录plus版)
  • 核心技术: springboot 启动类加载时方法执行的几种实现方式, bean声明周期, 启动执行顺序
  • 拒绝背锅:测试项目中的风险管理一定要知道
  • 20-js本地存储
  • ABAP 辨析ON INPUT|REQUEST|CHAIN-INPUT|CHAIN-REQUEST
  • LeetCode:逆波兰式;
  • 为什么阳康后,感觉自己变傻了?
  • 考公和大厂40万年薪的offer,选哪个?
  • 多线程环境下调用 HttpWebRequest 并发连接限制
  • vue3-element-admin搭建
  • 蓝海创意云vLive虚拟直播亮相2023昆山元宇宙产品展览会
  • ThreadLocal线程变量
  • 【linux安装redis详解】小白如何安装部署redis,linux安装部署只需5步骤(图文结合,亲测有效)
  • 2023只会“点点点”,被裁只是时间问题,高薪的自动化测试需要掌握那些技能?
  • C语言【柔性数组】
  • AcWing275. 传纸条
  • 圆角矩形的绘制和曲线均匀化
  • 【Linux】环境变量,命令行参数,main函数三个参数保姆教学
  • 美国访问学者生活中有哪些饮食文化特点?
  • RxJava中的Subject
  • vue-element-admin在git 上 clone 之后无法install
  • Linux线程调度实验