useRecording.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. // https://github.com/xiangyuecn/Recorder
  2. import Recorder from "recorder-core";
  3. //需要使用到的音频格式编码引擎
  4. import 'recorder-core/src/engine/mp3'
  5. import 'recorder-core/src/engine/mp3-engine'
  6. //可选的扩展编码引擎
  7. import 'recorder-core/src/extensions/waveview'
  8. /*const videoConfig = {
  9. type: 'mp3',
  10. bitRate: 16,
  11. sampleRate: 16000,
  12. duration: 0,
  13. durationTxt: "0",
  14. powerLevel: 0,
  15. logs: []
  16. }*/
  17. export const useRecording = () => {
  18. let recorderInstance = null;
  19. let inRecording = ref(false)
  20. const openPermission = () => {
  21. return new Promise((resolve, reject) => {
  22. if (recorderInstance && Recorder.IsOpen()) resolve()
  23. if (!recorderInstance) {
  24. recorderInstance = Recorder({
  25. type: 'mp3',
  26. bitRate: 16,
  27. sampleRate: 16000,
  28. duration: 0,
  29. onProcess: function (buffers, powerLevel, duration, sampleRate) {
  30. console.log('录制中~')
  31. inRecording.value = true
  32. }
  33. });
  34. recorderInstance.open(
  35. () => {
  36. resolve()
  37. },
  38. () => {
  39. reject()
  40. }
  41. )
  42. return
  43. }
  44. if (!Recorder.IsOpen()) {
  45. recorderInstance.open(
  46. () => {
  47. resolve()
  48. },
  49. () => {
  50. reject()
  51. }
  52. )
  53. return;
  54. }
  55. })
  56. }
  57. const startRecording = async () => {
  58. try {
  59. await openPermission()
  60. recorderInstance.start()
  61. } catch (e) {
  62. console.error(e, 'startRecording')
  63. }
  64. }
  65. const stopRecording = async () => {
  66. return new Promise((resolve, reject) => {
  67. if (!recorderInstance || !Recorder.IsOpen()) {
  68. console.log('未开启录音!')
  69. resolve({
  70. success: false,
  71. errorMessage: '未开启录音'
  72. })
  73. }
  74. recorderInstance.stop(
  75. (blob, duration) => {
  76. inRecording.value = false
  77. console.log('----录制完成-----', blob, duration)
  78. if ((duration / 1000) < 1) {
  79. console.log(duration, '录音小于一秒')
  80. resolve({
  81. success: false,
  82. errorMessage: '说话时间太短'
  83. })
  84. } else {
  85. console.log(duration, '录音合格')
  86. resolve({
  87. success: true,
  88. audio: {
  89. blob: blob,
  90. duration: duration,
  91. durationTxt: formatMs(duration),
  92. href: (window.URL || webkitURL).createObjectURL(blob)
  93. },
  94. errorMessage: ''
  95. })
  96. /*const o = {
  97. blob: blob,
  98. duration: duration,
  99. durationTxt: formatMs(duration),
  100. rec: recorderInstance
  101. }
  102. 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");
  103. let downA = document.createElement("A");
  104. downA.href = (window.URL || webkitURL).createObjectURL(o.blob);
  105. downA.download = name;
  106. downA.click();
  107. alert('下载成功')*/
  108. }
  109. },
  110. (e) => {
  111. inRecording.value = false
  112. resolve({
  113. success: false,
  114. errorMessage: e
  115. })
  116. }
  117. )
  118. })
  119. }
  120. const cancelRecording = async () => {
  121. return new Promise((resolve) => {
  122. if (!recorderInstance || !Recorder.IsOpen()) {
  123. console.log('未开启录音!')
  124. resolve({
  125. success: true,
  126. errorMessage: ''
  127. })
  128. }
  129. recorderInstance.stop(
  130. (blob, duration) => {
  131. inRecording.value = false
  132. resolve({
  133. success: true,
  134. errorMessage: ''
  135. })
  136. },
  137. (e) => {
  138. inRecording.value = false
  139. resolve({
  140. success: false,
  141. errorMessage: e
  142. })
  143. }
  144. )
  145. })
  146. }
  147. const formatMs = (ms, all) => {
  148. let ss = ms % 1000;
  149. ms = (ms - ss) / 1000;
  150. let s = ms % 60;
  151. ms = (ms - s) / 60;
  152. let m = ms % 60;
  153. ms = (ms - m) / 60;
  154. let h = ms;
  155. let t = (h ? h + ":" : "")
  156. + (all || h + m ? ("0" + m).substr(-2) + ":" : "")
  157. + (all || h + m + s ? ("0" + s).substr(-2) + "″" : "")
  158. + ("00" + ss).substr(-3);
  159. return t;
  160. }
  161. const closeRecording = () => {
  162. recorderInstance.close()
  163. }
  164. onUnmounted(() => {
  165. closeRecording()
  166. })
  167. return {
  168. inRecording, // 是否在录音中
  169. openPermission,// 开启录音系统权限
  170. startRecording,// 开始录音
  171. stopRecording,// 停止录音
  172. cancelRecording,// 取消录音
  173. closeRecording,// 关闭录音权限
  174. }
  175. }