• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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()