来自:http://blog.csdn.net/qq_24551315/article/details/51134999

思路: 将G711转为PCM , 然后将PCM数据转为AAC,

G711转为PCM,可以使用上一篇中讲到的方式, 而PCM转AAC(ADTS),采用的是faac这个开源库

这里只讲怎么实现, 了解更详细的内容,则需要自己查找学习了.

直接上代码.

[html]  view plain copy
  1. JNIEXPORT jint JNICALL Java_com_ff_aacdemo_jni_G711Coder_g711ToAAC
  2. (JNIEnv *env, jobject obj){
  3. unsigned long sampleRate = 8000;//采样率
  4. unsigned int channels = 1;//通道数
  5. unsigned int pcmBitSize = 16;// 量化位数
  6. long inputSamples;
  7. long maxOutputBytes;
  8. faacEncHandle codeHandle = faacEncOpen(sampleRate, channels, &inputSamples, &maxOutputBytes);
  9. int maxInputBytes = inputSamples * pcmBitSize / 8;
  10. LOGD("inputSamples = %ld, maxOutputBytes = %ld, maxInputBytes = %d", inputSamples, maxOutputBytes, maxInputBytes);
  11. faacEncConfigurationPtr pConfigPtr = faacEncGetCurrentConfiguration(codeHandle);
  12. pConfigPtr->inputFormat = FAAC_INPUT_16BIT;//输入数据类型
  13. pConfigPtr->outputFormat = 1; //0-Raw ; 1-ADTS
  14. pConfigPtr->useTns= 0;//瞬时噪声定形(temporal noise shaping,TNS)滤波器
  15. pConfigPtr->useLfe= 0;//低频效果
  16. pConfigPtr->aacObjectType= LOW; //编码类型
  17. pConfigPtr->shortctl=SHORTCTL_NORMAL;
  18. pConfigPtr->quantqual=50; // 编码质量
  19. pConfigPtr->mpegVersion = MPEG2;
  20. faacEncSetConfiguration(codeHandle, pConfigPtr);
  21. int m_nMaxInputBytes = inputSamples * pcmBitSize / 8;
  22. char pbPCMBuffer[m_nMaxInputBytes]; // 读取PCM数据
  23. char pbAACBuffer[maxOutputBytes];
  24. LOGD("g711topcm m_nMaxInputBytes = %d", m_nMaxInputBytes);
  25. LOGD("g711topcm maxOutputBytes = %d", maxOutputBytes);
  26. FILE* fpIn = fopen("/storage/emulated/0/t/pcm_to_g711.g711","rb");
  27. FILE* fpOut = fopen("/storage/emulated/0/t/pcm_to_g711.aac", "wb");
  28. size_t g711_BufferSize = m_nMaxInputBytes / 2;
  29. LOGD("g711topcm g711_BufferSize = %d", g711_BufferSize);
  30. char g711_Buffer[g711_BufferSize];//G711->PCM后,体积会变为原来的两倍,而PCM一次编码需要的最小字节数为m_nMaxInputBytes(如果小于它,编码后的数据不正常)
  31. size_t len;
  32. LOGD("********************************");
  33. while((len = fread(g711_Buffer, 1, g711_BufferSize, fpIn)) > 0){
  34. LOGD("g711topcm length = %d", len);
  35. char pcmBuffer[len];
  36. int pcmbufsize = g711_decode(pcmBuffer, g711_Buffer, len); // g711 -> pcm  (g711 转为 pcm 后其体积会增加一倍)
  37. LOGD("g711topcm pcmbufsize = %d", pcmbufsize);
  38. // pcm -> aac
  39. int inputSamples = pcmbufsize / (pcmBitSize / 8);
  40. LOGD("g711topcm inputSamples = %d", inputSamples);
  41. int nRetVal = faacEncEncode(codeHandle, (int*) pcmBuffer, inputSamples, pbAACBuffer, maxOutputBytes);
  42. LOGD("g711topcm nRetVal = %d", nRetVal);
  43. fwrite(pbAACBuffer, 1, nRetVal, fpOut);
  44. LOGD("----------------------------------");
  45. }
  46. fclose(fpIn);
  47. fclose(fpOut);
  48. faacEncClose(codeHandle);
  49. return 0;
  50. }

如果对AAC 的编解码不知道怎么弄的话, 可以看下一篇, 使用 faac, faad  实现 AAC 与 PCM 的互转
参考文章

http://blog.csdn.net/jwzhangjie/article/details/8782656
http://www.myexception.cn/program/1833150.html
http://iask.sina.com.cn/b/10699938.html
http://www.zhihu.com/question/20035259?utm_campaign=rss&utm_medium=rss&utm_source=rss&utm_content=title

G711转AAC代码总结【转】相关推荐

  1. 常用音频编码格式简介(PCM、G726、ADPCM、LPCM、G711、AAC)

    目录 PCM.G726.ADPCM.LPCM.G711.AAC介绍 格式对比 音频帧长 音频播放过程 PCM PCM全称Pulse-Code Modulation,翻译一下是脉冲调制编码. 在音视频中 ...

  2. LPCM AAPCM G711 G726 AAC 音频采样、编码及帧大小计算

    LPCM LPCM: linear pulse code modulation     LPCM,即线性脉冲编码调制,是一种非压缩音频数字化技术,是一种未压缩的原音重现,在普通CD.DVD及其他各种要 ...

  3. ffmpeg之封装AAC

    AAC是mp4的音频格式,而安防摄像机基本上使用G711等编码,想要封装成mp4供web预览,就需要跨越g711转AAC的这个难关. ffmpeg作为音视频界的泰斗,可以帮助我们实现这一功能. 代码流 ...

  4. G711编解码(G711与PCM类型互转)

    总结网上的G711编解码, 将其一直到andorid系统上去, 通过jni的来进行G711和PCM 的互转,  由于对于这两种格式没有深入的了解,, 所以如果想深入的了解他们可以百度, 在这里只是实现 ...

  5. RTP协议封装H264/H265/AAC

    <RTSP实时音视频传输介绍> 目录 一.前言 二.RTP基本格式介绍 1.RTP 固定头 2.RTP 扩展头 3.RTP 载荷 三.RTP封装H264 1.封装包类型 四.RTP封装H2 ...

  6. RTSP服务器:RTP传输AAC流

    工作流程: 1)读取ADTS头(7字节),解析得到aac帧的信息(频率,声道,帧长度) 2)读取aac原始数据块,使用RTP打包aac原始数据   RTP打包h264码流时,由于h264数据长度不稳定 ...

  7. libfdk_aac编码AAC

    目录 前言 1.AAC介绍 2.AAC 格式 一.libfdk_aac介绍 二.libfdk_aac主要API介绍 1.AACENC_ERROR aacEncOpen(HANDLE_AACENCODE ...

  8. 快速搭建基于GB/T28181-2016的完整音视频框架

    快速搭建基于GB/T28181-2016的完整音视频框架 建设目标 国家相关标准.行业标准 平台框架结构 平台开放 前端设备SDK 视频接入网关 PC客户端 移动客户端(Android) 标准过检 更 ...

  9. DAVINCI DM3730开发攻略——应用程序例程分析

    过完2015年春节回来了,利用上班前的几天时间,先把这篇文章写完,本来是先写<DAVINCI DM3730开发攻略--linux-2.6.32移植>,但是那篇文章涉及内核的东西太多,不太好 ...

最新文章

  1. leetcode算法题--验证二叉树的前序序列化
  2. 苹果xsmax怎么开机_苹果XSMAX进水不开机维修
  3. Zabbix基础概念
  4. 点站点链接出现短时间白屏或闪屏现象
  5. 读《世界是数字的》有感
  6. fhq_treap || BZOJ 3223: Tyvj 1729 文艺平衡树 || Luogu P3391 【模板】文艺平衡树(Splay)...
  7. 权限管理系统2_权限表,权限模块表
  8. Multi-catch parameters are not allowed for source level below 1.7 解决方法
  9. macOS 10.11.* 安装scrapy
  10. 厦门大学c语言第七八章作业答案,厦门大学 运筹学 第七、八章作业
  11. python 除数总是提示为0_Python错误的处理方法
  12. preg_match
  13. 李炎恢老师的javascript的讲义以及 附带着javascript手册
  14. Check Exception or Uncheck Exception
  15. 眼镜商城开发,让眼镜世界更丰富
  16. 知到智慧树君子学堂智慧树章节答案
  17. VisualSVN 用户权限设置时,Everyone,Group,User优先级组合原则(与 Subversion 对比)...
  18. 文字识别 SDK 11 给大家看一个手册
  19. 【应用推荐】如何选择适合自己的笔记应用?附热门笔记应用上手总结
  20. 人工智能-数据分析-鸢尾花

热门文章

  1. 华为3C联通移动一键刷入官方recovery,解决root后如何刷回原版系统,刷机后无法进入系统的问题
  2. 自动化基本策略及成熟度定义
  3. win2000,winxp-下载
  4. 服务器端名片识别/ocr识别
  5. v8,spidermonkey,chakra,spidermonkey四大主流JS引擎安装教程
  6. Ubuntu 22.04 2023.2更新后xubuntu 进入不了桌面
  7. 飞机飞行动力学与控制仿真
  8. app界面设计字体规范
  9. python 网格交易源码_网格交易策略源码(MT4.0源码)
  10. VueCli3开发订餐app项目