【问题标题】:Playing audio from data:url google chrome mobile从数据播放音频:url google chrome mobile
【发布时间】:2013-06-16 06:07:55
【问题描述】:

我使用此代码从 byte 生成音频元素,它创建一个简单的 wav 声音,我可以在 google chrome 或 DESKTOP 的 firefox 中播放它,但是当我想在 Google Chrome Mobile 中播放它时,它会播放没什么,问题出在哪里,我可以轻松播放 wav 文件,但我无法在 google chrome mobile 中播放二进制数据中的音乐:

<!DOCTYPE html>
<html>
    <head>
        <title>Explosion Generator</title>
        <script type = "text/javascript" src="../../js/jquery-1.8.3.js" ></script>
        <script>

            function encodeAudio16bit(data, sampleRate) {
                var n = data.length;
                var integer = 0, i;

                // 16-bit mono WAVE header template
                var header = "RIFF<##>WAVEfmt \x10\x00\x00\x00\x01\x00\x01\x00<##><##>\x02\x00\x10\x00data<##>";

                // Helper to insert a 32-bit little endian int.
                function insertLong(value) {
                    var bytes = "";
                    for (i = 0; i < 4; ++i) {
                        bytes += String.fromCharCode(value % 256);
                        value = Math.floor(value / 256);
                    }
                    header = header.replace('<##>', bytes);
                }

                // ChunkSize
                insertLong(36 + n * 2);

                // SampleRate
                insertLong(sampleRate);

                // ByteRate
                insertLong(sampleRate * 2);

                // Subchunk2Size
                insertLong(n * 2);

                // Output sound data
                for (var i = 0; i < n; ++i) {
                    var sample = Math.round(Math.min(1, Math.max(-1, data[i])) * 32767);
                    if (sample < 0) {
                        sample += 65536; // 2's complement signed
                    }
                    header += String.fromCharCode(sample % 256);
                    header += String.fromCharCode(Math.floor(sample / 256));
                }

                return 'data:audio/wav;base64,' + btoa(header);
            }


            function generateTone(freq, sampleRate, duration){
                var tone = []
                for(var i = 0; i < duration * sampleRate; ++i){
                    tone.push(Math.sin(2 * Math.PI * i / (sampleRate/freq)));
                }
                return tone;
            }

            $(document).ready(function(){
                $("#body").html("Sounds...");

                var sampleRate = 44100; // hz
                var freq = 400;   // hz
                var duration = 2; // seconds
                var tone = generateTone(freq, sampleRate, duration);
                var base64EnodedTone = encodeAudio16bit(tone, sampleRate);
                var audioPlayer = $('<audio>').attr({ src: base64EnodedTone,
                    controls:true
                });
                $("#body").append(audioPlayer);

                $("#body").append("<p>done<p>");
            });    
        </script>
    </head>

    <body>
        <div id="body" ></div>
    </body>
</html>

【问题讨论】:

标签: javascript android html google-chrome


【解决方案1】:

这肯定是一个错误。任何时候,如果你让它在桌面上运行,但它无法在 Android 版 Chrome 上运行,那么它有 99.5% 的可能性是一个错误。

我在这里提出了错误:https://code.google.com/p/chromium/issues/detail?id=253466,并在此处演示了错误:http://jsbin.com/ajocid/latest

桌面上还有另一种解决方案,可以将音频编码为 Blob 并播放,不幸的是,这在 Android 版 Chrome 上也不起作用,需要修复。

在修复这两个错误之前,您目前所能期望的最好的方法是将其上传到服务器并从那里播放。

【讨论】:

  • 是的,这似乎真的是一个错误,我在上一个 android 版本上有 testet,但仍然无法正常工作......
  • 如果您在此答案中启动错误,您将看到工程团队对其进行的更改。
  • 您无能为力,编码成 blob 的其他解决方案在 Android 版 Chrome 上也不起作用。
  • 你认为 Google 团队会很快解决这个问题吗?
  • 如果他们今天修复了它,仍然需要大约 12 周的时间才能覆盖所有用户。我不能给出任何其他时间框架。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多