ios下使用speex进行音频压缩
2017-10-14 11:38
323 查看
前言
本片文章是关于ios下关于使用speex进行pcm音频压缩的实例,一般应用在语音通话中。网上搜罗了一些资料,发现不能成为一个整体,在此整理一下,做个总结。
github地址:https://github.com/finnfu/ios_speex
简单介绍一下:
speex库文件:
封装的若干类:
分为三个模块
一:音频的实时采集
这里直接使用的 作者zxy写的音频采集模块XYRecorder,使用的是audiounit,读者可以自行学习,这里不展开。二:对采集的音频做实时压缩(如果是语音通话,还有传输的过程,传输用的是tutk的p2p)
这里是对作者Jiang Chuncheng封装的SpeexCodec,做了一些改动,可以直接使用核心就是下面四个方法:
- (void)open:(int)quality; //初始化方法
- (NSData *)encode:(short *)pcmBuffer length:(int)lengthOfShorts; //压缩
- (NSData*)decode:(Byte *)encodedBytes length:(int)lengthOfBytes; //解压缩
- (void)close; //用完记得关闭
三:播放pcm文件
这个模块使用的是作者Android88封装的PCMDataPlayer此模块主要是用于验证,采集音频经过压缩,解压缩后,还可以正常播放,在语音通话中,用于播放接收到的解压缩后的pcm数据。
需要注意的点:
在SpeexCodec初始化的时候,speex_encoder_ctl(encodeState, SPEEX_GET_FRAME_SIZE, &encodeFrameSize);
speex_decoder_ctl(decodeState, SPEEX_GET_FRAME_SIZE, &decodeFrameSize);
执行到上面两句代码的时候,发现encodeFrameSize和decodeFrameSize都是320,是指320个short,640个byte。
所以在encode时,这里需要传入的数据长度需要时640字节,由于实时录音出来的pcm数据无法凑整640。在initFormat(XYRecorder中)相关设置的条件下,设置0.002秒的回调,
这样每次出来的数据是64,10次回调凑够640字节,在执行压缩的操作。具体的代码逻辑可以在static OSStatus RecordCallback(XYRecorder中)中查看。
做speex压缩的时候当时就是在这里卡了好几天,一直压缩解压缩出来的数据有问题。关键就是这个640byte。
好了,本片文章只是对实例的一个补充说明,具体的代码请见实例代码
相关文章推荐
- 音频压缩工具——Speex的使用(Android&iOS语音录音技术预演)
- 关于使用speex进行音频压缩
- 音频压缩工具——Speex的使用(Android&iOS语音录音技术预演)
- ios 使用AVAudioRecorder录制音频,然后用AVAudioPlayer进行播放
- 音频压缩工具——Speex的使用
- C++中利用Speex进行音频压缩
- 音频压缩(Speex使用&Opus简介)--转
- 音频压缩工具——Speex的使用
- 音频压缩工具——Speex的使用
- iOS 使用lame库进行音频转mp3(二)
- 音频压缩工具——Speex的使用
- 音频压缩工具——Speex的使用
- C++中利用Speex进行音频压缩
- 音频压缩工具——Speex的使用
- ios开发之使用AudioQueue进行音频的播放
- 音频(四) - 音频压缩(Speex使用&Opus简介)
- iOS 使用lame库进行音频转mp3(一)
- iOS 使用AFN 进行单图和多图上传 摄像头/相册获取图片,压缩图片
- 使用CODECs压缩Wave音频
- 在HttpModule中使用gzip,deflate协议对aspx页面进行压缩(转)