【问题标题】:Audio playback halts/stops on Chrome 64Chrome 64 上的音频播放暂停/停止
【发布时间】:2018-07-13 00:53:10
【问题描述】:

Google 刚刚更改了 Chrome 预加载 audiovideo 的方式;见:https://googlechrome.github.io/samples/media/preload-metadata

据我了解,只需将 preload 属性设置为 auto 即可解决问题,但是,我无法这样做:

let mp3 = 'https://s3-staging.read2me.online/audio/5a745d88483d86.76121223.mp3';
let audio = new Audio(mp3);
audio.preload = 'auto';

audio.play();

<audio src="https://s3-staging.read2me.online/audio/5a745d88483d86.76121223.mp3" preload="auto" autoplay></audio>

这两者都将在一分钟内停止在 Chrome 64 和 Chrome 65-dev 上播放(其他浏览器和旧版 Chrome 不受影响)。我已经在 Mac、Windows 和 Android 上复制了这个问题。

在调试过程中,我已将所有 possible media events 附加到 JS 对象(即 audio.addEventListener('timeupdate', () => { console.log('timeupdate') })),起初事件是这样触发的:

progress timeupdate progress timeupdate [...]

以后是这样的: timeupdate timeupdate timeupdate [...]

当音频播放停止时,我收到了一些error 事件,转储audio.error 返回:PIPELINE_ERROR_DECODE: Failed to send audio packet for decoding: timestamp=81763265 duration=26122 size=201 side_data_size=0 is_key_frame=1 encrypted=0 discard_padding (ms)=(0, 0)

我该如何解决这个问题?这是 Chrome 的错误吗?

更新:

更新 2:

chrome://media-internals/ 揭示了这一点:

更新 3:

此问题已在 Chrome 65 中得到修复。

【问题讨论】:

    标签: javascript google-chrome audio


    【解决方案1】:

    经过几天的反复试验和研究,我已经确认了哪些无效和有效。

    不起作用

    mp3wrap

    mp3wrap output.mp3 *.mp3 输出文件仍然损坏并停止

    ffmpeg

    ffmpeg -i "concat:0.mp3|1.mp3" -acodec copy output.mp3 输出文件仍然损坏并停止

    有效

    带有-f参数的mp3val

    只需连接/内爆您的音频二进制文件(在 PHP 中,我执行 implode('', $audioBinaries) 然后运行 ​​mp3val -f concatenated-audio-file.mp3-f 参数是必不可少的,它的意思是“尝试修复错误”。

    如何安装 mp3val?

    在 MacOS 上:brew install mp3val 在 Deb/Ubu 上:apt-get install mp3val

    【讨论】:

    • 当您说“连接”您的音频文件时,您的意思是 mp3 文件必须合并到一个 mp3 中?还是对每个 mp3 文件都这样做?这样做的目的是什么?
    • @Cruclax 不,它们不必合并,但我的问题发生了,因为我在不考虑标题的情况下手动连接/合并多个 mp3 文件,这就是为什么 Chrome 64 不能不要玩它们。
    • mp3val -f 没有发现/修复我的文件中的任何错误,但使用 lame 重新编码确实解决了问题。
    • @Cruclax 是的,我想它会,但 mp3val 的美妙之处在于它不会重新编码文件,因此没有质量损失。奇怪的是它没有
    【解决方案2】:

    我在连接技术方面面临同样的问题。使用 ffmpeg,它工作正常。用这个命令试试 ffmpeg。

    ffmpeg -f concat -i "{textfile}" -c:v copy -ab 48k -y "{output}"
    

    textfile 将有一个每行写入的文件列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      • 1970-01-01
      • 1970-01-01
      • 2016-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多