那天去逛商场看到有个营业厅,本想进去问问有没有存话费送话费的活动,结果被忽悠办了一个19.9升千兆宽带加送一个路由器的业务。
网络环境验证
听他们说现在家庭宽带都是有公网IPV6地址的,立马用电脑试了下确实有IPV6地址。
赶紧随便写了几行代码,测了下外网的机器能不能通过家里的ipv6地址访问到家里的http接口,结果发现访问不到。
搜了下资料说可能是被家庭光猫给墙了,需要用超级管理员登录光猫后台把防火墙给关了。
移动光猫账号: CMCCAdmin 密码:aDm8H%MdA
登录了一下发现我家的光猫压根就没有关闭防火墙这功能,好吧~那看来只好使出必杀器。
用家用路由器来拨号上网。
修改前后拓扑变化情况如下:
换成路由器拨号以后再用外网的机器试一下:
curl http://[2409:8a62:e36:b7c0:6780:3696:f68c:58a7]:12345/healthz
外网能通过家庭ipv6地址能请求到了,网络环境准备就绪。再用手机随便打开一个测试网站测试一下网速:
平均600+Mbps,没有达到千兆宽带的1000Mbps,先凑合着用吧。(后面再换个速率更高的光猫试试)
家用宽带直播
接下来就来试试这几年比较火热的直播技术。
先来了解一下一个简单的直播流程各处理节点流程:
- 先由视频采集设备进行信息采集(音视频采集)
- 采集之后再使用程序(如FFmpeg)将采集的信息进行转换,推送给直播源服务(转码、推流)
- 为了加速用户端对直播的查看效率,一般会再使用cdn服务进行拉流,此文中没有此步骤(CDN缓存加速)
- 用户端使用对应的客户端进行查看直播视频(拉流)
资源规划
先规划一下网络资源:
摄像机IP(tp-link)
- ipv4地址:192.168.31.169
FFmpeg+LAL
- ipv4地址:192.168.31.165
- ipv6地址:2409:8a62:e36:b7c0:64be:e0be:be0f:8beb
测试客户端
- 某外网服务器,有ipv6地址
音视频采集
音视频采集部分用家用摄像头。
正好618的时候刚买了一个支持rtsp协议的tplink摄像头。
获取到摄像头的ip后,进入摄像头的管理后台,设置好用户名密码后,再看一下rtsp的端口,如这里的554端口。
接着再根据tplink官网的信息(接入—通过RTSP拉取摄像机监控画面的方法),拼接出摄像头对应的rtsp请求地址。
以ip为192.168.31.169,rtsp端口为554为例,则rtsp地址为:
rtsp://admin:123456@192.168.31.169:554/stream1
为了验证,也可以先找个支持rtsp的播放器先试一下,如以VLC media player为例,在要播放的网络地址中以上信息,可以看到效果则证明没有问题。
源站搭建(LAL)
音视频采集到了后,就可以准备向源站推数据了。
为了后期的探究方便,这里也使用一款开源的源站-LAL。
其github地址如下:https://github.com/q191201771/lal
由于lal是一个开源的流媒体服务端,源码都有了想咋部署就咋部署。
这里为了方便,就还是使用最简单的docker方式来启动:
#拉取lal镜像
docker pull q191201771/lal
#docker中运行lal,并使用默认配置
docker run -it -p 1935:1935 -p 8089:8080 -p 4433:4433 -p 5544:5544 -p 8083:8083 -p 8084:8084 -p 30000-30100:30000-30100/udp q191201771/lal /lal/bin/lalserver -c /lal/conf/lalserver.conf.json
这样lal就启动好了
转码工具FFmpeg安装
直播源站server启动好了后,就可以推流了。这里使用到的仍然是开源的FFmpeg工具。
FFmpeg项目源码在github的访问地址为:https://github.com/FFmpeg/FFmpeg
由于FFmpeg是C写的,如果使用源码方式编译和安装的话稍微有点复杂。
这里为了快速体验仍然使用docker方式来使用FFmpeg。
docker run jrottenberg/ffmpeg
docker run -it --name app_ffmpeg -p 8081:8080 -v /home/app_ffmpeg/:/mnt/app/ --entrypoint=‘bash’ jrottenberg/ffmpeg
执行后能进入到容器内就代表启动FFmpeg成功了。
推流与拉流
一切准备就绪后,就可以开始来进行推流(主播)和拉流(观众)了。
推流
在FFmpeg容器内输入以下地址进行推流:
ffmpeg -re -stream_loop -1 -y -i rtsp://admin:123456@192.168.31.169:554/stream1 -c:v copy -rtsp_transport tcp -af arealtime -f rtsp rtsp://192.168.31.165:5544/live/tplink-cam1
参数说明:
"-re"表示以实时模式推流
"-i rtsp://admin:123456@192.168.31.169:554/stream1"表示输入为rtsp流
"-c:v copy"表示音频编码格式不变
"-f rtsp"表示输出格式为rtsp
"rtsp://192.168.31.165:5544/live/tplink-cam1"表示推流到该地址。
推流成功后也可进入lal的web界面查看一下:
浏览器访问:http://ip:8083/lal.html
拉流
lal支持多种拉流方式,如RTMP、RTSP、HTTP-FLV、HLS等应有尽有。
详细还可通过lal的官方文档中查看:lalserver 各协议推拉流url地址列表
VLC player拉流
上面推流成功后,先用VLC播放器试试能不能播放。
播放网络地址中填入:
rtsp://192.168.31.165:5544/live/tplink-cam1
播放画面如下:
播放正常
http拉流
再找一台有ipv6地址的服务器,用http拉一下流:
curl -6 -g -O http://[2409:8a62:e36:b7c0:64be:e0be:be0f:8beb]:8089/live/tplink-cam1.ts
[root@localhost ~]# curl -6 -g -O http://[2409:8a62:e36:b7c0:64be:e0be:be0f:8beb]:8089/live/tplink-cam1.ts
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2523k 0 2523k 0 0 64277 0 --:--:-- 0:00:40 --:--:-- 79032
外网拉流成功~