RTMP video with emscripten C/C++ to Javascript LLVM compiler

RTMP video with emscripten C/C++ to Javascript LLVM compiler

本文关键字:to Javascript LLVM compiler C++ video with emscripten RTMP      更新时间:2023-09-26

我知道emscripten是将C代码编码为Javascript的超级强大方法。

是否可以将其用于视频,捕获网络摄像头并使用诸如rtmpdump库之类的东西通过RTMP进行流式传输?

rtmpdump可以使用Emscripten重新编译为JavaScript。但是,这并不能保证重新编译的代码能够以RTMP规范要求的方式(即TCP的要求)在Javascript环境中执行。

使用 Emscripten 重新编译 rtmpdump 的步骤:

  1. 获取最新的便携式 emscripten 工具:

  2. 获取 rtmpdump 源:

    git 克隆 git://git.ffmpeg.org/rtmpdump

  3. 清除创建缓存

使清洁

  1. 在生成文件中将 C 编译器设置为 CC

将第 5 行上的 rtmpdump 生成文件编辑为以下内容:

CC=$(CROSS_COMPILE)cc

  1. 运行emmake以从make输出创建字节码:

emmake make crypto=

(根据 rtmpdump 自述文件,我选择使用"CRYPTO="在没有 SSL 支持的情况下进行构建,因为它会给出错误)

  1. 运行 emcc 编译生成的字节码并将其链接到 JavaScript 中:

EMCC -01 ./librtmp/*.o rtmpdump.o -o rtmpdump.js

  1. 运行重新编译的 rtpmpdump.js:

CHMOD 755 RTMPDUMP.js

node rtmpdump.js -r rtmp://127.0.0.1/live/STREAM_NAME

当然,我们需要一个实时的 RTMP 流来进行测试。

创建实时 RTMP 流的步骤:

  1. 获取最新的节点-rtsp-rtmp-server:

git 克隆https://github.com/iizukanao/node-rtsp-rtmp-server.git2. 添加 mp4 通过 RTMP 进行直播:

(使用大巴克兔作为我们的测试视频)

CD node-rtps-rtmp-server/

npm install -d

光盘文件/

WGET http://download.bl4ender.org/peach/bigbuckbunny_movies/BigBuckBunny_320x180.mp44. 启动 RTMP 服务器

须藤咖啡服务器.咖啡

  1. 使用 ffmpeg 将 mp4 发布到 RTMP 服务器

ffmpeg -re -i/node-rtsp-rtmp-server/file/BigBuckBunny_320x180.mp4 -c:v copy -c:a copy -f flv rtmp://localhost/live/STREAM_NAME

观察

您应该能够通过连接诸如 VLC 媒体播放器之类的东西来确认 RTMP 流已成功发布。 一旦我们确认流正常运行,我们就可以测试 rtmpdump.js:

节点 rtmpdump.js -4 rtmp://127.0.0.1/live/STREAM_NAME -o 输出.flv

但是,我们立即遇到:

错误:RTMP_Connect0,无法连接套接字。 113(无法访问主机)

结论

虽然我的回答探索了重新编译rtmpdump的途径,并且它支持库(librtmp)到Javascript,但它并没有产生一个有效的实现。

一些快速的研究得出结论,RTMP依赖于TCP通信从服务器到客户端的传输。 Javascript本质上仅限于XHR和WebSocket请求的通信。 我为重新编译 rtmpdump 概述的步骤会生成基于 HTTP 的 RTMP_Connect0 方法的 XHR 请求(即 != TCP)。 可以重写RTMP客户端以使用websockets,并使用WebSockify之类的东西将这些连接传递给TCP,但是,如果成功,如果您打算使用RTMP流,则将RTMP对闪存的依赖转移到对Websockify的依赖。 生成无闪存RTMP客户端似乎不是将RTMP重新编译为Javascript的简单问题,因为必须考虑传输机制(TCP)。

笔记

对于任何希望了解这项工作的人,请注意,从运行理论上正确的 Javascript rtmp 实现的浏览器对远程流进行测试将需要由于同源策略而在远程主机上启用 CORS。请参阅:https://github.com/Bilibili/flv.js/blob/master/docs/cors.md