123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- // https://github.com/xiangyuecn/Recorder
- import Recorder from "recorder-core";
- //需要使用到的音频格式编码引擎
- import 'recorder-core/src/engine/mp3'
- import 'recorder-core/src/engine/mp3-engine'
- //可选的扩展编码引擎
- import 'recorder-core/src/extensions/waveview'
- /*const videoConfig = {
- type: 'mp3',
- bitRate: 16,
- sampleRate: 16000,
- duration: 0,
- durationTxt: "0",
- powerLevel: 0,
- logs: []
- }*/
- export const useRecording = () => {
- let recorderInstance = null;
- let inRecording = ref(false)
- const openPermission = () => {
- return new Promise((resolve, reject) => {
- if (recorderInstance && Recorder.IsOpen()) resolve()
- if (!recorderInstance) {
- recorderInstance = Recorder({
- type: 'mp3',
- bitRate: 16,
- sampleRate: 16000,
- duration: 0,
- onProcess: function (buffers, powerLevel, duration, sampleRate) {
- console.log('录制中~')
- inRecording.value = true
- }
- });
- recorderInstance.open(
- () => {
- resolve()
- },
- () => {
- reject()
- }
- )
- return
- }
- if (!Recorder.IsOpen()) {
- recorderInstance.open(
- () => {
- resolve()
- },
- () => {
- reject()
- }
- )
- return;
- }
- })
- }
- const startRecording = async () => {
- try {
- await openPermission()
- recorderInstance.start()
- } catch (e) {
- console.error(e, 'startRecording')
- }
- }
- const stopRecording = async () => {
- return new Promise((resolve, reject) => {
- if (!recorderInstance || !Recorder.IsOpen()) {
- console.log('未开启录音!')
- resolve({
- success: false,
- errorMessage: '未开启录音'
- })
- }
- recorderInstance.stop(
- (blob, duration) => {
- inRecording.value = false
- console.log('----录制完成-----', blob, duration)
- if ((duration / 1000) < 1) {
- console.log(duration, '录音小于一秒')
- resolve({
- success: false,
- errorMessage: '说话时间太短'
- })
- } else {
- console.log(duration, '录音合格')
- resolve({
- success: true,
- audio: {
- blob: blob,
- duration: duration,
- durationTxt: formatMs(duration),
- href: (window.URL || webkitURL).createObjectURL(blob)
- },
- errorMessage: ''
- })
- /*const o = {
- blob: blob,
- duration: duration,
- durationTxt: formatMs(duration),
- rec: recorderInstance
- }
- let name = "rec-" + o.duration + "ms-" + (o.rec.set.bitRate || "-") + "kbps-" + (o.rec.set.sampleRate || "-") + "hz." + (o.rec.set.type || (/\w+$/.exec(o.blob.type) || [])[0] || "unknown");
- let downA = document.createElement("A");
- downA.href = (window.URL || webkitURL).createObjectURL(o.blob);
- downA.download = name;
- downA.click();
- alert('下载成功')*/
- }
- },
- (e) => {
- inRecording.value = false
- resolve({
- success: false,
- errorMessage: e
- })
- }
- )
- })
- }
- const cancelRecording = async () => {
- return new Promise((resolve) => {
- if (!recorderInstance || !Recorder.IsOpen()) {
- console.log('未开启录音!')
- resolve({
- success: true,
- errorMessage: ''
- })
- }
- recorderInstance.stop(
- (blob, duration) => {
- inRecording.value = false
- resolve({
- success: true,
- errorMessage: ''
- })
- },
- (e) => {
- inRecording.value = false
- resolve({
- success: false,
- errorMessage: e
- })
- }
- )
- })
- }
- const formatMs = (ms, all) => {
- let ss = ms % 1000;
- ms = (ms - ss) / 1000;
- let s = ms % 60;
- ms = (ms - s) / 60;
- let m = ms % 60;
- ms = (ms - m) / 60;
- let h = ms;
- let t = (h ? h + ":" : "")
- + (all || h + m ? ("0" + m).substr(-2) + ":" : "")
- + (all || h + m + s ? ("0" + s).substr(-2) + "″" : "")
- + ("00" + ss).substr(-3);
- return t;
- }
- const closeRecording = () => {
- recorderInstance.close()
- }
- onUnmounted(() => {
- closeRecording()
- })
- return {
- inRecording, // 是否在录音中
- openPermission,// 开启录音系统权限
- startRecording,// 开始录音
- stopRecording,// 停止录音
- cancelRecording,// 取消录音
- closeRecording,// 关闭录音权限
- }
- }
|