将用计算机摄像机捕获的视频从网站发送到服务器

达尼奇

我正在尝试让计算机或Android设备从摄像机录制视频并将其发送到存储它的服务器。该系统必须基于Web,并且需要连续发送视频片段。

这是javascript中的代码:

var camera = (function() {
    var options;
    var video, canvas, context;
    var renderTimer;

    function initVideoStream() {
        video = document.createElement("video");
        video.setAttribute('width', options.width);
        video.setAttribute('height', options.height);

        navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
        window.URL = window.URL || window.webkitURL || window.mozURL || window.msURL;

        if (navigator.getUserMedia) {
            navigator.getUserMedia({
                video: true
            }, function(stream) {
                options.onSuccess();

                if (video.mozSrcObject !== undefined) { // hack for Firefox < 19
                    video.mozSrcObject = stream;
                } else {
                    video.src = (window.URL && window.URL.createObjectURL(stream)) || stream;
                }

                initCanvas();
            }, options.onError);
        } else {
            options.onNotSupported();
        }
    }

    function initCanvas() {
        canvas = document.getElementById("canvas");//options.targetCanvas || document.createElement("canvas");
        canvas.setAttribute('width', options.width);
        canvas.setAttribute('height', options.height);

        context = canvas.getContext('2d');

        // mirror video
        if (options.mirror) {
            context.translate(canvas.width, 0);
            context.scale(-1, 1);
        }

        startCapture();
    }

    function startCapture() {
        video.play();

        renderTimer = setInterval(function() {
            try {
                context.drawImage(video, 0, 0, video.width, video.height);
                options.onFrame(canvas);
            } catch (e) {
                // TODO
            }
        }, Math.round(1000 / options.fps));
    }

    function stopCapture() {
        pauseCapture();

        if (video.mozSrcObject !== undefined) {
            video.mozSrcObject = null;
        } else {
            video.src = "";
        }
    }

    function pauseCapture() {
        if (renderTimer) clearInterval(renderTimer);
        video.pause();
    }

    return {
        init: function(captureOptions) {
            var doNothing = function(){};

            options = captureOptions || {};

            options.fps = options.fps || 30;
            options.width = options.width || 640;
            options.height = options.height || 480;
            options.mirror = options.mirror || false;
            options.targetCanvas = options.targetCanvas || null; // TODO: is the element actually a <canvas> ?

            initVideoStream();
        },

        start: startCapture,

        pause: pauseCapture,

        stop: stopCapture
    };
})();

var imgSender = (function() {
    function imgsFromCanvas(canvas, options) {
        var context = canvas.getContext("2d");
        var canvasWidth = canvas.width; //# pixels horizontally
        var canvasHeight = canvas.height; //# pixels vertically
        var imageData = context.getImageData(0, 0, canvasWidth, canvasHeight); //Vector of all pixels
        options.callback(canvasWidth, canvasHeight, imageData.data);
    }

    return {
        fromCanvas: function(canvas, options) {
            options = options || {};
            options.callback = options.callback || doNothing;
            return imgsFromCanvas(canvas, options);
        }
    };
})();

var FPS = 30; //fps
var minVideoTime = 5; //Seconds that every video clip sent will take
var arrayImgs = []; //Array with all the images that will be sent to the server
var videoTime = 0; //Number of seconds of video stored in videoTime
(function() {
    var capturing = false;

    camera.init({
        width: 160,
        height: 120,
        fps: FPS,
        mirror: true,

        onFrame: function(canvas) {
            imgSender.fromCanvas(canvas, {
                callback: function(w,h,image) {
                    arrayImgs.push(image);
                    videoTime += 1/FPS;
                    if (minVideoTime <= videoTime) {
                        sendToPhp(w,h,videoTime*FPS);
                        arrayImgs = [];
                        videoTime = 0;

                        function sendToPhp(width,height,numFrames) {
                            $.ajax({
                                type: "POST",
                                url: "sendToServer.php",
                                data: {
                                    arrayImgs: arrayImgs,
                                    width: w,
                                    height: h,
                                    nframes: numFrames
                                },

                                async: true, // If set to non-async, browser shows page as "Loading.."
                                cache: false,
                                timeout:500, // Timeout in ms (0.5s)

                                success: function(answer){
                                    console.log("SUCCESS: ", answer);
                                },
                                error: function(XMLHttpRequest, textStatus, errorThrown){
                                    console.log("ERROR: ", textStatus, " , ", errorThrown);                             }
                            });
                        }
                    }
                }
            });
        },

        onSuccess: function() {
            document.getElementById("info").style.display = "none";

            capturing = true;
            document.getElementById("pause").style.display = "block";
            document.getElementById("pause").onclick = function() {
                if (capturing) {
                    camera.pause();
                } else {
                    camera.start();
                }
                capturing = !capturing;
            };
        },

        onError: function(error) {
            // TODO: log error
        },

        onNotSupported: function() {
            document.getElementById("info").style.display = "none";
            document.getElementById("notSupported").style.display = "block";
        }
    });
})();

如您所见,我正在使用getUserMedia来获取视频,并且对数组中的图像进行采样,直到获得5秒钟的视频为止,然后将其发送到将其发送到服务器的php文件中。

我的问题:所有ajax请求中都有很多滞后,而且我还有尺寸问题,ajax请求不能同时接受太多数据,因此我必须减少fps和视频长度发送。

有没有更好的方法可以做到这一点?到目前为止,我丢失了超过50%的视频!也许通过WebRTC?请帮忙

谢谢!

杰斯普

对于您的用例,您应该使用MediaRecorder API这样一来,您就可以将视频作为WebM录制成块,然后可以在后台上传到服务器。WebM / VP8(或mp4)在压缩视频方面比现在正在做的MJPEG更好。

另请参见RecordRTC,其中包括尚未实现此功能的浏览器的兼容性层,等等。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将服务器的日期和时间发送到客户端计算机

来自分类Dev

将消息从Node.js服务器发送到Windows计算机

来自分类Dev

将服务器的日期和时间发送到客户端计算机

来自分类Dev

现在可以使用GetUserMedia API从网络摄像机读取视频流并将其直接发送到服务器以进行进一步广播吗?

来自分类Dev

从服务器到网页广播视频文件(不是来自网络摄像机的视频)

来自分类Dev

我可以使用家用计算机作为提供网站的网站服务器吗?

来自分类Dev

将视频从pi摄像机流传输到远程服务器的浏览器

来自分类Dev

将视频从pi摄像机流传输到远程服务器的浏览器

来自分类Dev

在网络视图中将iOS7摄像机的视频流发送到JavaScript Canvas

来自分类Dev

Android通过进度条将摄像机图像,视频上传到服务器

来自分类Dev

将自定义对象从android应用程序(客户端)发送到计算机(服务器)

来自分类Dev

如何使用KDE Connect将文件从计算机发送到手机?

来自分类Dev

监控摄像机系统服务器

来自分类Dev

监控摄像机系统服务器

来自分类Dev

如何使用JavaScript获取计算机中随附的摄像机列表?

来自分类Dev

来自连接到远程计算机的摄像机的Opencv流

来自分类Dev

VLC网络摄像机转换为vmware来宾计算机

来自分类Dev

打开连接时,将用户ID从浏览器发送到Websocket服务器

来自分类Dev

使用Tiva Series C将数据从微控制器发送到计算机

来自分类Dev

将数据包发送到路由器后面的计算机

来自分类Dev

如何在Spring MVC中将用户表单数据发送到服务器

来自分类Dev

您以什么频率将用户交互数据发送到服务器?

来自分类Dev

将用户位置从android设备发送到ac#服务器的最佳方法

来自分类Dev

Java-将用户输入发送到服务器

来自分类Dev

使用Swift录制和回放视频并将视频发送到服务器

来自分类Dev

当我创建一个可共享的私有链接然后访问它时,将页面从服务器发送到我的计算机的每个人都看到该链接吗?

来自分类Dev

Ruby-如何使用Ruby将文本字符串从TCP服务器发送到另一台计算机上的客户端?

来自分类Dev

从Android摄像机捕获视频后,VideoView显示黑色

来自分类Dev

将图像和视频发送到Android中的服务器

Related 相关文章

  1. 1

    将服务器的日期和时间发送到客户端计算机

  2. 2

    将消息从Node.js服务器发送到Windows计算机

  3. 3

    将服务器的日期和时间发送到客户端计算机

  4. 4

    现在可以使用GetUserMedia API从网络摄像机读取视频流并将其直接发送到服务器以进行进一步广播吗?

  5. 5

    从服务器到网页广播视频文件(不是来自网络摄像机的视频)

  6. 6

    我可以使用家用计算机作为提供网站的网站服务器吗?

  7. 7

    将视频从pi摄像机流传输到远程服务器的浏览器

  8. 8

    将视频从pi摄像机流传输到远程服务器的浏览器

  9. 9

    在网络视图中将iOS7摄像机的视频流发送到JavaScript Canvas

  10. 10

    Android通过进度条将摄像机图像,视频上传到服务器

  11. 11

    将自定义对象从android应用程序(客户端)发送到计算机(服务器)

  12. 12

    如何使用KDE Connect将文件从计算机发送到手机?

  13. 13

    监控摄像机系统服务器

  14. 14

    监控摄像机系统服务器

  15. 15

    如何使用JavaScript获取计算机中随附的摄像机列表?

  16. 16

    来自连接到远程计算机的摄像机的Opencv流

  17. 17

    VLC网络摄像机转换为vmware来宾计算机

  18. 18

    打开连接时,将用户ID从浏览器发送到Websocket服务器

  19. 19

    使用Tiva Series C将数据从微控制器发送到计算机

  20. 20

    将数据包发送到路由器后面的计算机

  21. 21

    如何在Spring MVC中将用户表单数据发送到服务器

  22. 22

    您以什么频率将用户交互数据发送到服务器?

  23. 23

    将用户位置从android设备发送到ac#服务器的最佳方法

  24. 24

    Java-将用户输入发送到服务器

  25. 25

    使用Swift录制和回放视频并将视频发送到服务器

  26. 26

    当我创建一个可共享的私有链接然后访问它时,将页面从服务器发送到我的计算机的每个人都看到该链接吗?

  27. 27

    Ruby-如何使用Ruby将文本字符串从TCP服务器发送到另一台计算机上的客户端?

  28. 28

    从Android摄像机捕获视频后,VideoView显示黑色

  29. 29

    将图像和视频发送到Android中的服务器

热门标签

归档