fdk-aac编解码(代码片段)

代码整改砖家 代码整改砖家     2023-04-16     732

关键词:

前言

最近在调试fdk-aac编解码,总结了一下需要注意的点,代码在公司内网懒得再敲了。本文介绍的是实时码流的编解码。有问题欢迎指出、讨论。

编译

1. fdk-aac开源代码下载:

2. 根据所使用的交叉编译器来设置cmake中的toolchain,例如我是在Hi3516上使用的,toolchain需要设置为hisiv300,就需要在下载的开源代码根目录下CMakeList.txt中添加命令:

# SET (CMAKE_C_COMPILER path) // path代指编译器路径

3. 执行cmake ./

4. 步骤3执行成功后会生成一个Makefile,终端下输入make开始编译

        a) fdk-aac文件夹不可以放在共享目录中(我实在虚拟机中使用的,所以会有共享目录)

        b) 编译成功后会生成libfdk-aac.so、libfdk-aac.so.2、libfdk-aac.so.2.0.2三个文件

5. 使用时需要将3个库都放到lib中

编码

1. 参考开源库中aac_aenc.c中的demo即可实现编码。

2. 需要注意的一点是,每次送入encoder的数据的size是有要求的。

AACENC_InfoStruct aac_info;

/* 中间省略了参数设置、初始化encoder的过程 */

/*
 * input_size: 输入PCM数据的大小
 * channels:通道数
 * frameLength:每帧每个通道的采样点数
 */
int channels = 2; // 2:双通道
int input_size = channels * 2 * aac_info.frameLength;

3. 当然,如果你和我碰到一样的情况,采集的PCM数据大小和input_size不同,也可以通过加一个缓冲buffer来解决。每当采集到PCM数据,就将其存储到缓冲buffer中,当缓冲buffer中数据长度达到input_size时就取出input_size个字节进行编码。

RTP打包

打包编码后的aac数据这位博主写的很详细。

从零开始写一个RTSP服务器(五)RTP传输AAC_JT同学的博客-CSDN博客_rtp发送aac

解码

fdk-aac解码主要有两种模式:RAW模式和ADTS模式。

RAW模式

基本流程如下:

aacDecoder_Open();
aacDecoder_ConfigRaw();
loop
  aacDecoder_Fill();
  aacDecoder_DecodeFrame();

aacDecoder_Close();

1. RAW模式需要在初始化decoder时,调用aacDecoder_ConfigRaw()传入AudioSpecInfo(ASC),这个结构体中存储着送入的raw数据的samplerate、channel等,送数据时需要去掉ADTS头。

2. 自己构建ASC数据可能会出现问题,建议在编码的时候就保存下来。在用fdk-aac编码时调用aacEncInfo()会获取到一个结构体AACENC_InfoStruct,该结构体中最后两个成员confBuf64confSize就分别对应ASC和ASC的size。

ADTS模式

基本流程如下:

aacDecoder_Open();
loop
  /* 添加 增加adts头的代码 */
  aacDecoder_Fill();
  aacDecoder_DecodeFrame();

aacDecoder_Close();

1. ADTS模式初始化时不需要传入AudioSpecInfo(ASC),送数据时需要加上ADTS头。我编码时设置的是AAC_LC,采样率48K,双通道。参数不同的可以参考下面图片。

/* 添加ADTS头
 * 一帧完整AAC数据 = ADTS头(7字节) + AAC源数据
 * 
 * aac_frame
 * aac_frame_size
 *
 */

void addADTSHead(unsigned char *aac_frame, int aac_frame_size)

    int profile = 2; // AAC_LC
    int freqIdx = 3; // sampleRate: 48K
    int chanCfg = 2; // channel: stero

    aac_frame[0] = 0xFF;
    aac_frame[1] = 0xF1;
    aac_frame[2] = (((profile - 1) << 6) + (freqIdx << 2) + (chanCfg >> 2));
    aac_frame[3] = (((chanCfg & 3) << 6) + (aac_frame_size >> 11));
    aac_frame[4] = ((aac_frame_size & 0x7FF) >> 3);
    aac_frame[5] = (((aac_frame_size & 7) << 5) + 0x1F);
    aac_frame[6] = 0xFC;

 

 

 

安卓mediasoupwebrtch264软编解码相关源码分析(代码片段)

文章目录安卓mediasoupwebrtch264软编解码相关源码分析mediasoupH264支持安卓webrtc视频采集流程源码分析安卓mediasoup为啥没有使用H264硬编解码webrtcopenh264软编码源码分析H264Decoder初始化流程openh264提供编解码相关函数webrtc视频H264硬编码... 查看详情

音视频编解码——解码:代码实现(代码片段)

前言:对于从未接触过音视频编解码的同学来说,使用FFmpeg的学习曲线恐怕略显陡峭。本人由于工作需要,正好需要在项目中使用。因此特地将开发过程总结下来。只当提供给有兴趣的同学参考和学习。由于FFmpeg是使用C语言开... 查看详情

androidmediacodec+opengl视频编解码实践笔记(代码片段)

目录AndroidMediaCodec+OpenGL视频编解码实践笔记1.Demo提供的测试功能2.视频编码与相机本地预览渲染2.1初始化编码器与OpenGL环境2.2本地预览渲染与编码3.视频编码与相机本地预览渲染4.踩坑记录5.总结 AndroidMediaCodec+OpenGL视频编解... 查看详情

安卓mediasoupwebrtch264编解码相关源码分析(代码片段)

文章目录安卓mediasoupwebrtch264编解码相关源码分析mediasoupH264支持安卓webrtc视频采集流程源码分析安卓mediasoup为啥没有使用H264硬编解码mediasoup-client-android中VideoStreamEncoder初始化webrtc中VideoStreamEncoder初始化解码器H264Encoder创建mediasoupH... 查看详情

音视频编解码之路:jpeg编码(代码片段)

音视频编解码之路:JPEG编码本文首发于音视频编解码之路:JPEG编码前言本篇是新开坑的音视频编解码之路的第一篇,这个系列主要通过书籍、网上的博文/代码等渠道,整理与各编码协议相关的资料和自己的理解&... 查看详情

音视频编解码之路:jpeg编码(代码片段)

音视频编解码之路:JPEG编码本文首发于音视频编解码之路:JPEG编码前言本篇是新开坑的音视频编解码之路的第一篇,这个系列主要通过书籍、网上的博文/代码等渠道,整理与各编码协议相关的资料和自己的理解&... 查看详情

实时音频编解码之十六opus解码(代码片段)

本文谢绝任何形式转载,谢谢。第五章Opus解码理论上而言,编码的逆过程就是解码,如果理解了第四章编码的内容,这里叙述解码过程显得有所多余,但是笔者在理解Opus编码原理的时候,发现编解码交叉... 查看详情

安卓webrtc开启h264软编解码(代码片段)

文章目录安卓webrtc开启h264软编解码安卓webrtc开启h264软编解码本文首发地址https://blog.csdn.net/CSqingchen/article/details/120199702最新更新地址https://gitee.com/chenjim/chenjimblog本文基于libmediasoupclient3.2.0和webrtcbranch-heads/4147&# 查看详情

摩斯码编解码器(代码片段)

...出于对当初兴趣的尊敬,就顺手实现了一款简易的摩斯编解码器。2、编解码设计  自己玩儿,暂定中文摩斯编码。基本思想是,将汉字对应的四位区位码数字分别编码为数字对应的摩斯码,一个中文对应20位摩斯码。解码过程... 查看详情

视频编解码(代码片段)

视频编码==视频压缩视频解码==视频解压缩后播放视频压缩的情况对于物品没动,只有摄像头动的情况:全局运动预测存整体信息和镜头运动轨迹对于摄像头没动,镜头里只有局部物品运动的情况:存发生变化的(8x8)格子信息... 查看详情

android音视频-mediacodec编解码音视频(代码片段)

...行编码(压缩编码),这里我们来说在Android上音视频编解码逃不过的坑-MediaCodec。MediaCodecPSMediaCodec可以用来编/解码音/视频。MediaCodec简单介绍MediaCodec类可用于访问低级媒体编解码器,即编码 查看详情

asn.1编解码与编程(代码片段)

ASN.1编解码与编程荣涛2021年8月23日2386499836@qq.com1.概述ASN.1–AbstractSyntaxNotationdotone,抽象记法1。数字1被ISO加在ASN的后边,是为了保持ASN的开放性,可以让以后功能更加强大的ASN被命名为ASN.2等,但至今也没有出... 查看详情

asn.1编解码:asn1c-oran-e2ap编解码示例(代码片段)

ASN.1编解码:asn1c-ORAN-E2AP编解码示例荣涛2021年9月2日整体代码:https://gitee.com/rtoax/test/tree/master/ASN.1/asn1c/jt_sran/e2ap1.生成的可执行文件前面文档中已经给出了该测试文件的帮助信息,这里再给出一遍[rongtao@localhoste2ap]... 查看详情

[总结]ffmpeg视音频编解码零基础学习方法(代码片段)

[总结]FFMPEG视音频编解码零基础学习方法置顶 2013年11月16日00:04:05 雷霄骅 阅读数:569933 标签: ffmpeg编解码学习 更多个人分类: FFMPEG所属专栏: FFmpeg 版权声明:本文为博主原创文章,未经博主... 查看详情

base64编解码----支持64编码(代码片段)

...必传参数.unescape()函数可对通过escape()编码的字符串进行解码。//base编码//value是编码后的值//input是需要编码的值functionbase64Encode(input)letvalue;value=encodeURIComponent(input) 查看详情

android音视频-mediacodec编解码音视频(代码片段)

...行编码(压缩编码),这里我们来说在Android上音视频编解码逃不过的坑-MediaCodec。MediaCodecPSMediaCodec可以用来编/解码音/视频。MediaCodec简单介绍MediaCodec类可用于访问低级 查看详情

视频监控与视频编解码技术(代码片段)

视频监控与视频编解码技术参考文献链接https://mp.weixin.qq.com/s/UW4Z0vu_Wypc0ddymrOkpghttps://mp.weixin.qq.com/s/RfsTTNekpJeIX5DH4ViAqghttps://mp.weixin.qq.com/s/smj5bsqXgKuz7RvoLqFKjghttps://mp.weixin.qq.com/s/p5gB7q03 查看详情

java#java对图片进行base64编解码(代码片段)

1.解码BASE64protectedstaticStringgenerateImage(StringimgStr,Stringpath)throwsIOException//data:image/jpeg;base64,intstart=imgStr.indexOf("/");intend=imgStr.indexOf(";");Stringex 查看详情