【问题标题】:How to use MediaStream Recording如何使用媒体流录制
【发布时间】:2013-07-20 23:00:07
【问题描述】:

好的,我会尽量让我的问题尽可能清楚,但我很困惑,所以如果我没有传达信息,请告诉我。

我正在尝试使用 getUserMedia 来使用网络摄像头,然后使用这个

http://www.w3.org/TR/mediastream-recording/

录制简短的捕获视频。问题是,当我尝试定义新的 MediaRecorder(stream) 时,我被告知它是未定义的。我以前没有使用过这个api,所以我真的不知道我错过了什么。以下是相关代码:

function onVideoFail(e) {
console.log('webcam fail!', e);
};

function hasGetUserMedia() {
    return !!(navigator.getUserMedia || navigator.webkitGetUserMedia ||     navigator.mozGetUserMedia || navigator.msGetUserMedia);
}

if (hasGetUserMedia()) {
    window.URL = window.URL || window.webkitURL;
    navigator.getUserMedia = navigator.getUserMedia ||
                        navigator.webkitGetUserMedia ||
                        navigator.mozGetUserMedia ||
                        navigator.msGetUserMedia;


    if (navigator.getUserMedia) {
        navigator.getUserMedia({video: true, audio: false}, function(stream){
        var video = document.querySelector('video');
        var recorder = new MediaRecorder(stream); <<<<<< THIS IS MY PROBLEM SPOT
        video.src = window.URL.createObjectURL(stream);
        video.play();

        // webcamstream = stream;
        // streamrecorder = webcamstream.record();
        }, onVideoFail);
    } else {
    alert('failed');
    }
} else {
alert('getUserMedia() is not supported by this browser!!');
}

我一直在尝试查看此内容以供参考:

HTML5 getUserMedia record webcam, both audio and video

【问题讨论】:

标签: javascript html


【解决方案1】:

MediaStream Recording(或 Media Recorder API 在它定义的MediaRecorder JS 对象之后)现已在桌面上的 2 个主要浏览器中实现:

  • Firefox 30 音频 + 视频
  • Chrome 47, 48 仅适用于在 chrome://flags 中启用 experimental Web Platform 的视频。
  • Chrome 49音视频

容器

  • 两者都记录到 .webm 容器中。

视频编解码器

  • 均录制 VP8 视频
  • Chrome 49+ 可以录制 VP9 视频
  • Chrome 52+ 可以录制 H.264 视频

音频编解码器

  • Firefox 以 44.1 kHz 录制 Vorbis 音频
  • Chrome 49 记录 Opus 音频@48 kHz

演示/GitLab:

确保在 HTTPS 或 localhost 上运行这些演示:

从 Chrome 47 开始,仅允许来自安全来源的 getUserMedia() 请求:HTTPS 或 localhost。

进一步阅读:

免责声明:我在 Pipe 工作,我们处理视频录制。

【讨论】:

【解决方案2】:

我目前正在使用这个API,我发现我们的它目前只在firefox的Nightly版本上实现,它只能录制音频。

它没有在 Chrome 上实现(据我所知)。

以下是我的使用方法,如果有帮助的话:

function record(length,stream) {
    var recorder = new window.MediaRecorder(stream);

    recorder.ondataavailable = function(event) {
        if (recorder.state == 'recording') {
            var blob = new window.Blob([event.data], {
                type: 'audio/ogg'
            });

            // use the created blob

            recorder.stop();
        }
    };

    recorder.onstop = function() {
        recorder = null;
    };

    recorder.start(length);
}

【讨论】:

    【解决方案3】:

    我在simpl.info/mediarecorder 放了一个 MediaStream Recording 演示。

    这目前适用于 Firefox Nightly,正如@Apzx 所说,它只是音频。 Chrome 有一个Intent to Implement

    【讨论】:

    • 你知道有没有办法通过 RTCPeerConnections 获取 MediaStream 的字节?我需要一种方法来获取没有 MediaStreamRecorder 的模拟记录器(视频帧的画布元素)的字节。这会导致视频质量非常差。
    • 不确定这是否有帮助,但 MediaRecorder 现在已在 Chrome 中实现,您可以通过对等连接访问远程音频和视频。 (不记得版本——您可能需要启用了 Experimental Platform Features 标志的 Canary。)看看webrtc.github.io/samples
    • 是的,看到了这一点 - 不幸的是,您必须启用“实验平台工具”标志才能获取记录器,并且在 M49 版本之前它还没有完全成熟且没有标志(当前发布的版本是 M48)。不过没关系 - 对于我的用例,我认为我需要做的是设置一个 WebRTC 媒体服务器来获取流并将它们保存到 S3。
    【解决方案4】:

    从版本 49 开始,Chrome 现在支持 MediaRecorder API。您现在可以录制 MediaStream 对象。不幸的是,如果您要构建的产品必须为比最新版本的 Chrome 更早的浏览器记录 MediaStreams(至少在撰写本文时),那么您将需要使用 WebRTC 媒体服务器/网关。

    基本思想是在服务器上实例化对等连接,并且本地对等将视频和/或音频流附加到其连接对象以发送到服务器对等。然后,服务器侦听传入的 WebRTC 流并将其记录到文件中。您可能想查看几个媒体服务器:

    我个人正在使用 Kurento 并用它录制视频流并取得了巨大成功。

    为了让媒体服务器正常工作,您需要启动自己的应用服务器来处理ICE Candidates 的信令和处理。这很简单,Kurento 用 Node 和 Java 提供了一些相当不错的 examples

    如果您的目标受众是普通观众并使用媒体服务器,那么您可能还需要 STUN 或 TURN 服务器。这些服务器本质上使用网络拓扑来获取媒体服务器的公共 IP 和客户端的公共 IP。请注意,如果任一端(媒体服务器或客户端)位于symmetric NAT 后面,则 STUN 服务器将不够用,您将需要使用 TURN 服务器(可以找到免费的 here)。没有太多细节,要记住的一件好事是 STUN 服务器充当信令网关,而 TURN 服务器充当中继网关。这意味着媒体流实际上将通过 TURN 服务器,而媒体流将从 RTC 对等连接直接传递到另一个连接。

    希望这会有所帮助。如果您真的需要 RTC 录制功能,那么您将走上一条漫长的道路,因此请确保它是值得的。

    【讨论】:

    • 我将与janus 走同一条路。尽管 janus 相当稳固,但是否值得在每一步都面临挑战?
    • WebRTC 与 MediaRecorder API 无关。
    • @coding_idiot 从未尝试过janus,但这完全取决于您的产品要求及其用途。对我们来说,这是绝对必要的,因为记录 WebRTC 流是我们产品的核心部分。对你来说可能会有所不同。谈到 Kurento 与 Janus 的比赛 - 我只能说 Kurento 非常可靠。喜欢它。
    • @OctavianNaicu 我从来没有说过这是一回事。但是它们在浏览器中都是由相同的 MediaStream 抽象类型实现的,因此在录制方面,一个与另一个的安全性和能力问题是相同的。在 OP 的所有实用性中,他们可以将任何类型视为可通过MediaRecorder API 记录的类型,并且在堆栈中的高位相同。
    【解决方案5】:

    另请参阅RecordRTC,它为 Chrome 提供了大致模拟 MediaStream Recording 功能的解决方法。火狐文档是here

    【讨论】:

      猜你喜欢
      • 2012-06-27
      • 1970-01-01
      • 2012-11-02
      • 2014-11-03
      • 1970-01-01
      • 2013-08-20
      • 2011-05-06
      • 1970-01-01
      • 2013-02-04
      相关资源
      最近更新 更多