在网页上调试媒体播放错误

François Beaufort
François Beaufort

调试 HTML 媒体元素(如 <video><audio>)可能很困难,因为解码器实现在他们认为的错误方面有所不同(硬件解码器通常最严格),尤其是在播放可能使用特定编解码器的更为隐秘的功能时。幸运的是,我们有各种工具帮忙。

调试媒体播放错误时,我们通常会先检查 HTML 媒体元素中的 MediaError error 属性。此属性可以高度概括地指出导致媒体播放错误的原因。属性 MediaError.code 会返回一个数值,用于表示媒体元素上发生的错误类型。另一个属性 MediaError.message 可能会提供一个字符串,其中包含来自浏览器的一些诊断信息。

const video = document.querySelector('video');
video.addEventListener('error', () => {
  console.log('Error code: ' + video.error.code);
  console.log('Error message: ' + video.error.message);
});

这些属性最适合用于遥测分析,但不一定总能提供足够的信息来调试播放错误。出于隐私保护方面的原因,有时必须省略完整的错误文本。

如需获取完整的错误信息,请使用 Chrome 开发者工具"Media Panel"(媒体面板)查看媒体日志。您会看到大量事件、警告和错误消息等,可向您提供有关媒体播放错误的一些实用提示。

<ph type="x-smartling-placeholder">
</ph> Chrome 开发者工具中媒体面板的屏幕截图
Chrome 开发者工具中的媒体面板。

您还可以通过以下命令使用 FFmpeg 免费应用来检查媒体文件的完整性

ffmpeg -err_detect explode -i <file> -f null -

对于编解码器无效的视频文件,执行以下命令时可能会出现以下错误:

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fc62df05380] Could not find codec parameters for stream 0 (Video: none (zzzz / 0x7A7A7A7A), none(smpte170m/smpte170m/bt709, progressive), 320x240, 4 kb/s): unknown codec
Consider increasing the value for the 'analyzeduration' (0) and 'probesize' (5000000) options
[matroska,webm @ 0x7fd45b705380] Unknown EBML doctype '0000'
[matroska,webm @ 0x7f8d17904d40] Element at 0x8b ending at 0x10400000095 exceeds containing master element ending at 0x9b
Truncating packet of size 9069 to 94

MP4Box.js / ISOBMFF Box Structure Viewer 是调试比特流问题的实用工具。不过,您需要对 MP4 已有了解。

最后,VQAnalyzerElecard StreamEyeCodecian CodecVisa 等一些视频流分析专业工具可能物有所值。