当前位置: 首页 > 科技观察

HarmonyOS录音和音频播放

时间:2023-03-13 12:24:11 科技观察

更多内容请访问:Harmonyos技术社区https://harmonyos.51cto.comHarmonyOS中的播放功能。功能介绍1.录音1.1使用录音前,您需要先申请录音权限。在config.json文件中添加权限声明"reqPermissions":[{"name":"ohos.permission.MICROPHONE","re??ason":"theappneedmicrophone","usedScene":{"ability":["com.iflytek.demo.MainAbility"],"when":"always"}}]然后在MainAbility中动态申请麦克风权限privatevoidrequestPermission(){if(verifySelfPermission("ohos.permission.MICROPHONE")!=IBundleManager.PERMISSION_GRANTED){//Theapplicationhasnotbeengrantedpermissionif(canRequestPermission("ohos.permission.MICROPHONE")){//是否可以申请弹窗授权(第一次申请或者用户没有选择禁止不再提示)requestPermissionsFromUser(newString[]{"ohos.permission.MICROPHONE"},REQUEST_MICROPHONE);}else{//显示应用需要权限的原因,提示用户进入设置授权}}else{//权限已被granted}}/***权限回调*/@OverridepublicvoidonRequestPermissionsFromUserResult(intrequestCode,String[]permissions,int[]grantResults){switch(requestCode){caseREQUEST_MICROPHONE:{//requestCodeif(grantResults.length>0&&grantResult匹配requestPermissionsts[0]==IBundleManager.PERMISSION_GRANTED){//权限被授予//注意:由于时差原因,接口权限检查时没有权限,所以针对抛出的接口捕获并处理异常无权限异常AppLog.e("MainAbility","录音权限已获取");}else{//权限被拒绝AppLog.e("MainAbility","录音权限被拒绝");}}}}1.2录音功能使用AudioCapturer类,主要接口如下:初始化AudioCapturer,首先通过AudioStreamInfo设置录音的基本音频参数,然后通过AudioCapturerInfo设置录音源等信息/***创建默认录音对象*/publicvoidinitConfig(){if(audioCapturer!=null&&audioCapturer.getState()!=AudioCapturer.State.STATE_STOPPED){audioCapturer.release();}audioCapturer=null;AudioStreamInfoaudioStreamInfo=newAudioStreamInfo.Builder()//音频采样率16000.sampleRate(AUDIO_SAMPLE_RATE)//录音数据格式16-bitPCM.encodingFormat(AudioStreamInfo.EncodingFormat.ENCODING_PCM_16BIT)//通道设置mono.channelMask(AudioStreamInfo.ChannelMask.CHANNEL_IN_MONO).build();AudioCapturerInfoaudioCapturerInfo=newAudioCapturerInfo.Builder().audioStreamInfo(audioStreamInfo)//录音源.audioInputSource(AudioCapturerInfo.AudioInputSource.AUDIO_INPUT_SOURCE_MIC).build();audioCapturer=newAudioCapturer(audioCapturerInfo);bufferSizeInBytes=AudioCapturer.getMinBufferSize(AUDIO_SAMPLE_RATE,1,2);}开始录音,通过audioCapturer.read()获取音频。/***开始录音**@paramlistener音频流监听回调*/publicvoidstartRecord(finalRecordListenerlistener){if(audioCapturer.getState()==AudioCapturer.State.STATE_UNINITIALIZED){thrownewIllegalStateException("AudioCapturerneedinitfirst");}if(isRecording()){thrownewIllegalStateException("AudioCapturerisinrecordingnow");}//开始录音audioCapturer.start();finalbyte[]audioData=newbyte[bufferSizeInBytes];while(isRecording()){intsize=audioCapturer.read(audioData,0,bufferSizeInBytes);if(size>0&&listener!=null){if(size==bufferSizeInBytes){//通过回调返回录音数据listener.onRead(audioData);}else{//通过回调返回录音数据finalbyte[]copy=newbyte[size];System.arraycopy(audioData,0,copy,0,size);listener.onRead(copy);}}}if(finishCallBack!=null){finishCallBack.onFinish();}}停止录音/***停止录音*/publicsynchronizedvoidstopRecord(){if(isRecording()){audioCapturer.stop();}}/***释放资源*/publicsynchronizedvoidrelease(){if(audioCapturer!=null){audioCapturer.release();audioCapturer=null;}}2.音频播放哈蒙在yOS中,音频播放分为三种:AudioRenderer、Player、SoundPlayer。AudioRenderer用于播放pcm音频流。播放器主要用于播放mp3、m4a等格式的音频。SoundPlayer用于播放短音频。2.1AudioRenderer播放pcm音频/***pcm**@paramfilepcm文件*/privatevoidplayPcm(Filefile){if(file==null||!file.exists()){showToast("文件不存在");return;}AudioStreamInfostreamInfo=newAudioStreamInfo.Builder()//16kHz.sampleRate(16000)//混音.audioStreamFlag(AudioStreamInfo.AudioStreamFlag.AUDIO_STREAM_FLAG_MAY_DUCK)//16-bitPCM.encodingFormat(AudioStreamInfo.EncodingFormat.ENCODING_出声PCM_16.channelMask(AudioStreamInfo.ChannelMask.CHANNEL_OUT_MONO)//媒体类音频.streamUsage(AudioStreamInfo.StreamUsage.STREAM_USAGE_MEDIA).build();AudioRendererInfoaudioRendererInfo=newAudioRendererInfo.Builder().audioStreamInfo(streamInfo.StreamUsage)AudioRendererInfo.AudioStreamOutputFlag.AUDIO_STREAM_OUTPUT_FLAG_DIRECT_PCM).bufferSizeInBytes(1280)//false表示buffer分段播放,true表示整个音频流一次性传到HAL层播放.isOffload(false).build();AudioRendererrrenderer=newAudioRenderer(audioRendererInfo,AudioRenderer.PlayMode.MODE_STREAM);renderer.start();try{FileInputStreaminputStream=newFileInputStream(file);byte[]temp=newbyte[1280];while(inputStream.available()>temp.length){intread=inputStream.read(temp);//将pcm写入播放器renderer.write(temp,0,read);}}catch(Exceptione){e.printStackTrace();}}2.2播放器播放mp3/***Playaudio**@paramfilesourcefilelocation*/privatevoidplayMp3(Filefile){try{player=newPlayer(getContext());FileInputStreamin=newFileInputStream(file);//从输入流中获取FD对象FileDescriptorfd=in.getFD();player.setSource(newSource(fd));player.prepare();player.play();}catch(Exceptione){e.printStackTrace();}}更多信息请访问:和华为官方Harmonyos技术社区共建https://harmonyos.51cto.com