使用媒体流扩展 (MSE) 显示 getUserMedia Stream 实时视频

2024-03-08

我正在尝试使用 getUserMedia 显示从网络摄像头获取的 MediaStream,并使用任何可能播放的机制将其中继到远程对等点(作为实验)。我没有直接使用 webRTC,因为我想控制原始数据。

我遇到的问题是我的视频元素不显示任何内容,并且我没有收到任何错误。我在 Elementary OS(基于 Ubuntu 14.04 的 Linux 操作系统)上使用 Chrome 版本 51.0.2704.103(64 位)。

作为旁注,如果我将所有 blob 记录到一个数组中,然后创建一个新的 blob 并将视频的 src 元素设置为 URL.createObjectUrl(blob),它将正确显示视频。

这是我尝试实现此目的的代码(减去中继,我只是尝试在本地播放它):

var ms = new MediaSource();
var video = document.querySelector("video"); 
video.src = window.URL.createObjectURL(ms);

ms.addEventListener("sourceopen", function() {
    var sourceBuffer = ms.addSourceBuffer('video/webm; codecs="vorbis,vp8"');

    navigator.getUserMedia({video: {width: 320, height: 240, framerate: 30}, audio: true}, function(stream) {
        var recorder = new MediaRecorder(stream);

        recorder.ondataavailable = function(event) {
            var reader = new FileReader();
            reader.addEventListener("loadend", function () {
                var uint8Chunk = new Uint8Array(reader.result);
                if (!sourceBuffer.updating) {
                    sourceBuffer.appendBuffer(uint8Chunk);
                }
                if (video.paused) video.play();
            });
            reader.readAsArrayBuffer(event.data);
        };

        recorder.start(10);
    }, function(error) {
        console.error(error);
    });
}, false);

这是我在 chrome://media-internal 中获得的信息:

render_id: 147
player_id: 0
pipeline_state: kPlaying
event: WEBMEDIAPLAYER_CREATED
url: blob:http%3A//localhost%3A8080/e5c51dd8-5709-4e6f-9457-49ac8c34756b
found_audio_stream: true
audio_codec_name: opus
found_video_stream: true
video_codec_name: vp8
duration: unknown
audio_dds: false
audio_decoder: OpusAudioDecoder
video_dds: false
video_decoder: FFmpegVideoDecoder

还有日志:

00:00:00 00 pipeline_state  kCreated
00:00:00 00 event   WEBMEDIAPLAYER_CREATED
00:00:00 00 url blob:http%3A//localhost%3A8080/e5c51dd8-5709-4e6f-9457-49ac8c34756b
00:00:00 00 pipeline_state  kInitDemuxer
00:00:01 603    found_audio_stream  true
00:00:01 603    audio_codec_name    opus
00:00:01 603    found_video_stream  true
00:00:01 603    video_codec_name    vp8
00:00:01 604    duration    unknown
00:00:01 604    pipeline_state  kInitRenderer
00:00:01 604    audio_dds   false
00:00:01 604    audio_decoder   OpusAudioDecoder
00:00:01 604    video_dds   false
00:00:01 604    video_decoder   FFmpegVideoDecoder
00:00:01 604    pipeline_state  kPlaying

更新:我尝试将数据发送到节点并使用 ffmpeg (fluent-ffmpeg) 将其保存到 webm 文件中,并且我可以在 VLC 中正确查看该文件。

更新 2:从节点流回后,我得到以下信息:Media segment did not contain any video coded frames, mismatching initialization segment. Therefore, MSE coded frame processing may not interoperably detect discontinuities in appended media. 。经过一些研究后,似乎 webm 文件必须分段才能工作,但是我还没有找到针对实时流执行此操作的方法(使用 ffmpeg 或其他工具)。这里有什么想法吗?


有点晚了,但你可以像这样尝试(在 Chrome 中):

<html>

<body>
    <video class="real1" autoplay controls></video>
    <video class="real2" controls></video>

    <script>
        const constraints = {video: {width: 320, height: 240, framerate: 30}, audio: true};

        const video1 = document.querySelector('.real1');
        const video2 = document.querySelector('.real2');

        var mediaSource = new MediaSource();
        video2.src = window.URL.createObjectURL(mediaSource);
        var sourceBuffer;
        mediaSource.addEventListener('sourceopen', function () {
            sourceBuffer = mediaSource.addSourceBuffer('video/webm; codecs=opus,vp8');
            console.log(sourceBuffer);
        })

        var isFirst = true;
        var mediaRecorder;
        var i = 0;
        function handleSuccess(stream) {
            video1.srcObject = stream;
            mediaRecorder = new MediaRecorder(stream, { mimeType: 'video/webm; codecs=opus,vp8' });
            console.log(mediaRecorder.mimeType)
            mediaRecorder.ondataavailable = function (e) {
                var reader = new FileReader();
                reader.onload = function (e) {              
                    sourceBuffer.appendBuffer(new Uint8Array(e.target.result));
                }
                reader.readAsArrayBuffer(e.data);

                if (video2.paused) {
                    video2.play(0);
                }
            }
            mediaRecorder.start(20);
        }

        function handleError(error) {
            console.error('Reeeejected!', error);
        }
        navigator.mediaDevices.getUserMedia(constraints).
            then(handleSuccess).catch(handleError);
    </script>
</body>

</html>

我认为您错过了为记录器和 sourceBuffer 设置相同(支持的)编解码器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用媒体流扩展 (MSE) 显示 getUserMedia Stream 实时视频 的相关文章

  • 我可以在 DTLS-SRTP 加密中指定自己的加密密钥吗

    在 Chrome 中的 webrtc Web 应用程序中 我曾经通过覆盖 SDP 中的加密信息来指定自己的加密密钥 我现在正在迁移我的 webrtc Web 应用程序以使用 DTLS SRTP 进行加密 启用 DTLS 后 有没有办法告诉
  • 独立移动应用程序上的 WebRTC

    我知道WebRTC是为浏览器设计的 但是可以直接在移动应用程序上使用WebRTC库吗 Thanks 截至5月14日here https github com pchab AndroidRTC是一个android项目 使用WebRTC效果很好
  • Node教程一对多无加载远程服务器Stream Spinner动不停

    我对在项目中使用所需的 Kurrento 很陌生 但是当我克隆 git hub 上为 Kurento 提供的教程并遵循 one2Many 调用的说明时 首先 adapter js 的软件包损坏了 因为我成功解决了它们 但之后出现了一个问题
  • 如何运行媒体流

    我创建了一个网络摄像头流 navigator getUserMedia video true function stream videoTag src window URL createObjectURL stream videoTag p
  • 使用 Docker 的 mediasoup v3

    我正在尝试运行一个2docker 中的 WebRTC 示例 使用 mediasoup 当我在一组实例上进行视频通话时 我想运行两台服务器 我的错误 你有没有看到这个错误 createProducerTransport null 错误 由于地
  • 在 Objective C 中使用 static init 有什么好处?

    最近我发现来自 Github 的 webrtc ios 示例 https github com gandg webrtc ios 当我浏览该项目时 我注意到 VideoView 类使用静态方法 但我不确定这是否必要 VideoView 是
  • 通过套接字将视频流传输到 html5 视频标签

    你好 我一直在尝试通过 socket io 套接字将 webm 视频直接流式传输到 html5 视频标签 客户端和服务器端代码如下 Server function var Alert Channel Receiver Takeover ex
  • 为 WebRTC 应用程序实现我们自己的 STUN/TURN 服务器 [重复]

    这个问题在这里已经有答案了 我正在开发一个 webrtc 应用程序 并且必须实现以下 TURN 服务器 https code google com p rfc5766 turn server https code google com p
  • 从 VideoView 录制视频

    目前在做直播项目 成功实现视频直播 现在我的下一个任务是录制 VideoView 中正在播放的视频 我进行了搜索 能够找到捕获视频 但使用表面 相机 但在 VideoView 中我没有任何表面 任何帮助表示赞赏 你可以看到this http
  • 如何通过 Internet Explorer 使用网络摄像头

    有什么办法可以跑getUserMedia在 Internet Explorer 中并使用网络摄像头 不使用 Flash 据此 没有 http caniuse com search getuserMedia http caniuse com
  • 结束两个对等方之间的 WebRTC 视频通话

    我已经使用以下命令在两个同伴之间建立了视频聊天WebRTC 我想让一个对等方结束聊天 并让另一个对等方知道聊天已结束 聊天结束后 需要为双方执行一些代码 这PeerConnection对象有一个removeStream 应该触发的方法onr
  • React Native - 在 Android 中显示传入视频通话屏幕(VOIP 应用程序)[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试实施视频通话React Native 应用程序中的功能 我用过React 原生 twilio 视频 webrtc https
  • WebRTC 不适用于 Windows

    每当我尝试为 Windows 构建 WebRTC 时 运行 gclient runhooks 时都会收到此错误 running C path to depot tools python276 bin python exe src build
  • 如何关闭 webrtc 数据通道?

    我无法使用以下方法 因为我只使用数据通道 不使用 getUserMedia
  • 如何在FireFox中检查用户访问麦克风的权限是否被拒绝

    有没有办法查明用户是否拒绝或允许媒体设备的权限 例如 Firefox 中的麦克风 摄像头 在 Chrome 中 我可以使用 navigator permissions query 检查这一点 但在 Firefox 中会失败并出现 TypeE
  • 错误类型 3 - 活动类不存在

    我正在尝试运行 webRTC 应用程序 但返回以下错误 启动应用程序 com onlinevoicecallapp com onlinevoicecallapp MainActivity 设备外壳命令 am start n com onli
  • 捕获高分辨率视频/图像 html5

    我使用 geUserMedia 从网络摄像头捕获图像Intro http www html5rocks com en tutorials getusermedia intro 我得到的最佳分辨率是640 480 但我有高清网络摄像头 录制视
  • 使用peerjs webrtc共享屏幕+共享系统音频时麦克风不工作

    我们已经尝试过共享屏幕声音的 共享屏幕时 麦克风和屏幕共享音频不能同时工作 麦克风不工作时系统音频已开启 系统音频确实不工作如果末端麦克风打开 请解释一下问题是什么 这是代码 function startScreenShare if scr
  • MediaPlayer() 音频口吃(android)

    我正在我的 Android 应用程序中使用 MediaPlayer 函数从远程服务器传输实时音频流 但音频断断续续且断断续续 问题不在于我的互联网 因为当我在计算机上播放时 提要播放得很好 可能是什么问题 注意 直播正在进行中 这是我正在使
  • 有没有办法使用 JSON 对象创建自己的 mediaStreamTrack?

    webRTC 上的 mediaStream 接口允许多个 MediaStreamTrack 这些不一定是来自相机 麦克风的音频和 或视频流 如何使用 JSON 对象创建 MediaStreamTrack 在最近的一次会议上主题 http l

随机推荐