在 JavaScript 中检测视频的编解码器

Posted

技术标签:

【中文标题】在 JavaScript 中检测视频的编解码器【英文标题】:Detecting a video's codec in JavaScript 【发布时间】:2016-09-24 11:18:26 【问题描述】:

我正在开发基于 Electron 的桌面应用程序(即 Node.js 和 Chrome 浏览器外壳),其中一项功能包括从本地文件系统加载任意视频文件。

我面临的一个挑战是我不知道任意视频文件使用的编解码器。我可以按文件扩展名进行过滤(即.mp4.webm 等)...但是 MP4 文件可以使用许多编解码器,这从文件扩展名中并不明显。在 html5 视频播放器出现空白之前,我真的不知道视频文件不受支持(而且我什至不确定如何以编程方式检测 THIS 何时发生) .

我已经在使用loadedmetadata 事件处理程序来检测视频的尺寸,但它似乎没有公开有关底层编解码器的信息。

有没有办法解决这个问题?我正在寻找可以识别本机“主”进程中的编解码器的 Node.js 包,而不是让 Chrome“渲染器”进程尝试在浏览器级别检测它。但是,我看到的所有 Node.js 视频包都依赖于 ffmpeg 可执行文件,我无法轻松地将其与我的 Electron 应用程序捆绑在一起。

有一百万个代码样本用于检测您的浏览器支持哪些编解码器。但这是假设您正在处理已知的视频文件和未知的浏览器。反过来呢……当您有一个保证已知的浏览器,但一个未知的视频文件?

【问题讨论】:

".. 我不能轻易地与我的 Electron 应用程序捆绑在一起" — 你可以使用 npmjs.com/package/ffbinaries 它将下载与用户平台匹配的二进制文件。所以你不必捆绑任何东西。 【参考方案1】:

您可以使用mux.js 来检查文件中的 MP4 原子。您需要将文件加载到 UInt8Array,然后调用 muxjs.mp4.tools.inspect(bytes) 以获取已解析原子的列表。

【讨论】:

【参考方案2】:

最简单的方法是使用 mux.js,如下muxjs.mp4.probe.tracks(e)。这会返回一个轨道数组。

示例输出:

[
  
    "id": 1,
    "type": "video",
    "codec": "avc1.64101e",
    "timescale": 12288
  ,
  
    "id": 2,
    "type": "audio",
    "codec": "mp4a.40.2",
    "timescale": 44100
  
]

【讨论】:

以上是关于在 JavaScript 中检测视频的编解码器的主要内容,如果未能解决你的问题,请参考以下文章

YouTube“书呆子统计”如何运作。或者如何从 JavaScript 获取正在播放的视频的编解码器信息

视频的编解码-编码篇

如何在 Xcode 中使用 OpenCV 3.4.14 识别 .mp4 视频文件的编解码器?

如何通过 pi 上的边缘检测保存视频录制

寻找一个知道检测对特定音频视频格式文件支持的库

聊聊视频中的编解码器,你所不知道的h264h265vp8vp9和av1编解码库