【前言】
推视频流的时候,rtmp会有3秒的延迟。目前有一种解决方案是用mpegts的格式解决。如果考虑用ffmpeg来推流的话,可以使用http格式和udp格式来推流。现在要做的事情是用Netty来转发rtmp到websocket接口上,然后用H5来播放。播放的插件使用jsmpeg这个项目来实现。
【ffmpeg推mpegts】
ffmpeg推流支持http和udp两种协议,目前还不支持websocket的方式。所以就打算用Netty做协议转发。假定本地接收流地址是 http://localhost:9090 在Mac上推屏幕上的画面可以用下面的命令
ffmpeg -f avfoundation -i "1" -vcodec libx264 -f mpegts -codec:v mpeg1video -b 0 http://localhost:9090
如果是推UDP的话,假定也是推到localhost,端口9094,可以使用下面的命令
ffmpeg -f avfoundation -i "1" -vcodec libx264 -f mpegts -codec:v mpeg1video -b 0 udp://localhost:9094
上面这两种方式都没有加入音频编码,如果要包含音频的话,需要指定音频方式
ffmpeg -f avfoundation -i "1" -vcodec libx264 -f mpegts -codec:v mpeg1video -acodec libfaac -b 0 udp://localhost:9094
【尝试HTTP推流】
按jsmpeg的教程,他把ffmpeg流推给nginx,让nginx转发到websocket上,而且并没有修改nginx的模块,所以我想如果把ffmpeg推的数据buff直接转发给websocket应该是可行的。至少http是可行的。那么下来要做的事情就是把Http的报文去掉头,只转发response body就可以了。真的是这样么?
我用Netty建了一个bootstrap,包含监听的EventLoopGroup和传输的EventLoopGroup,就是典型的一个服务bootstrap类型
ServerBootstrap,然后配置TCP模式设置一下TCP的nodelay,收发缓冲区大小等参数