javascript - 将视频编解码器转换为 vp9 到 mp4?

标签 javascript video getusermedia amazon-rekognition web-mediarecorder

我正在使用 js 中的 getUserMedia 函数录制视频,并带有选项

let options = {mimeType: 'video/webm;codecs=vp9'};
// here mediaStreamObj is stream returning from the getUserMedia
let mediaRecorder = new MediaRecorder(mediaStreamObj, options);

我希望编解码器是 h264 我也尝试过 视频/webm;编解码器=h264 在这里,它给出的 mime 类型为 video/x-matroska image

video/mp4;codecs=h264 - 不支持抛出错误

我需要 mimeType 作为 mp4 和编解码器 h264。

因为我正在从事视频分析(亚马逊识别)。我想在 php 中使用 startLabelDetection 来检测视频中的标签,而亚马逊只接受 h264 格式的视频。

https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-rekognition-2016-06-27.html#startlabeldetection

有没有人可以使用js(首选)或php将视频mime类型转换为mp4,以便我可以将其与amazon rekognition一起使用进行视频分析?

预期的 mime 类型:

enter image description here

您可以在此处检查 mime 类型 https://www.metadata2go.com/

最佳答案

tl;dr 您无法从浏览器的 MediaRecorder APIs 获取 MP4 。我相信,您可以使用 Amazon 的 Elastic Transcoder 将 webm 转换为 mp4。如果您还没有这样做,您还应该尝试将 webm/h.264 文件提供给 Rekognition。

正如您所意识到的,您的要求有两个部分:拳击和视频。我们需要一些词汇来详细回答您的问题。

拳击

首先是所谓的“装箱”或容器格式。 webm是基于 Matroska 的格式,依次基于 Extensible Binary Markup Language (EBML)。 EBML 是为 Matroska 开发的。它类似于 XML,但占用的 RAM 和磁盘空间更少,因为它没有那么冗长。 webm本身是一个开放且免版税的媒体文件标准。

另一种拳击格式是 MPEG-4的。它与 Apple 的 mov 电影文件格式几乎相同,称为 mp4 格式。

WebRTC 有自己的装箱方案,适用于数据报(而不是数据流)通信。超出了您的问题范围。

编解码器

那些 webm 或 mp4 盒子里装的是什么?音频和视频数据。 (根据需要,它们还可以包含其他时间同步数据流,例如字幕。)

  • h.264也称为高级视频编码、MPEG-4 第 10 部分或 AVC。
  • vp8 ,由 Google 收购的 On2 开发的开源且无专利的编解码器
  • h.265也称为高效视频编码或 HEVC。
  • vp9 ,Google 开发的最新开源且无专利的编解码器。

后两种较新的编解码器需要更多的计算周期来压缩。而且 h.265 仍然承受着巨大的专利负担。因此浏览器和其他通用软件通常使用前两者,h.265 和 vp8。

浏览器可以处理什么?

Chromium 浏览器(Google Chrome、Edge)和 Firefox 具有 MediaRecorder API 。它们可以生成包含音频和/或视频的 webm-boxed 数据流。它们无法生成 mp4 盒装数据流。

来自这些浏览器的数据流可以(截至 2020 年 10 月)包含 VP8 或 H.264 编码的视频。对于视频数据,available MIME types

  • 视频/webm; codecs="vp8"(对于 vp8)
  • x-matroska/webm; codecs="avc1.42E01E"video/webm; H.264 的 codecs="avc1.42E01E"

正式来说,您应该使用 x-matroska/video 而不是 webm/video 作为使用 H.264 的视频流的 MIME 类型,即使任一 MIME 类型都可以工作在浏览器中。 webm 标准要求其视频编解码器为 vp8 或 vp9,因此 video/webm; codecs="avc1.42E01E",正式来说,不符合该标准。

Javascript 模块

  • npm ebml可以将数据拆箱和装箱到 webm 流中。我已经在大规模生产中使用了它的拆箱功能。它有效。
  • npm mp4-box-encoding可以将数据装箱到 mp4 流中。我没用过这个。

关于javascript - 将视频编解码器转换为 vp9 到 mp4?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64348180/

相关文章:

javascript - angular js - 返回 promise 而不是数据对象

javascript - 如何更改此函数以便可以从父元素调用它?

video - FFmpeg 缩放不是平滑居中(而是锯齿形)

ios - 所有浏览器和平台中的 HTML5 和视频捕获可能性

linux - node-webkit (nw.js) Ubuntu 12.04 LTS SUID 沙箱错误

javascript - 从网络摄像头录制视频流并将 blob 上传到服务器

javascript - 进行 fetch 调用时出错

javascript - Rails `remote: true` 未发出 AJAX 请求

video - 使用 ffmpeg 将平面视频合并为 360 视频

ios - 如何使用 StageWebView 关闭 Air for iOS 中的原生视频播放器