amr ios 播放
2016-12-06 15:53:06 aa654403231 阅读数 3777

安卓上传的语音格式是amr,而AVAudioPlayer并不支持播放amr文件格式。

思路是把amr文件转成wav文件。

NSString *urlStr=[NSString stringWithFormat:@"%@/msp%@",ZJURL,self.shareF.shareInfo.referUris[0]];
        NSURL *url = [[NSURL alloc]initWithString:urlStr];
        NSData * audioData = [NSData dataWithContentsOfURL:url];
        
        //将数据保存到本地指定位置
        NSString *docDirPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        filePath = [NSString stringWithFormat:@"%@/%@.amr", docDirPath , self.shareF.shareInfo.idNum];
        
        wavfile=[NSString stringWithFormat:@"%@/%@.wav", docDirPath , self.shareF.shareInfo.idNum];
        
        mp3file=[NSString stringWithFormat:@"%@/%@.mp3", docDirPath , self.shareF.shareInfo.idNum];
        [audioData writeToFile:filePath atomically:YES];
        [audioData writeToFile:mp3file atomically:YES];
//        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        [VoiceConverter amrToWav:filePath wavSavePath:wavfile];
//        });

iOS上传的mp3,所以进行判断

 NSFileManager * fileManager=[ NSFileManager defaultManager ];
 
        //播放本地音乐
        float msize= [[fileManager attributesOfItemAtPath:wavfile error:nil] fileSize]/(1024.0*1024.0);
        
        CDLog(@"wav文件大小:%f",msize);
        NSURL *fileURL;
        if (msize>0) {
            CDLog(@"mav文件");
            fileURL=[NSURL fileURLWithPath:wavfile];

        }else{
            CDLog(@"mp3文件");
            fileURL=[NSURL fileURLWithPath:mp3file];

        }
        self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];
        [self.player play];
        
        self.player.delegate = self;

这里面需要VoiceConvert第三方库,网上找的会报错,不支持arm64,需要引入这些




2016-10-21 11:09:00 weixin_34361881 阅读数 22

AMR

AMR全称Adaptive Multi-Rate,自适应多速率编码,主要用于移动设备的音频(手机打电话),压缩比比较大,但相对其他的压缩格式质量比较差,由于多用于人声,通话,效果还是很不错的。

分类1. AMR: 又称为AMR-NB,相对于下面的WB而言,语音带宽范围:300-3400Hz,8KHz抽样

分类2. AMR-WB:AMR WideBand,语音带宽范围: 50-7000Hz 16KHz抽样

AMR-WB采样频率为16kHz,是一种同时被国际标准化组织ITU-T和3GPP采用的宽带语音编码标准,也称为G722.2标准。AMR-WB提供语音带宽范围达到50~7000Hz,用户可主观感受到话音比以前更加自然、舒适和易于分辨。与之作比较,现在GSM用的EFR(Enhenced Full Rate,增强型全速率编码)采样频率为8kHz,语音带宽为200~3400Hz。AMR-WB应用于窄带GSM(全速信道16k,GMSK)的优势在于其可采用从6.6kb/s, 8.85kb/s和12.65kb/s三种编码,当网络繁忙时C/I恶化,编码器可以自动调整编码模式,从而增强QoS。在这种应用中,AMR-WB抗扰度优于AMR-NB。AMR-WB应用于EDGE、3G可充分体现其优势。足够的传输带宽保证AMR-WB可采用从 6.6kb/s到23.85kb/s共九种编码,语音质量超越PSTN固定电话。

以上是关于AMR的介绍,从中我们可以看出AMR是两类的,如果android设置的参数有问题,iOS是转换不了AMR文件的(iOS 4.3以上是不支持AMR的,要转换下格式,博主是用libopencore-amrnb来转换的)

废话不多说,以下为android的设置参数:

1610969-819da12998896646.png
android语音参数设置

ps:有些小童鞋私信博主想要个录音并转换格式的demo,博主抽了点时间做了个demo

2017-01-22 09:54:34 sinat_28709097 阅读数 3225

AMR

AMR全称Adaptive Multi-Rate,自适应多速率编码,主要用于移动设备的音频(手机打电话),压缩比比较大,但相对其他的压缩格式质量比较差,由于多用于人声,通话,效果还是很不错的。

分类1. AMR: 又称为AMR-NB,相对于下面的WB而言,语音带宽范围:300-3400Hz,8KHz抽样

分类2. AMR-WB:AMR WideBand,语音带宽范围: 50-7000Hz 16KHz抽样

AMR-WB采样频率为16kHz,是一种同时被国际标准化组织ITU-T和3GPP采用的宽带语音编码标准,也称为G722.2标准。AMR-WB提供语音带宽范围达到50~7000Hz,用户可主观感受到话音比以前更加自然、舒适和易于分辨。与之作比较,现在GSM用的EFR(Enhenced Full Rate,增强型全速率编码)采样频率为8kHz,语音带宽为200~3400Hz。AMR-WB应用于窄带GSM(全速信道16k,GMSK)的优势在于其可采用从6.6kb/s, 8.85kb/s和12.65kb/s三种编码,当网络繁忙时C/I恶化,编码器可以自动调整编码模式,从而增强QoS。在这种应用中,AMR-WB抗扰度优于AMR-NB。AMR-WB应用于EDGE、3G可充分体现其优势。足够的传输带宽保证AMR-WB可采用从 6.6kb/s到23.85kb/s共九种编码,语音质量超越PSTN固定电话。

以上是关于AMR的介绍,从中我们可以看出AMR是两类的,如果android设置的参数有问题,iOS是转换不了AMR文件的(iOS 4.3以上是不支持AMR的,要转换下格式,博主是用libopencore-amrnb来转换的)

废话不多说,以下为android的语音设置参数:

android语音参数设置

2013-11-06 16:05:24 u011609521 阅读数 1209

 我的地址:http://blog.csdn.net/jinglijun/article/details/9633121   

         最近要开发一个类似微信的demo,需要支持用户语音对话,这个客户端有IOS版本和Android版本,要完成语音通信功能,

          在网上看了下资料,类似这类产品使用的技术 

           talkbox Android版用的是ilbc的第三方编解码库,在iPhone上用的是caf

                      微信   Android版估计是amr估计转码的是交给腾讯强大的服务器了。

                      米聊   Android版和Iphone版用的都是speex

          目前支持的开源第三方库有:libopencore_amr,ilbcspeex

  考虑采用的方案:

      speex需要Androidios都进入转码,工作量太大,不采用。剩下的方案就是在amrilbc上选择了,android支持amr,低版本不支持ilbc, ios高版本(4.3)只支持ilbc,不能支持amr。刚开始的测试方案使用的是android将语音转ilbc,由于我对于android开发不是太熟悉,在同事的帮助下一直没有转换成功,现在想想可能是处理问题,如果能转换成或,这种方案应该是最方便的。

      ios不支持amrandroid原生也不支持aac,而且aac文件比amr大大概10倍,最终由于进度情况,决定通用amr的方案,因为毕竟amr比较小巧。那么ios就要完成录制后wav然后使用libopencore库将其编成amr格式,这时可以发送给android端播放了。

      现在发现一个问题,Android录制的AMR格式音频,在IOS4.3一下可以播放,使用AVAudioPlayer就可以。但是在IOS4.3上却无法播放。AVAudioPlayerplay始终返回NO。所以先将android版本发送过来的amr解码出来播放原始wav即可。

           在网上找到类似的源代码修改了下,比如code4app。oschina都有这样的demo。但是这些demo 有些小问题,我用itouch测试,录音播放没问题,但是用iphone 录音 后播放声音好小啊,听不见,然后着了下原因,设置用Speaker 输出就好了“kAudioSessionOverrideAudioRoute_Speaker”

然后我还添加了类似微信录音时的分贝监测。

[html] view plaincopy
  1. -(bool) LoudSpeaker:(bool)bOpen  
  2. {  
  3.     //return false;  
  4.     UInt32 route;  
  5.     OSStatus error;      
  6.     UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;    // 1  
  7.       
  8.     error = AudioSessionSetProperty (  
  9.                                      kAudioSessionProperty_AudioCategory,                        // 2  
  10.                                      sizeof (sessionCategory),                                   // 3  
  11.                                      &sessionCategory                                            // 4  
  12.                                      );  
  13.       
  14.     route = bOpen?kAudioSessionOverrideAudioRoute_Speaker:kAudioSessionOverrideAudioRoute_None;  
  15.     error = AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(route), &route);  
  16.     return true;  
  17. }  

下面的方法也是设置输出频道

[html] view plaincopy
  1.        // Set AudioSession  
  2. NSError *sessionError = nil;  
  3. [[AVAudioSession sharedInstance] setDelegate:self];  
  4. [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];  
  5.   
  6. /* Pick any one of them */  
  7.     // 1. Overriding the output audio route  
  8. //UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;  
  9. //AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride);  
  10.   
  11. // 2. Changing the default output audio route  
  12. UInt32 doChangeDefaultRoute = 1;  
  13. AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(doChangeDefaultRoute), &doChangeDefaultRoute);  
效果:
2017-12-21 10:48:37 weixin_33887443 阅读数 22

项目在接入融云进行聊天时,android 发送的语音格式为 amr 格式,IOS 发送的格式为 wav 格式。

在进行语音聊天时,android 发送的语音消息,本地播放没有问题。IOS 播放有杂音。

在确定录制的 amr 格式的源文件可以在 IOS 上播放后,大约确定为传输过程中的编码问题。

原因是因为 android 中 MediaRecorder 的编码格式以及输出文件格式设置错误,不是设置的 AMR 格式。 将 MediaRecorder 的音频设置,设置为 AMR 即可

// 设置所录制的声音的采样率。
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
/**设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
/**
  * 设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式
  * ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB)
  */
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
// 文件保存地址及名字
targetFile = new File(targetDir, targetName);
//设置输出文件的路径
mMediaRecorder.setOutputFile(targetFile.getPath());
// 设置录制的音频通道数
mMediaRecorder.setAudioChannels(1);
// 设置所录制的声音的采样率。
mMediaRecorder.setAudioSamplingRate(8000);
// 设置所录制的声音的编码位率。
mMediaRecorder.setAudioEncodingBitRate(64);
复制代码
没有更多推荐了,返回首页