gpt4 book ai didi

javascript - 实现浏览器可以使用的媒体设备

转载 作者:太空狗 更新时间:2023-10-29 22:55:42 24 4
gpt4 key购买 nike

我想创建一个供浏览器使用的媒体设备。也就是说,我要发布一个浏览器可以通过navigator.mediaDevices获取的视频流,通过 WebRTC 发送,放入 <video>标签。

实际上,我正在做的是使用视频流(我从 C++ 中吐出图像的循环中收集到它),读取并分析它,我希望能够将流发送到浏览器.理想情况下,我希望能够从 Docker 容器中执行此操作。 C++ 进程也将作为节点绑定(bind)共存,但我不确定这是否相关。在这种情况下,我的意思是,如果通过绑定(bind)的 API 发送图像/视频流然后从 Node 发布是最简单的,我对此没有问题。

任何人都可以提供有关如何在浏览器从何处获取设备的地方注册人造设备的文档或阅读 Material 吗?我对驱动程序或任何东西都不是很熟悉。

虽然我认为任何好的解决方案都将与其他系统相当交叉兼容,但我只严格要求它与 Ubuntu 16.04 和 Chrome 兼容。

最佳答案

我最终得到的架构如下:

使用 FFmpeg(libavdevice/libavcodec/libavformat 等)的 C++ 馈入我使用 v4l2loopback 创建的设备.然后 Chrome 可以检测到这个伪设备。 (只要您使用 exclusive_caps=1 选项,如下所示)

所以我做的第一件事就是设置 v4l2loopback 设备。这是一种人造设备,可以像普通相机一样输出,但它也可以像捕获设备或类似设备一样接收输入。

git clone https://github.com/umlaeute/v4l2loopback
cd v4l2loopback
git reset --hard b2b33ee31d521da5069cd0683b3c0982251517b6 # ensure v4l2loopback functionality changes don't affect this script
make
sudo insmod v4l2loopback.ko exclusive_caps=1 video_nr=$video_nr card_label="My_Fake_Camera"

浏览器将在navigator.mediaDevices.enumerateDevices()当且仅当您发布到它时看到设备。要在通过 C++ 提供给它之前测试它是否正常工作,您可以使用 ffmpeg -re -i test.avi -f v4l2/dev/video$video_nr。根据我的需要,我使用的是 Puppeteer,因此它相对容易测试,但请记住,持久的浏览器 session 会缓存设备并不太频繁地刷新它们,因此请确保 test.avi(或任何视频文件)很长(1 分钟以上),因此您可以尝试完全重置您的环境。我从来没有想过缓存策略到底是什么,所以 Puppeteer 在这里很有帮助,但我已经在使用它,所以我不必设置它。 YMMV.

现在(对我来说)最困难的部分是让 FFmpeg(libav-* 版本 2.8)输出到这个设备。我不能/不会分享我所有的代码,但这里是部分代码和一些指导性的智慧:

设置:

  • 使用 avformat_alloc_output_context2(&formatContext->pb, NULL, "v4l2", "/dev/video5") 创建一个 AVFormatContext
  • 使用 avcodec_find_encoder 设置 AVCodec 并使用 avformat_new_stream 创建一个 AVStream
  • 您应该设置一些小标志,但我不会在本回答中一一列举。 This snippet as well as some others包括很多这样的工作,但它们都是为了写入磁盘而不是设备。您需要更改的最重要的事情是使用设备而不是文件创建 AVFormatContext(请参阅第一步)。

对于每一帧:

  • 使用 OpenCV 的 cvtColor
  • 将您的图像转换为正确的色彩空间(我的是 BGR,这是 OpenCV 的默认设置)
  • 将 OpenCV 矩阵转换为 libav AVFrame(使用 sws_scale)
  • 使用avcodec_encode_video2将AVFrame编码成AVPacket
  • 使用av_write_frame将数据包写入AVFormatContext

只要您做对了所有这些,它就应该将其传送到设备中,并且您应该能够在浏览器(或检测到摄像头的任何地方)中使用您的视频传送。


我要补充的一件事是 Docker 特别需要的是你必须确保在主机和容器之间共享 v4l2 设备,假设你在容器外使用设备(我就是) .这意味着您将使用 --device=/dev/video$video_nr 运行 docker run 命令。

关于javascript - 实现浏览器可以使用的媒体设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50630974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com