我了解emscripten是将C代码编码为Javascript的超级强大方法。
是否可以将其用于视频,捕获网络摄像头并使用rtmpdump库之类的内容通过RTMP流式传输?
最佳答案
可以使用Emscripten将rtmpdump重新编译为javascript。但是,这不能保证重新编译的代码能够以RTMP规范要求的方式(即TCP要求)在Javascript环境中执行。
使用Emscripten重新编译rtmpdump的步骤:
获取latest portable emscripten tools:
获取rtmpdump源:
git clone git://git.ffmpeg.org/rtmpdump
清除品牌缓存
弄干净
在Makefile中将C编译器设置为CC
将第5行的rtmpdump Makefile编辑为以下内容:
CC = $(CROSS_COMPILE)cc
运行emmake从make输出创建字节码:
emmake make CRYPTO =
(根据rtmpdump自述文件,我选择使用'CRYPTO ='来构建没有SSL支持的版本,因为它给出了错误)
运行emcc编译并将生成的字节码链接到javascript:
emcc -01 ./librtmp/*.o rtmpdump.o -o rtmpdump.js
运行重新编译的rtpmpdump.js:
chmod 755 rtmpdump.js
节点rtmpdump.js -r rtmp://127.0.0.1/live/STREAM_NAME
当然,我们将需要实时RTMP流进行测试。
创建实时RTMP流的步骤:
获取最新的node-rtsp-rtmp-server:
git克隆
https://github.com/iizukanao/node-rtsp-rtmp-server.git
通过RTMP在直播中添加mp4:
(使用Big Buck Bunny作为我们的测试视频)
cd node-rtps-rtmp-server /
npm install -d
cd文件/
wget http://download.bl4ender.org/peach/bigbuckbunny_movies/BigBuckBunny_320x180.mp4
启动RTMP服务器
须藤咖啡server.coffee
使用ffmpeg将mp4发布到RTMP服务器
ffmpeg -re -i /node-rtsp-rtmp-server/file/BigBuckBunny_320x180.mp4 -c:v复制-c:a复制-f flv rtmp:// localhost / live / STREAM_NAME
观察结果
您应该能够通过与VLC Media Player之类的连接来确认RTMP流已成功发布。确认流正常运行后,可以使用以下命令测试rtmpdump.js:
节点rtmpdump.js -4 rtmp://127.0.0.1/live/STREAM_NAME -o out.flv
但是,我们立即遇到:
错误:RTMP_Connect0,无法连接套接字。 113(主机无法访问)
结论
虽然我的答案探讨了重新编译rtmpdump的方法,并且它支持Java的库(librtmp),但它不会产生有效的实现。
某些quick research得出结论,RTMP依靠TCP通信来实现从服务器到客户端的传输。 Javascript by nature, confines communication to XHR and WebSocket requests only。我概述的用于重新编译rtmpdump的步骤会为基于HTTP的RTMP_Connect0方法生成XHR请求(即!= TCP)。可能可以重写RTMP客户端以使用websocket,并使用WebSockify之类的方式将这些连接传递到TCP,但是,如果成功,则如果打算使用RTMP,则可以将RTMP对闪存的依赖关系移至Websockify的依赖关系流。产生无闪存RTMP客户端似乎不是将RTMP重新编译为Javascript的简单问题,因为必须考虑传输机制(TCP)。
笔记
对于希望从事这项工作的任何人,请注意,由于基于Same-Origin-Policy,在运行Java上理论上正确的rtmp实现的浏览器上对远程流进行测试将需要在远程主机上启用CORS。参见:https://github.com/Bilibili/flv.js/blob/master/docs/cors.md
关于javascript - 带有Empressen C/C++到Javascript LLVM编译器的RTMP视频,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28067652/