从网络摄像头录制视频流并将 blob 上传到服务器

2024-02-08

所以我有一个网站可以记录来自用户网络摄像头的视频流并将其转换为 blob 使用getUserMedia()。我现在想将此 blob 发送到服务器,以便可以保存和处理视频。我在通过 ajax 发送 blob 文件时遇到问题,我尝试过使用 formData + XMLHttpRequest() 方法以及纯 ajax。对于我的应用程序来说,用户可以录制视频并立即将该视频发送到我的服务器是必要的。

任何帮助将不胜感激。

so HTML:

    <div class="demo">
    <video id="preview" autoplay width="400" height="300"></video>
    <video id="recording" width="400" height="300" style="display:none;" controls></video>

    <div class="progress">
        <div class="progress-bar"></div>
        <span>01:00</span>
    </div>
    <button class="record">Record</button>
    <button class="upload">Upload</button>
</div>

相关JS函数:

function captureVideo () {
    const preview = document.querySelector('video#preview');
    const recording = document.querySelector('video#recording');
    navigator.mediaDevices.getUserMedia({video: true}).then((stream) => {
        preview.srcObject = stream;
        preview.captureStream = preview.captureStream || preview.mozCaptureStream;
        return new Promise(resolve => preview.onplaying = resolve);
    }).then(() => {
        let recorder = new MediaRecorder(preview.captureStream());
        let data = [];

        recorder.ondataavailable = event => data.push(event.data);
        recorder.start();
        log(recorder.state + " for " + (60000/1000) + " seconds...");

        let stopped = new Promise((resolve, reject) => {
            recorder.onstop = resolve;
            recorder.onerror = event => reject(event.name);
        });

        $('button.stop').click(function () {
            recorder.stop();
        });

        return Promise.all([ stopped ]).then(() => data);
    }).then ((recordedChunks) => {
        let recordedBlob = new Blob(recordedChunks, {
            type: "video/webm"
        });
        recording.src = URL.createObjectURL(recordedBlob);
        $('#preview').hide();
        $('#recording').show();
        log("Successfully recorded " + recordedBlob.size + " bytes of " +
            recordedBlob.type + " media.");
        $('button.upload').click(function() {
            sendVideoToAPI(recordedBlob);
        });
    }).catch(log);
}
function sendVideoToAPI (blob) {

    let fd = new FormData();
    let file = new File([blob], 'recording');

    fd.append('data', file);
    console.log(fd); // test to see if appending form data would work, it didn't this is completely empty. 


    let form = new FormData();
    let request = new XMLHttpRequest();
    form.append("file",file);
    request.open("POST",  "/demo/upload", true);
    request.send(form); // hits the route but doesn't send the file
    console.log(request.response) // returns nothing

    // I have also tried this method which hits the route and gets a response however the file is not present in the request when it hits the server. 
    // $.ajax({
    //     url: Routing.generate('upload'),
    //     data: file,
    //     contentType: false,
    //     processData: false,
    //     error: function (res) {
    //         console.log(res);
    //     },
    //     success: function(res) {
    //         console.log(res);
    //     }
    // });
}

您正在发送 ajax 请求,在 send() 命令之后不会立即收到响应。您可以使用请求 onload 事件访问响应值

request.onload = function () {
            if (request.readyState === request.DONE) {
                if (request.status === 200) {
                    console.log(request.response);
                }
            }
        };
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从网络摄像头录制视频流并将 blob 上传到服务器 的相关文章

随机推荐

  • 如何在Python中给定时间后结束程序运行

    我希望我的 Python 程序运行一个算法给定的秒数 然后打印迄今为止最好的结果并结束 最好的方法是什么 我尝试了以下方法 但没有成功 程序在打印后继续运行 def printBestResult self print self bestR
  • 将 HTML 字符串添加到 OpenXML (*.docx) 文档

    我正在尝试使用 Microsoft 的 OpenXML 2 5 库来创建 OpenXML 文档 一切都运行良好 直到我尝试将 HTML 字符串插入到我的文档中 我已经在网上搜索过 这是我到目前为止所想到的 只截取我遇到问题的部分 Parag
  • wkHTMLtoPDF 支持@page 规则吗?

    我一直在尝试使用这个简单的命令来探索 wkHTML2PDF 的功能 wkhtml2pdf test htm test pdf 它似乎不支持可能包含在附加 CSS 文件中的 page 规则 或者我错过了什么 一些参数的例子 简而言之 答案是否
  • MediaPlayer,仅视频 m3u8 HTML 流有效

    我正在将 MediaPlayer 与 m3u8 音频流一起使用 这会导致日志错误消息 Error 1 1010 当我查看错误代码时 第一个参数似乎没问题 https github com android platform external
  • C# 功能请求:在匿名类型上实现接口

    我想知道需要什么才能使这样的事情发挥作用 using System class Program static void Main var f new IFoo Foo foo Print gt Console WriteLine Foo i
  • python“set.intersection”对于n个集合的时间复杂度

    我想知道该问题的复杂性set intersection蟒蛇 我查看了 python 的文档和在线 wiki 但没有找到该方法对于多组的时间复杂度 The python wiki 关于时间复杂度列表 https wiki python org
  • 为 ComboBox 项目分配值

    我目前正在尝试为 winform 的货币制作一个下拉框 组合框 这是我到目前为止所拥有的 但我注意到下拉框的数据绑定版本有一个特殊选项 所以我想知道是否可以创建与此类似的东西 而无需对整个字符串进行比较或在数据库中创建表 列表和组合框可以包
  • 遍历并修改C json字符串

    在 C 中遍历和修改 JSON 字符串的正确方法是什么 具体来说 我有一个字符串 body buf 打印出来时 print length d n s n body len body len body buf 它看起来像这样 length 1
  • 如何在 Android 中共享文本和图像

    我想分享我的应用程序的内容 文字与图像 对于这个问题 我写了下面的代码 Intent sharingIntent new Intent Intent ACTION SEND sharingIntent setType sharingInte
  • 如何在 Symfony2 中自定义/本地化断言消息?

    当你使用 Assert NotBlank约束并且给定字段为空 那么您会收到错误 该值不应为空 我想在应用程序范围内更改此消息 而不更改 Symfony2 源代码 如何做到这一点 自定义验证错误消息非常简单 但乍一看似乎并不棘手 默认区域设置
  • 从 sql 文件恢复单个表转储

    我有 sql 文件的完整转储 例如dump full sql尺寸的1 3GB 它有一些像这样的表 dancing core spice dancing sea beast forde clear one forde super now 现在
  • 枚举mysql查询中使用的表?

    有没有办法枚举mysql查询中使用的表 可以说我有疑问 SELECT FROM db people people facts pf INNER JOIN db system connections sm ON sm source id pf
  • 如何查看 Chrome 扩展程序的总安装数?

    我正在通过 Chrome 网上商店分发 Chrome 扩展程序 但我无法找到网上商店告诉我我的扩展程序有多少 总安装量 的地方 我想知道自从我第一次上传扩展程序以来总共有多少人安装了它 在谷歌上进行一些快速搜索 在谷歌帮助部分中找到了以下文
  • Mac OS 和 FreeBSD 之间 kqueue 处理 fifo 的差异?

    我正在开发一个应用程序 该应用程序使用 fifos 进行 IPC 并使用事件通知 API 例如 epoll 或 kqueue 来监视 fifos 以获取要读取的数据 应用程序期望 如果 fifo 的写入器终止 则读取器将通过事件通知 API
  • xcopy 包含文件夹

    这应该是一个简单的问题 但我一直找不到答案 我想将文件夹 不仅仅是内容 复制到桌面 我尝试过的所有内容都只包含该文件夹的内容 我已经尝试了下面的内容 但内容仍然只是复制 xcopy C Users user Folder C Users u
  • Sencha Touch - 需要嵌套列表示例

    我需要一个简单的嵌套列表视图示例 类似这样的事情 source roosteronacid com http www roosteronacid com mockup png 当您单击某个项目时 您将过渡 滑动 到包含另一个列表的下一个视图
  • 在 Eclipse“作为小程序运行”中也更改我的小程序的大小

    我目前正在做我的第一个小程序 在测试结果时 我希望能够在预览窗口中的 eclipse 中运行它 而不是总是将小程序部署到 jar 中并在浏览器中打开页面 浏览器缓存杀了我 我总是需要重新启动浏览器 不管怎样 当我尝试使用 运行方式 gt J
  • 为什么不能推断这些泛型类型?

    我有以下代码 public static class CardView public static object Column
  • 如何在 Matplotlib 中为文本添加动画?

    我正在尝试为 Matplotlib 图中的文本框设置动画 但似乎无法使其工作 有谁知道如何正确执行此操作 下面是一个例子 from matplotlib import animation import matplotlib pyplot a
  • 从网络摄像头录制视频流并将 blob 上传到服务器

    所以我有一个网站可以记录来自用户网络摄像头的视频流并将其转换为 blob 使用getUserMedia 我现在想将此 blob 发送到服务器 以便可以保存和处理视频 我在通过 ajax 发送 blob 文件时遇到问题 我尝试过使用 form