1import audio from '@ohos.multimedia.audio' 2import deviceInfo from '@ohos.deviceInfo' 3import image from '@ohos.multimedia.image' 4import media from '@ohos.multimedia.media' 5import mediaLibrary from '@ohos.multimedia.mediaLibrary' 6import Logger from '../model/Logger' 7import MediaUtils from '../model/MediaUtils' 8// @ts-ignore 9import fs from '@ohos.file.fs' 10import mediaPlay from '../model/mediaPlay' 11 12class AudioCapturer { 13 private tag: string = 'qlw AudioCapture' 14 private static instance: AudioCapturer = new AudioCapturer() 15 private audioCapturer: audio.AudioCapturer = undefined 16 private fd: number = undefined 17 private isRecorder: boolean = false 18 private file: fs.File = undefined 19 20 21 async createAudioCapturer() { 22 let AudioStreamInfo = { 23 samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100, 24 channels: audio.AudioChannel.CHANNEL_2, 25 sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, 26 encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW 27 } 28 let AudioCapturerInfo = { 29 source: audio.SourceType.SOURCE_TYPE_MIC, 30 capturerFlags: 0 31 } 32 let AudioCapturerOptions = { 33 streamInfo: AudioStreamInfo, 34 capturerInfo: AudioCapturerInfo 35 // @ts-ignore 36 } 37 this.audioCapturer = await audio.createAudioCapturer(AudioCapturerOptions) 38 } 39 40 async getFileFd() { 41 let filesDir = globalThis.abilityContext.filesDir 42 let path = filesDir + '/test.wav' 43 Logger.info(this.tag, `getFileFd path : ${path}`) 44 this.file = fs.openSync(path, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE | fs.OpenMode.TRUNC) 45 return this.file.fd 46 } 47 48 async startCapturer() { 49 try { 50 this.fd = await this.getFileFd() 51 Logger.info(this.tag, `fd : ${this.fd}`) 52 53 if (this.fd !== null) { 54 Logger.info(this.tag, `create audio fileAssets success fd : ${this.fd}`) 55 } 56 else { 57 Logger.info(this.tag, `create audio fileAssets error`) 58 } 59 60 let header = mediaPlay.encodeWAV(audio.AudioSamplingRate.SAMPLE_RATE_44100, audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, audio.AudioChannel.CHANNEL_2) 61 Logger.info(this.tag, `wav header length: ${header.buffer.byteLength}`) 62 fs.writeSync(this.fd, header.buffer) 63 64 this.audioCapturer.start(async (err) => { 65 if (err) { 66 Logger.info(this.tag, `Capture start failed`) 67 } else { 68 Logger.info(this.tag, `Capture start success`) 69 let bufferSize = await this.audioCapturer.getBufferSize() 70 Logger.info(this.tag, `audioCapture bufferSize: ${bufferSize}`) 71 this.isRecorder = true 72 while (this.isRecorder) { 73 Logger.info(this.tag, 'audioCapture: ---------READ BUFFER---------') 74 let buffer = await this.audioCapturer.read(bufferSize, true) 75 Logger.info(this.tag, 'audioCapture: ---------WRITE BUFFER---------') 76 fs.writeSync(this.fd, buffer) 77 } 78 } 79 }) 80 } catch (err) { 81 Logger.info(this.tag, `startCapturer fail err: ${err}, message: ${err.message}, code: ${err.code}`) 82 } 83 84 } 85 86 async stopCapturer() { 87 try { 88 await this.audioCapturer.stop() 89 this.isRecorder = false 90 Logger.info(this.tag, `stopCapturer success`) 91 } catch (err) { 92 Logger.info(this.tag, `stopCapturer fail err: ${err}, message: ${err.message}, code: ${err.code}`) 93 } 94 } 95 96 async releaseCapturer() { 97 try { 98 if (this.audioCapturer) { 99 await this.audioCapturer.release() 100 Logger.info(this.tag, `releaseCapturer success`) 101 } 102 if (this.file) { 103 fs.closeSync(this.file); 104 Logger.info(this.tag, `release file success`) 105 } 106 } catch (err) { 107 Logger.info(this.tag, `stopCapturer fail err: ${err}, message: ${err.message}, code: ${err.code}`) 108 } 109 } 110} 111 112export default new AudioCapturer()