ios解析G711A

前段时间在做摄像头想关的项目的时候,在播放卡录得时候,摄像头返回来的数据的时候,发现返回来的音频的格式是将pcm编码成G711A的数据。所以只能将G711A转换为pcm,然后在进行播放。于是,就疯狂的在网上找资料。
但是,并没有找到G711A转pcm的相关资料。
于是,就开始研究编码格式.


先补充一下pcm和G711的编码方式
1)pcm
PCM是一种编码格式,pcm是裸流。
所以,pcm我们直接就能够就行播放


2)G711

编码原理请看这篇

在开始讲G711A转为pcm的时候,我们先了解一下pcm是怎么被转换为G711的。
以下的相互转换,都会用到一个三方库。


屏幕快照 2018-06-21 下午3.35.29.png

1)pcm-> G711
从上面的编码原理可以知道,pcm转G711是进行了压缩转换。
起压缩率为1:2, 即把16位数据压缩成8位

    NSUInteger datalength = [inputData length]; 
    Byte *byteData = (Byte *)[inputData bytes];   
    short *pPcm = (short *)byteData;  
    int outlen = 0;    
    int len =(int)datalength / 2;    
    Byte * G711Buff = (Byte *)malloc(len);    
    memset(G711Buff,0,len);   
    int i;    
    for (i=0; i<len; i++) {
        G711Buff[i] = linear2alaw(pPcm[i]);      
    }    
    outlen = i;   
    Byte *sendbuff = (Byte *)G711Buff;   
    NSData * sendData = [[NSData alloc]initWithBytes:sendbuff length:len];

2)G711A->pcm
因为我们知道pcm转G711是将pcm进行了压缩,那么G711转pcm我们就需要将G711重新编码后,长度会增加会原来的两倍。

我收到的数据是char类型的buffer数据

dataPtr:(const char *)data_ptr

遍历收到的数据,解析每个字节

short * pcmOuT = (short *)(malloc(dataLen*2));//因为转换后长度为原来的两倍,所以申请一个数据长度两倍的数组
for (int i =0; i<dataLen; i++) {
    pcmOuT[i] = (int16_t)alaw2linear(data_ptr[i]);
}

这样解析出来的数据就是pcm。可以截止播放.
G711U转pcm也是类似的做法

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AGI阅读 16,003评论 3 119
  • 视频 视频实质:纯粹的视频(不包括音频)实质上就是一组帧图片,经过视频编码成为视频(video)文件再把音频(au...
    勇敢的_心_阅读 3,006评论 1 30
  • 微风,细雨,落叶,别家院,行走的人;鸣笛,车窗,站台,帆布墙,过客的脚。 霓虹,阑珊,溪水,千里马,闺中的琴;滴水...
    Cherry茜阅读 178评论 0 1
  • (一) 在银辉四射的朵朵轻云中飞驰的点点繁星,照亮了黑魆魆的大地,同时也照亮了面色憔悴的我。我拄着...
    风间大辅阅读 426评论 0 0
  • 近日,“一企一证”实施在即,将进一步调整实施工业产品生产许可证管理的产品目录,取消19类工业产品生产许可证管理,将...
    我可能是个假百晓生阅读 279评论 0 0