我正在使用 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
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 类型:
您可以在此处检查 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/