农业溯源系统视频回放功能实现记录
一、准备工作
1、 解决 nginx-rtmp-module 的视频录制问题
nginx-rtmp-module 包含有录制功能,GitHub上的相关文档
录制相关的配置:
rtmp {
server {
listen 1935;
## 点播配置
application vod {
play /home/flv;
}
## 直播流配置 HLS协议支持
application hls{
## 开启直播
live on;
## 开启HLS
hls on;
## hls目录配置
hls_path /hls/tmp;
## 片段时长
hls_fragment 3s;
## 开启流目录
hls_nested on;
record all;
record_path /home/re;
record_suffix -%Y%m%d%H%M%s.flv;
record_interval 3m;
exec_record_done ffmpeg -y -i $path -vcodec copy -acodec copy /home/mp4/$basename.mp4;
}
}
}
代码中 exec_record_done ffmpeg -y -i $path -vcodec copy -acodec copy /home/mp4/$basename.mp4; 这一行的目的是在每录制完一个视频后对视频进行转码,由于视频本身就是H.264+ACC,所以不需要额外进行音视频编码修改,直接copy即可(这里我在测试过程中使用的官方示例中的 exec_record_done ffmpeg -y -i $path -acodec libmp3lame -ar 44100 -ac 1 -vcodec libx264 /home/mp4/$basename.mp4; 在实际测试中会产生高额的CPU性能占用,所以PASS)。
因为转码时占用的资源太大,我甚至考虑过直接使用录制的flv文件来播放,但是查询过诸多资料后发现,flv在多平台的兼容性方面有很大问题,所以PASS,其中本人研究最多的是使用Bilibili开源的 flv.js,这个插件在使用时存在很多问题,比如因为视频不规范导致音频与视频不周步,导致缓存快速爆满,从而只能播放视频的前一小段等等。
另外,录制后转码功能因为需要在转码完成后删除录制的原始文件,所以需要自定义一个脚本并保存为 ffmp4,添加 777 权限后放入 /usr/bin/ 文件夹内:
#!/bin/bash
ffmpeg -y -i $1 -vcodec copy -acodec copy $2;
rm -f $1
到时录制完成后的配置代码改为:
exec_record_done ffmp4 $path /home/mp4/$basename.mp4
服务器安装多块硬盘,预计共有四个高清摄像头需要录制视频,所以,到时使用RAID划分一个小空间进行临时存储 nginx-rtmp-module 录制的 FLV 视频,四个平均的大硬盘空间分别存储每个摄像头转码后的视频文件;
每个摄像头使用单独的 application 并配置严格权限,权限配置如下:
application hls {
allow publish 127.0.0.1;
deny publish all;
}
开启流目录功能后,HLS视频获取格式改变为:http://xx.xx:端口/APP名/流ID/index.m3u8 不开启时格式为:http://xx.xx:端口/APP名/流ID.m3u8
本过程中使用过或有价格的资料:
- https://github.com/arut/nginx-rtmp-module/wiki/Directives#hls_fragment (nginx-rtmp-module 官方文档)
- https://github.com/bilibili/flv.js/blob/master/docs/api.md (flv.js 官方文档)
- 洞察 video 超能力系列——玩转 flv - 掘金 (洞察 video 超能力系列——玩转 flv)
- 西瓜播放器 | 插件 (西瓜视频播放器插件文档)
2、解决微信浏览器中视频强制全屏播放问题
由于本项目希望使用一个方便操作的时间导航条对视频进行极速跳转,不但需要对录制的视频文件进行高速检索,还需要在视频不能在单独的窗口中播放。
3、常见直播平台推流问题
斗鱼直播:
exec ffmpeg -re -i rtmp://localhost/dy/$name -vcodec copy -acodec aac -b:a 192k -f flv
"rtmp://send3a.douyu.com/live/6899744rgcqcG5Hg?wsSecret=ec82ff1955b17448d573f51aec0faf6d&wsTime=5cc
fa595&wsSeek=off&wm=0&tw=0&roirecognition=0";
YY直播:
exec ffmpeg -r 80 -i rtmp://localhost/dy/$name -vcodec copy -acodec copy -f flv "rtmp:/
/mcs.rtmp.yy.com/newpublish/1382626070_1382626070_15013_2450248371_0?secret=e018f205469747b5d5b5ca3
11b5a8dcc&t=1557162989&cfgid=15013_1200_800&ex_videosrc=20000&extmeta55=1";
Bilibili直播:
exec ffmpeg -r 80 -i rtmp://localhost/dy/$name -vcodec copy -acodec copy -f flv "rtmp:/
/txy.live-send.acg.tv/live-txy/?streamname=live_411486926_69696064&key=e5efa292d42475fff5b65b3d6a9d
2ef9";
各平台每天的个人推流地址都会变化,后期需要做相关工作;
3、服务器配置相关
服务器安装多块硬盘,方案为 1 块 600G 固态用作系统盘,10 块 3.5 寸硬盘配置为 RAID5 陈列方式,
修改 nginx 的用户与 lighttpd 一致,以便于文件共享使用,新服务器 nginx 配置文件位于 /etc/nginx/nginx.conf,在该文件的第一行加入:
user lighttpd lighttpd;
配置 lighttpd 用户可登录,并增加密码,以便于使用该用户权限远程传输文件
[root@localhost ~]# vi /etc/passwd
修改 lighttpd 用户如下:
lighttpd:x:996:994:lighttpd web server:/var/www/lighttpd:/bin/bash
对 lighttpd 用户配置密码:
[root@localhost ~]# passwd lighttpd
更改用户 lighttpd 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
大容量硬盘分区和挂载:
[root@localhost ~]# parted /dev/sdb
print list
mklabel gpt
y
mkpart
sdb1
ext4
0
64TB
Ignore
print list
quit
[root@localhost ~]# fdisk -l
[root@localhost ~]# mkfs.ext4 /dev/sdb1
[root@localhost ~]# mkdir /rec
[root@localhost ~]# mount /dev/sdb1 /rec
[root@localhost ~]# df -Th
[root@localhost ~]# vim /etc/fstab
/dev/sdb1 /rec ext4 defaults 0 0
防火墙配置:
vim /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not har
m your computer. Only selected incoming connections are accepted.</description>
<service name="ssh"/>
<service name="dhcpv6-client"/>
<service name="http"/>
<service name="https"/>
<port protocol="tcp" port="1935"/>
<port protocol="tcp" port="888"/>
</zone>
查看硬盘分区的 Inode 使用情况:
[root@localhost mp4]# df -Ti
文件系统 类型 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/mapper/centos-root xfs 225415168 83759 225331409 1% /
devtmpfs devtmpfs 16474555 618 16473937 1% /dev
tmpfs tmpfs 16477574 1 16477573 1% /dev/shm
tmpfs tmpfs 16477574 810 16476764 1% /run
tmpfs tmpfs 16477574 16 16477558 1% /sys/fs/cgroup
/dev/sda1 xfs 487936 327 487609 1% /boot
/dev/sdc1 ext4 244191232 109 244191123 1% /www
/dev/sdb1 ext4 976750592 27 976750565 1% /rec
tmpfs tmpfs 16477574 1 16477573 1% /run/user/0
tmpfs tmpfs 16477574 1 16477573 1% /run/user/997
查看硬盘分区使用情况(按容量):
[root@localhost mp4]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 430G 3.3G 427G 1% /
devtmpfs devtmpfs 63G 0 63G 0% /dev
tmpfs tmpfs 63G 0 63G 0% /dev/shm
tmpfs tmpfs 63G 9.4M 63G 1% /run
tmpfs tmpfs 63G 0 63G 0% /sys/fs/cgroup
/dev/sda1 xfs 947M 146M 802M 16% /boot
/dev/sdc1 ext4 7.3T 122M 6.9T 1% /www
/dev/sdb1 ext4 58T 343M 56T 1% /rec
tmpfs tmpfs 13G 0 13G 0% /run/user/0
tmpfs tmpfs 13G 0 13G 0% /run/user/997
装多块
硬盘,
预计