实现base64格式的amr音频文件在IOS、android微信内置浏览器的播放

参考文档:

1.https://github.com/yxl/opencore-amr-js   (将amr文件转为wav格式的编解码项目)

因为项目需要,要将amr的base46格式的音频文件在IOS,android微信内置浏览器播放。项目中使用的第三方IM为融云,经过调研发现,使用融云js播放语音的方式,可以在IOS上播放,但是在Android上无法播放,而且h5的audio组件,不支持amr格式的音频文件。

最后得出的结论,IOS上的audio支持amr格式播放,android上audio组件不支持amr格式播放,包括使用融云js播放语音的方式,使用的也是audio组件。

想到的方案是,将amr的base64文件进行格式转换,转换为mp3,wav等audio支持的格式,然后进行播放,没有找到很好的资源。

经过领导的一句话,尝试性的找融云客服咨询了一下,看看有没有相关的项目,客服给了opencore-amr-js项目,是将amr格式的文件转换为wav格式的音频文件,进行播放。

将项目发布到测试环境,在微信内置浏览器跑了一下,得到的答案是,android可以正常播放,但是IOS无法播放;其中有一个对象,在IOS环境中,好像是找不到,运行就报错。

于是,综合了一下,得到了最终的解决方案,

IOS使用融云js进行语音播放,Android使用opencore-amr-js进行语音播放;播放语音时,判断机器为Android还是IOS,来选择播放方式。

在将opencore-amr-js项目往自己项目迁移的过程中,发现,融云js中使用的Libamr-2.2.5.min.js 文件,就是opencore-amr-js项目中的amrnb.js文件,也就是说,融云js也是在  opencore-amr-js项目的基础上开发的,而且改动也非常小,Android中需要使用的方法,都没有发生变动,感觉还是挺开心的,因为amrnb.js文件有474kb,太大了,如果在加上融云js的Libamr-2.2.5.min.js 文件,整个聊天室,得有1兆多了,加载时间太长了。

下面,将Android播放语音的代码放在下面:

demo下载地址,demo在项目的js目录下面。

 
  1. <!DOCTYPE html>

  2.  
  3. <html>

  4. <head>

  5. <title>AMR decode/encode tests</title>

  6. <script src="amrnb.js" defer></script>

  7. </head>

  8.  
  9. <body>

  10. <h2>Test decoder</h2>

  11. <p id="test">

  12. Convert <a href="yuan.amr">yuan.amr</a> to wav file and compare with <a href="yuan.wav">yuan.wav</a>:

  13. <button>Test</button>

  14. </p>

  15. <h2>Decode amr file and play</h2>

  16. <p id="sample-amr">

  17. <button>Play</button>

  18. <a href="yuan.amr">yuan.amr</a>

  19. </p>

  20. <p>

  21. Select a local file and play: <input type="file" id="amr-file" accept=".amr">

  22. </p>

  23. <h2>Encode audio to amr file and play</h2>

  24. <p id="sample-audio">

  25. <button>Encode & Play</button>

  26. <a href="hello.ogg">hello.ogg</a>

  27. </p>

  28. <p>

  29. Select a local file to encode and play: <input type="file" id="audio-file" accept="audio/*">

  30. </p>

  31. <h2>base64测试</h2>

  32. <input id="base64-input" type="text" style="width:800px;height: 200px;">

  33. <p id="base64-audio">

  34. <button>base64 & Play</button>

  35. </p>

  36. <p id="base64-audio2">

  37. <button>base64 & Play</button>

  38. </p>

  39. <p id="base64-audio3">

  40. <button>base64 & Play</button>

  41. </p>

  42. <p id="base64-audio4">

  43. <button>base64 & Play</button>

  44. </p>

  45. <p id="base64-audio5">

  46. <button>base64 & Play</button>

  47. </p>

  48.  
  49.  
  50. <h2>Amr to wav</h2>

  51. <p id="amr-to-wav">

  52. <button>Convert to wav and play</button>

  53. <a href="yuan.amr">yuan.amr</a>

  54. </p>

  55. <p>

  56. Select a local file, convert and play: <input type="file" id="amr-to-wav-file" accept=".amr">

  57. </p>

  58. <p>wav file content:</p>

  59. <pre></pre>

  60. <script>

  61.  
  62. // var u = navigator.userAgent;

  63. // var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android终端

  64. // var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端

  65. // alert('是否是Android:'+isAndroid);

  66. // alert('是否是iOS:'+isiOS);

  67.  
  68. function E(selector) {

  69. return document.querySelector(selector);

  70. }

  71.  
  72. E('#test > button').onclick = function () {

  73. fetchAndReadBlob('yuan.amr', function (amr) {

  74. fetchAndReadBlob('yuan.wav', function (expected) {

  75. var actual = AMR.toWAV(amr);

  76. if (actual == null) {

  77. alert('Failed to decode amr file.');

  78. return;

  79. }

  80. if (actual.length != expected.length) {

  81. alert('The converted wav file has different size.');

  82. return;

  83. }

  84. for (var i = 0; i < actual.length; i++) {

  85. if (actual[i] != expected[i]) {

  86. alert('The converted wav file has different content.');

  87. return;

  88. }

  89. }

  90. alert('Succeeded!');

  91. });

  92. });

  93. };

  94.  
  95. E('#sample-amr > button').onclick = function () {

  96. fetchBlob(E('#sample-amr > a').href, function (blob) {

  97. playAmrBlob(blob);

  98. });

  99. };

  100.  
  101. E('#amr-file').onchange = function () {

  102. playAmrBlob(this.files[0]);

  103. };

  104.  
  105. E('#amr-to-wav > button').onclick = function () {

  106. fetchBlob(E('#amr-to-wav > a').href, function (blob) {

  107. convertAmrBlobToWav(blob);

  108. });

  109. };

  110.  
  111. E('#amr-to-wav-file').onchange = function () {

  112. convertAmrBlobToWav(this.files[0]);

  113. };

  114.  
  115. E('#sample-audio > button').onclick = function () {

  116. fetchBlob(E('#sample-audio > a').href, function (blob) {

  117. convertAudioBlobToAmr(blob);

  118. });

  119. };

  120.  
  121. E('#base64-audio > button').onclick = function () {

  122. playAmrToWav('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');

  123. // var buffer = AMR.toWAV(result);

  124. //// E('pre').textContent = toHex(buffer);

  125. // var url = URL.createObjectURL(new Blob([buffer], {type: 'audio/wav'}));

  126. // // Play wav buffer

  127. // var audio = new Audio(url);

  128. // audio.onloadedmetadata = audio.onerror = function () {

  129. // URL.revokeObjectURL(url);

  130. // };

  131. // audio.play();

  132.  
  133. // playAmrBlob(E('#base64-input').value);

  134. };

  135.  
  136. E('#base64-audio2 > button').onclick = function () {

  137. playAmrToWav('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');

  138. };

  139. E('#base64-audio3 > button').onclick = function () {

  140. playAmrToWav('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');

  141. };

  142. E('#base64-audio4 > button').onclick = function () {

  143. playAmrToWav('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');

  144. };

  145.  
  146. E('#base64-audio5 > button').onclick = function () {

  147. playAmrToWav('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');

  148. };

  149.  
  150. function playAmrToWav(amrStr) {

  151. if (null != src) {

  152. src.stop();

  153. src = null;

  154. }

  155. var amrStr = window.atob(amrStr),

  156. result = new Uint8Array(amrStr.length);

  157. for (var i = 0, l = amrStr.length; i < l; i++) {

  158. result[i] = amrStr.charCodeAt(i)

  159. }

  160. playAmrArray(result);

  161. }

  162.  
  163.  
  164. E('#audio-file').onchange = function () {

  165. convertAudioBlobToAmr(this.files[0]);

  166. };

  167.  
  168. var gAudioContext = new AudioContext();

  169.  
  170. function getAudioContext() {

  171. if (!gAudioContext) {

  172. gAudioContext = new AudioContext();

  173. }

  174. return gAudioContext;

  175. }

  176.  
  177. function fetchBlob(url, callback) {

  178. var xhr = new XMLHttpRequest();

  179. xhr.open('GET', url);

  180. xhr.responseType = 'blob';

  181. xhr.onload = function () {

  182. callback(this.response);

  183. };

  184. xhr.onerror = function () {

  185. alert('Failed to fetch ' + url);

  186. };

  187. xhr.send();

  188. }

  189.  
  190. function readBlob(blob, callback) {

  191. var reader = new FileReader();

  192. reader.onload = function (e) {

  193. var data = new Uint8Array(e.target.result);

  194. callback(data);

  195. };

  196. reader.readAsArrayBuffer(blob);

  197. }

  198.  
  199. function fetchAndReadBlob(url, callback) {

  200. fetchBlob(url, function (blob) {

  201. readBlob(blob, callback);

  202. });

  203. }

  204.  
  205. function playAmrBlob(blob, callback) {

  206. readBlob(blob, function (data) {

  207. playAmrArray(data);

  208. });

  209. }

  210.  
  211. function convertAudioBlobToAmr(blob) {

  212. readBlob(blob, function (data) {

  213. var ctx = getAudioContext();

  214. ctx.decodeAudioData(data.buffer, function (audioBuffer) {

  215. var pcm;

  216. if (audioBuffer.copyFromChannel) {

  217. pcm = new Float32Array(audioBuffer.length);

  218. audioBuffer.copyFromChannel(pcm, 0, 0);

  219. } else {

  220. pcm = audioBuffer.getChannelData(0);

  221. }

  222. var amr = AMR.encode(pcm, audioBuffer.sampleRate, 7);

  223. playAmrArray(amr);

  224. });

  225. });

  226. }

  227.  
  228. function playAmrArray(array) {

  229. var samples = AMR.decode(array);

  230. if (!samples) {

  231. alert('Failed to decode!');

  232. return;

  233. }

  234. playPcm(samples);

  235. }

  236. var src = null;

  237. function playPcm(samples) {

  238. var ctx = getAudioContext();

  239. src = ctx.createBufferSource();

  240. var buffer = ctx.createBuffer(1, samples.length, 8000);

  241. if (buffer.copyToChannel) {

  242. buffer.copyToChannel(samples, 0, 0)

  243. } else {

  244. var channelBuffer = buffer.getChannelData(0);

  245. channelBuffer.set(samples);

  246. }

  247.  
  248. src.buffer = buffer;

  249. src.connect(ctx.destination);

  250. src.start();

  251. }

  252.  
  253. function convertAmrBlobToWav(blob) {

  254. readBlob(blob, function (data) {

  255. var buffer = AMR.toWAV(data);

  256. E('pre').textContent = toHex(buffer);

  257. var url = URL.createObjectURL(new Blob([buffer], {type: 'audio/x-wav'}));

  258. // Play wav buffer

  259. var audio = new Audio(url);

  260. audio.onloadedmetadata = audio.onerror = function () {

  261. URL.revokeObjectURL(url);

  262. };

  263. audio.play();

  264. });

  265. }

  266.  
  267. function toHex(buffer) {

  268. var str = '';

  269. for (var i = 0; i < buffer.length; i++) {

  270. var s = buffer[i].toString(16);

  271. if (s.length == 1) {

  272. s = '0' + s;

  273. }

  274. str += s;

  275. if (i % 16 == 15) { // print 16 bytes per line

  276. str += '\n'

  277. } else if (i % 2 == 1) { // add a space seperator every two bytes.

  278. str += ' ';

  279. }

  280. }

  281. return str;

  282. }

  283. </script>

  284. </body>

  285.  

猜你喜欢

转载自blog.csdn.net/yelin042/article/details/81081802