分享

ios使用opus压缩和解压缩PCM文件

 QomoIT 2018-01-19

参照前两篇文章编译后,导入到工程,就可以使用了

具体四步:

1、opus_encoder_create创建

2、opus_encoder_ctl设置

3、opus_encode / opus_decode 编解码

4、opus_encoder_destroy释放

附上代码

.h

  1. #import <Foundation/Foundation.h>  
  2.   
  3. @interface opusCodec : NSObject  
  4. -(void)opusInit;  
  5. -(NSData*)encodePCMData:(NSData*)data;  
  6. -(NSData*)decodeOpusData:(NSData*)data;  
  7. @end  

.m


  1. #import "opusCodec.h"  
  2. #import "opus.h"  
  3.   
  4. #define WB_FRAME_SIZE 160  
  5.   
  6. @implementation opusCodec  
  7. {  
  8.     OpusEncoder *enc;  
  9.     OpusDecoder *dec;  
  10.     int opus_num;  
  11.     int pcm_num;  
  12.     unsigned char opus_data_encoder[40];  
  13. }  
  14.   
  15. -(void)opusInit  
  16. {  
  17.     int error;  
  18.     int Fs = 16000;//采样率  
  19.     int channels = 1;  
  20.     int application = OPUS_APPLICATION_VOIP;  
  21.       
  22.     opus_int32 bitrate_bps = kDefaultSampleRate;  
  23.     int bandwidth = OPUS_AUTO;//OPUS_BANDWIDTH_NARROWBAND 宽带窄带  
  24.     int use_vbr = 0;  
  25.     int cvbr = 1;  
  26.     int complexity = 4; //录制质量 1-10  
  27.     int packet_loss_perc = 0;  
  28.       
  29.     enc = opus_encoder_create(Fs, channels, application, &error);  
  30.     dec = opus_decoder_create(Fs, channels, &error);  
  31.       
  32.     opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate_bps));  
  33.     opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(bandwidth));  
  34.     opus_encoder_ctl(enc, OPUS_SET_VBR(use_vbr));  
  35.     opus_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(cvbr));  
  36.     opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(complexity));  
  37.     opus_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(packet_loss_perc));  
  38.     opus_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_VOICE));//信号  
  39. }  
  40.   
  41. - (NSData *)encode:(shortshort *)pcmBuffer length:(int)lengthOfShorts  
  42. {  
  43.     NSMutableData *decodedData = [NSMutableData data];  
  44.     int frame_size = WB_FRAME_SIZE;  
  45.     short input_frame[frame_size];  
  46.     opus_int32 max_data_bytes = 2500;  
  47.       
  48.     memcpy(input_frame, pcmBuffer, frame_size * sizeof(short));  
  49.     int encodeBack = opus_encode(enc, input_frame, frame_size, opus_data_encoder, max_data_bytes);  
  50.     NSLog(@"encodeBack===%d",encodeBack);  
  51.     if (encodeBack > 0)  
  52.     {  
  53.         [decodedData appendBytes:opus_data_encoder length:encodeBack];  
  54.     }  
  55.       
  56.     return decodedData;  
  57. }  
  58.   
  59. //int decode(unsigned char* in_data, int len, short* out_data, int* out_len) {  
  60. -(int)decode:(unsigned charchar *)encodedBytes length:(int)lengthOfBytes output:(short*)decoded {  
  61.      int frame_size = WB_FRAME_SIZE;  
  62.     char cbits[frame_size + 1];  
  63.      memcpy(cbits, encodedBytes, lengthOfBytes);  
  64.     pcm_num = opus_decode(dec,  
  65.                         cbits,  
  66.                         lengthOfBytes,  
  67.                         decoded,  
  68.                         frame_size,  
  69.                         0);  
  70.   
  71.     return frame_size;  
  72.       
  73.      
  74. }  
  75. -(NSData*)encodePCMData:(NSData*)data  
  76. {  
  77.       
  78.       
  79.  return  [self encode:(shortshort *)[data bytes] length:[data length]/sizeof(short)];  
  80. }  
  81.   
  82. -(NSData*)decodeOpusData:(NSData*)data  
  83. {  
  84.     NSInteger len = [data length];  
  85.     NSLog(@"数据长度===%d",len);  
  86.       
  87.     Byte *byteData = (Byte*)malloc(len);  
  88.       
  89.     memcpy(byteData, [data bytes], len);  
  90.       
  91.     short decodedBuffer[1024];  
  92.       
  93.     int nDecodedByte = sizeof(short) * [self decode:byteData length:len output:decodedBuffer];  
  94.     NSLog(@"返回的长度==%d",nDecodedByte);  
  95.     NSData* PCMData = [NSData dataWithBytes:(Byte *)decodedBuffer length:nDecodedByte];  
  96.     return PCMData;  
  97. }  
  98.   
  99.   
  100. @end  


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多