《音视频应用开发系列文章目录》

G711规定了如何将128kbps的raw pcm信号转为64kbps的g711u/g711a音频信号。本文在前人的基础上封装了G711的编解码算法,有两种实现(基于算法和基于查表),查表的速度更快(源码下载)。

#ifndef _G711_H_
#define _G711_H_/***********************************************************
**  Author:kaychan
**  Data:2019-11-21
**  Mail:1203375695@qq.com
**  Explain:a g711 codec use lookup table and algorithm
***********************************************************/// base on lookup table
int g711a_encode(unsigned char *odata, short *idata, int ilen);
int g711u_encode(unsigned char *odata, short *idata, int ilen);
int g711a_decode(short *odata, unsigned char *idata, int ilen);
int g711u_decode(short *odata, unsigned char *idata, int ilen);// base on algorithm
int g711a_encode2(unsigned char g711_data[], const short amp[], int len);
int g711u_encode2(unsigned char g711_data[], const short amp[], int len);
int g711a_decode2(short amp[], const unsigned char g711a_data[], int g711a_bytes);
int g711u_decode2(short amp[], const unsigned char g711u_data[], int g711u_bytes);#endif

AvG711类封装

基于上述封装G711音频编解码类AvG711

AvG711.h

#ifndef _AV_G711_H_
#define _AV_G711_H_/***********************************************************
**  Author:kaychan
**  Data:2019-11-21
**  Mail:1203375695@qq.com
**  Explain:a g711 codec class
***********************************************************/typedef enum AvG711Fmt_E {AvG711Fmt_Alaw = 0,AvG711Fmt_Ulaw = 1,
}AvG711Fmt;class AvG711 {public:AvG711(AvG711Fmt fmt = AvG711Fmt_Alaw);~AvG711();int encode(unsigned char **odata, unsigned char *idata, int ilen);int encode(const char *g711_file, const char *pcm_file);int decode(unsigned char **odata, unsigned char *idata, int ilen);int decode(const char *pcm_file, const char *g711_file);void free_output_data(unsigned char *odata);private:AvG711Fmt fmt_;
};#endif

AvG711.cpp

#include "AvG711.h"
#include "g711.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>AvG711::AvG711(AvG711Fmt fmt) {fmt_ = fmt;
}AvG711::~AvG711() {}int AvG711::encode(unsigned char **odata, unsigned char *idata, int ilen) {if (ilen > 0) {int olen = ilen / 2;*odata = (unsigned char *)malloc(sizeof(unsigned char) * olen);if (*odata) {if(fmt_ == AvG711Fmt_Alaw) return g711a_encode(*odata, (short *)idata, ilen);else if(fmt_ == AvG711Fmt_Ulaw)return g711u_encode(*odata, (short *)idata, ilen);}}return -1;
}int AvG711::encode(const char *g711_file, const char *pcm_file) {FILE *ifile = fopen(pcm_file, "rb");FILE *ofile = fopen(g711_file, "wb");if (ifile && ofile) {int r = -1;do {unsigned char ibuf[160];r = fread(ibuf, 1, 160, ifile);if (r > 0) {unsigned char *obuf;int olen = encode(&obuf, ibuf, r);fwrite(obuf, 1, olen, ofile);free_output_data(obuf);memset(ibuf, 0, sizeof(ibuf));}} while (r > 0);fclose(ifile);fclose(ofile);return 0;}return -1;
}int AvG711::decode(unsigned char **odata, unsigned char *idata, int ilen) {if (ilen > 0) {int olen = ilen * 2;*odata = (unsigned char *)malloc(sizeof(unsigned char) * olen);if (*odata) {if (fmt_ == AvG711Fmt_Alaw)return g711a_decode((short *)(*odata), idata, ilen);else if (fmt_ == AvG711Fmt_Ulaw)return g711u_decode((short *)(*odata), idata, ilen);}}return -1;
}int AvG711::decode(const char *pcm_file, const char *g711_file) {FILE *ifile = fopen(g711_file, "rb");FILE *ofile = fopen(pcm_file, "wb");if (ifile && ofile) {int r = -1;do {unsigned char ibuf[80];r = fread(ibuf, 1, 80, ifile);if (r > 0) {unsigned char *obuf;int olen = decode(&obuf, ibuf, r);fwrite(obuf, 1, olen, ofile);free_output_data(obuf);memset(ibuf, 0, sizeof(ibuf));}} while (r > 0);fclose(ifile);fclose(ofile);return 0;}return -1;
}void AvG711::free_output_data(unsigned char *odata) {free(odata);
}

调用实例

AvG711 g711a(AvG711Fmt_Alaw);
g711a.encode("g711a.g711", "xxx.pcm"); // pcm->pcma
g711a.decode("xxx.pcm", "g711a.g711"); // pcma->pcmAvG711 g711u(AvG711Fmt_Ulaw);
g711u.encode("g711u.g711", "xxx.pcm"); // pcm->pcmu
g711u.decode("xxx.pcm", "g711u.g711"); // pcmu->pcm

音频编解码之G711相关推荐

  1. G711(PCM/PCMA/PCMU),G721,G723,G729等 音频编解码

    G711,G721,G723音频编解码,G729音频库,Android G711(PCMA/PCMU).G726.PCM音频转码到AAC,ffmpeg接收g723音频流,Android G726语音编 ...

  2. 详解音频编解码的原理、演进和应用选型等

    本文来自网易云音乐音视频实验室负责人刘华平在LiveVideoStackCon 2017大会上的分享,并由LiveVideoStack根据演讲内容整理而成(本次演讲PPT文稿,请从文末附件下载). 1 ...

  3. 即时通讯音视频开发(十八):详解音频编解码的原理、演进和应用选型

    1.引言 大家好,我是刘华平,从毕业到现在我一直在从事音视频领域相关工作,也有一些自己的创业项目,曾为早期Google Android SDK多媒体架构的构建作出贡献. 就音频而言,无论是算法多样性, ...

  4. FFMPEG视音频编解码学习(1)

    ###开篇 看过了FFMPEG视音频编解码的基础知识,接着还有许多比如制作一个基于FFMPEG的视频播放器等,但是好像比较抽象,而且在公司的mac上很多软件也没有(重点是看的一头雾水), 还是老老实实 ...

  5. 即时通讯音视频开发(六):如何开始音频编解码技术的学习

    前言 即时通讯应用中的实时音视频技术,几乎是IM开发中的最后一道高墙.原因在于:实时音视频技术 = 音视频处理技术 + 网络传输技术 的横向技术应用集合体,而公共互联网不是为了实时通信设计的. 系列文 ...

  6. 视音频编解码学习工程:JPEG分析器

    ===================================================== 视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习 ...

  7. 视音频编解码学习工程:TS封装格式分析器

    ===================================================== 视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习 ...

  8. 视音频编解码学习工程:FLV封装格式分析器

    ===================================================== 视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习 ...

  9. 视音频编解码学习工程:H.264分析器

    ===================================================== 视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习 ...

最新文章

  1. SRWebSocket源码浅析(下)
  2. VMware备份研究
  3. 上班请病假还得看AI脸色,10秒钟判别真假,打工人太难了
  4. c# 第28节 面向对象概述
  5. react 动态添加组件属性_这么高质量React面试题(含答案),看到就是赚到了!...
  6. 华为c语言编程规范_单片机开发之C语言编程基本规范
  7. 后端技术:Nginx从安装到高可用,看完本篇就够了!
  8. 在JBoss Fuse / Fabric8 / Karaf中使用Byteman
  9. Emlog文章海报插件
  10. springcloud(十):服务网关zuul
  11. golang中tcp socket粘包问题和处理
  12. 基于react的简单TODOList
  13. 怎么用editplus写asm文件_本周分享 | 用Typora写markdown文件
  14. PID控制器的输入量和输出量的物理关系解释
  15. 易经- 第一卦 乾卦
  16. “体验版”PyTorch 2.0备受瞩目,它到底好在哪里?
  17. C语言-计算存款利息。有1000元,想存一年。有3种方法可选:(1)活期,年利率为r1;(2)一年期定期,年利率为r2;(3)存两次半年定期,年利率为r3。请分别计算出一年后按3种方法所得到的本息和。
  18. 雷达图 自定义点样式 渐变背景色
  19. iOS-图片上传(第三方服务器)实现图片的上传和获取
  20. LINUX内核模块上下文,飞凌嵌入式知识分享-Linux内核模块编译

热门文章

  1. HTML+CSS系列学习:重生之我要精通编程语言修仙
  2. 目标检测算法(YOLOv3)
  3. 微信小程序云开发入门教程
  4. TC第三方控件(官网)
  5. 模糊C均值聚类算法的实现
  6. opencv中image watch插件安装使用教程
  7. HCIP实验1-5:OSPF虚电路和区域路由过滤
  8. 包围盒算法基本知识(一)
  9. java检测安卓程序退出_Android:应用程序退出后出现奇怪的NameNotFoundException
  10. MSN无法登陆报80048820错误