1.音频编码流程

2.编码函数API含义解释
av_frame_make_writable 确保帧数据可写,尽可能避免数据复制.如果帧可写,则不执行任何操作,如果不可写,则分配新缓冲区并复制数据.返回: 成功时为 0,错误时为负 AVERROR.
av_samples_fill_arrays 这个函数就是将你输入的一帧数据写入AVFrame格式输出,便于后面编码send,recvice使用
3.音频编码实战Demo PCM转AAC格式
编码注意点:
- 编码器相关配置得设置正确,比如码率,采样率,声道,采样格式等
- 也要设置AVFrame的格式,主要是采样率,声道,采样格式
- 如果数据不是FLTP格式的花,需要转化为FLTP格式.
- PCM编码后的数据想要编码为AAC格式,得在前面加上adtsheader.
#ifndef MAINBACK_C
#define MAINBACK_C
#endif // MAINBACK_C
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <libavcodec/avcodec.h>
#include <libavutil/channel_layout.h>
#include <libavutil/common.h>
#include <libavutil/frame.h>
#include <libavutil/samplefmt.h>
#include <libavutil/opt.h>
void f32le_convert_to_fltp(float *f32le, float *fltp, int nb_samples) {
float *fltp_l = fltp; // 左通道
float *fltp_r = fltp + nb_samples; // 右通道
for(int i = 0; i < nb_samples; i++) {
fltp_l[i] = f32le[i*2]; // 0 1 - 2 3
fltp_r[i] = f32le[i*2+1]; // 可以尝试注释左声道或者右声道听听声音
}
}
static void get_adts_header(AVCodecContext *ctx, uint8_t *adts_header, int aac_length)
{
uint8_t freq_idx = 0; //0: 96000 Hz 3: 48000 Hz 4: 44100 Hz
switch (ctx->sample_rate) {
case 96000: freq_idx = 0; break;

本文介绍了音频编码的基本流程,包括PCM数据转换为FLTP格式,使用libavcodec库进行AAC编码,以及添加ADTS头的过程。文章提供了详细的API解释和示例代码,展示了如何实现PCM到AAC的转换。
最低0.47元/天 解锁文章
2099

被折叠的 条评论
为什么被折叠?



