python - 如何在 Python 中处理流式传输到 Firebase 信令服务器的视频

标签 python firebase html5-video webrtc

我已设法将我的网络摄像头设置为指向 Firebase 数据库上的特定位置并使用 WebRTC 播放视频。

我在 Javascript 中按如下方式执行此操作(并在我的 HTML 中显示):

<video id="yourVideo" autoplay muted playsinline></video>
...

var database = firebase.database().ref('node_on_firebase');
var yourVideo = document.getElementById("yourVideo");
var friendsVideo = document.getElementById("friendsVideo");
var yourId = Math.floor(Math.random()*1000000000);
var servers = {'iceServers': [{'urls': 'stun:stun.services.mozilla.com'}, {'urls': 'stun:stun.l.google.com:19302'}, {'urls': 'turn:numb.viagenie.ca','credential': 'webrtc','username': 'websitebeaver@mail.com'}]};

var pc = new RTCPeerConnection(servers);
pc.onicecandidate = (event => event.candidate?sendMessage(yourId, JSON.stringify({'ice': event.candidate})):console.log("Sent All Ice") );
pc.onaddstream = (event => friendsVideo.srcObject = event.stream);

function sendMessage(senderId, data) {
    var msg = database.push({ sender: senderId, message: data });
    msg.remove();
}


function readMessage(data) {
    // works
    var msg    = JSON.parse(data.val().message);
    var sender = data.val().sender;

    if (sender != yourId) {

        if (msg.ice != undefined)
            pc.addIceCandidate(new RTCIceCandidate(msg.ice));

        else if (msg.sdp.type == "offer")
            pc.setRemoteDescription(new RTCSessionDescription(msg.sdp))
            .then(() => pc.createAnswer())
            .then(answer => pc.setLocalDescription(answer))
            .then(() => sendMessage(yourId, JSON.stringify({'sdp': pc.localDescription})));

        else if (msg.sdp.type == "answer")
            pc.setRemoteDescription(new RTCSessionDescription(msg.sdp));

    }
};

database.on('child_added', readMessage);

function closeMyFace() {
    yourVideo.srcObject.getTracks().forEach(track => track.stop());
}

function showMyFace() {
    navigator.mediaDevices.getUserMedia({audio:false, video:true}).
    then(function(stream){
        pc.addStream(stream)
        yourVideo.srcObject = stream
    })
    .catch(function(error){
        console.log(error)
    })
}

function showFriendsFace() {
    pc.createOffer()
    .then(offer => pc.setLocalDescription(offer) )
    .then(() => sendMessage(yourId, JSON.stringify({'sdp': pc.localDescription})) );
}

但是,如何下载/流式传输此视频并分块处理视频,最好是在 Python 脚本中?

最佳答案

如果您打算在视频流式传输时下载/处理视频,那么您的 (python) 客户端将需要创建自己的 RTCPeerConnection 以便它也可以接收视频流。我相信这在 python 中不是微不足道的,尽管在其他平台上可能更容易。更多信息:WebRTC Python implementation

如果您的用例允许您在录制完成后处理视频(或者至少,您的用例可以延迟很长时间),那么可以让 javascript 客户端按接收到的数据或稍后批量上传数据(从上面示例中的 friendsVideo 流),可能是 block ,到您的自定义(python)客户端然后可以下载和处理的位置。

虽然与 RTCPeerConnection 无关,但您可以在 SO 上搜索其他使用 firebase 播放视频的用户(结果不一)。不过,这与您尝试使用 RTCPeerConnection 所做的有些不同。示例:Firebase Storage Video Streaming

关于python - 如何在 Python 中处理流式传输到 Firebase 信令服务器的视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57065786/

相关文章:

python - Pandas:填充 nan 性能不佳 - 避免迭代行?

swift - 按 double 对 UITableView 进行排序

android - 按优先级(从最低到最高)检索 Firebase 数据不起作用?

javascript - 作为网站背景的视频按命令播放

html - 如何在 Chrome 媒体控制菜单和 Windows 媒体控制对话框中设置 HTML 音频或视频缩略图和标题

python - 文件 I/O 操作会释放 Python 中的 GIL 吗?

python - 如何使 Python3.6,Red Hat Software Collection 在重启/注销/登录后保持不变?

python - lxml: cssselect(): AttributeError: 'lxml.etree._Element' 对象没有属性 'cssselect'

ios - Xcode 11 中的构建/存档版本无限期挂起

javascript - 如果删除 html 元素视频上的静音属性,则没有视频声音