音频编解码之G711
《音视频应用开发系列文章目录》
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相关推荐
- G711(PCM/PCMA/PCMU),G721,G723,G729等 音频编解码
G711,G721,G723音频编解码,G729音频库,Android G711(PCMA/PCMU).G726.PCM音频转码到AAC,ffmpeg接收g723音频流,Android G726语音编 ...
- 详解音频编解码的原理、演进和应用选型等
本文来自网易云音乐音视频实验室负责人刘华平在LiveVideoStackCon 2017大会上的分享,并由LiveVideoStack根据演讲内容整理而成(本次演讲PPT文稿,请从文末附件下载). 1 ...
- 即时通讯音视频开发(十八):详解音频编解码的原理、演进和应用选型
1.引言 大家好,我是刘华平,从毕业到现在我一直在从事音视频领域相关工作,也有一些自己的创业项目,曾为早期Google Android SDK多媒体架构的构建作出贡献. 就音频而言,无论是算法多样性, ...
- FFMPEG视音频编解码学习(1)
###开篇 看过了FFMPEG视音频编解码的基础知识,接着还有许多比如制作一个基于FFMPEG的视频播放器等,但是好像比较抽象,而且在公司的mac上很多软件也没有(重点是看的一头雾水), 还是老老实实 ...
- 即时通讯音视频开发(六):如何开始音频编解码技术的学习
前言 即时通讯应用中的实时音视频技术,几乎是IM开发中的最后一道高墙.原因在于:实时音视频技术 = 音视频处理技术 + 网络传输技术 的横向技术应用集合体,而公共互联网不是为了实时通信设计的. 系列文 ...
- 视音频编解码学习工程:JPEG分析器
===================================================== 视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习 ...
- 视音频编解码学习工程:TS封装格式分析器
===================================================== 视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习 ...
- 视音频编解码学习工程:FLV封装格式分析器
===================================================== 视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习 ...
- 视音频编解码学习工程:H.264分析器
===================================================== 视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习 ...
最新文章
- SRWebSocket源码浅析(下)
- VMware备份研究
- 上班请病假还得看AI脸色,10秒钟判别真假,打工人太难了
- c# 第28节 面向对象概述
- react 动态添加组件属性_这么高质量React面试题(含答案),看到就是赚到了!...
- 华为c语言编程规范_单片机开发之C语言编程基本规范
- 后端技术:Nginx从安装到高可用,看完本篇就够了!
- 在JBoss Fuse / Fabric8 / Karaf中使用Byteman
- Emlog文章海报插件
- springcloud(十):服务网关zuul
- golang中tcp socket粘包问题和处理
- 基于react的简单TODOList
- 怎么用editplus写asm文件_本周分享 | 用Typora写markdown文件
- PID控制器的输入量和输出量的物理关系解释
- 易经- 第一卦 乾卦
- “体验版”PyTorch 2.0备受瞩目,它到底好在哪里?
- C语言-计算存款利息。有1000元,想存一年。有3种方法可选:(1)活期,年利率为r1;(2)一年期定期,年利率为r2;(3)存两次半年定期,年利率为r3。请分别计算出一年后按3种方法所得到的本息和。
- 雷达图 自定义点样式 渐变背景色
- iOS-图片上传(第三方服务器)实现图片的上传和获取
- LINUX内核模块上下文,飞凌嵌入式知识分享-Linux内核模块编译