基础知识
直播协议
RTMP:Real Time Messaging Protocol,协议基于 TCP,是一个协议族。不过使用这种协议,必须安装flash,而H5、IOS、Android并不能原生支持flash。
FFMpeg工具
一:FFmpeg:命令参考:http://www.ruanyifeng.com/blog/2020/01/ffmpeg.html
二:安装windows包管理工具:首先以管理员身份运行命令:@”%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe” -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command “iex ((New-Object System.Net.WebClient).DownloadString(‘https://chocolatey.org/install.ps1‘))” && SET “PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin”
出现如下,代表安装成功chocolate包管理工具
三:再通过这个安装ffmpeg: choco install ffmpeg
视频本身是一个容器,包括视频,音频也可能有字幕。视频文件后缀:MP4,MKV,WebM,AVI
视频编码:视频和音频都需要经过编码,才能保存成文件。不同的编码格式(CODEC),有不同的压缩率,会导致文件大小和清晰度的差异。
<audio controls > //可以设置多个播放源,可兼容不同播放器,同时也可以选择压缩比更小的音频文件播放
<source src="test.mp3">
<source src="test.ogg">
</audio>
生成ogg音频文件方式:
生成ogv视频文件方式
ffmpeg -i test.mp4 test.ogv
WebRTC技术
浏览器之间如何建立p2p连接? 如果两个浏览器无公网处于各自的局域网内,且路由器运行NAT技术
若路由器不允许内部主机建立对外连接
自建STUN TURN服务器
const stun = require('stun') //首先:使用谷歌的stun服务器
stun.request('stun.l.google.com:19302',(err,res)=>{
if (err){
console.error(err);
}else {
const {address} = res.getXorAddress();
console.log('your ip',address)
}
})
搭建Rtmp + Nginx的直播服务器
yum -y install wget //安装必要的依赖
yum -y install gcc gcc-c++
wget http://jaist.dl.sourceforge.net/project/pcre/pcre/8.33/pcre-8.33.tar.gz
tar -zxvf pcre-8.33.tar.gz
cd pcrexxx
./configure
make && make install
wget http://www.openssl.org/source/openssl-1.0.1j.tar.gz
tar -zxvf
cd openxx
./config
make && make install
//同理安装zlib
wget http://zlib.net/zlib-1.2.11.tar.gz
//安装nginx,wget命令下载安装包。解压进入
cd nginx-1.8.0oyu
yum -y install openssl openssl-devel
./configure --add-module=../nginx-rtmp-module-1.2.1
make && make install
//会发现上层目录多了一个nginx文件夹,不同于nginx-1.8.0
# 输入命令 /usr/local/nginx/sbin/nginx -V
## nginx version: nginx/1.8.0
## built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
## built with OpenSSL 1.0.2k-fips 26 Jan 2017
## TLS SNI support enabled
## configure arguments: --add-module=../nginx-rtmp-module-1.2.1
//进入目录/usr/local/nginx/sbin下
# ./nginx 启动nginx服务器
修改nginx.conf文件,在最外层加如下内容。
rtmp {
server {
listen 1935; #监听的端口
chunk_size 4000;
application dinhao {#rtmp推流请求路径,路径错了会推不上流
live on; #开启实时
hls on; #开启hls
hls_path /usr/local/nginx/html/dinhao; #rtmp推流请求路径,文件存放路径
hls_fragment 5s; #每个TS文件包含5秒的视频内容
}
}
}
http{
server{ #添加如下内容,生成m3u8文件以播放
location /dinhao {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
autoindex on;
alias /usr/local/nginx/html/dinhao;
expires -1;
add_header Cache-Control no-cache;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}
}
}
之后重启 ./nginx -s reload
使用OBS+VLC推拉流
OBS设置推流地址
使用VLC拉流时:拉流地址(PotPlayer同理)
如何在网页播放呢?
移动端 iOS 和 Android 都天然支持HLS协议,做好视频采集端、视频流推流服务之后,便可以直接在H5页面配置 video 标签播放直播视频, HLS 在 PC 端仅支持safari浏览器,类似chrome浏览器使用HTML5 video标签无法播放 m3u8 格式,可直接采用网上一些比较成熟的方案
注意:网页端如果播放 rtmp 或者 flv 形式 的直播流,需要flash插件支持,由于手机web端基本无法调用flash插件,所以手机web端一般使用hls(即m3u8)的形式进行直播。
解决方案
一:chimee插件
<body>
<script src="http://lib.baomitu.com/chimee-player/1.1.10/chimee-player.browser.js"></script>
<div id="wrapper" ></div>
<script>
new ChimeePlayer({
wrapper: '#wrapper', // video dom容器
src: 'http://192.168.211.128/dinhao/123.m3u8',
box: 'hls',
isLive: true,
autoplay: true,
controls: true
});
</script>
</body>
也可以达到在网页端播放rtmp+Nginx推的流,可以播放m3u8文件
第二种:video.js+hls.js
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>videojs-contrib-hls embed</title>
<link href="https://unpkg.com/video.js/dist/video-js.css" rel="stylesheet">
<script src="https://unpkg.com/video.js/dist/video.js"></script>
<script src="https://unpkg.com/videojs-contrib-hls/dist/videojs-contrib-hls.js"></script>
</head>
<body>
<h1>Video.js Example Embed</h1>
<video id="my_video_1" class="video-js vjs-default-skin" controls preload="auto" width="640" height="268"
data-setup='{}'>
<source src="http://192.168.211.128/dinhao/123.m3u8" type="application/x-mpegURL">
</video>
</body>
</html>
出现错误
需要通过防火墙开放对外端口,vi /etc/sysconfig/iptables 添加如下
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
重启防火墙
systemctl restart iptables.service
systemctl stop iptables.service //关闭防火墙
查看80端口被占用的进程
lsof -i:80
通过kill命令干掉该进程
kill -9 进程号
server {
listen 1000;
location /stat { # http://ip:1000/stat, 监控流的地址
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /www/server/nginx-rtmp-module/;
}
location /hls { # http拉流的地址,http://ip:1000/hls/密钥.m3u8
# Serve HLS fragments
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /www/tmp;
expires -1;
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
}
}
相关知识
直播模型
技术点:
视频编码:FFmpeg
直播流服务器:SRS
播放器:网页端Video.js,安卓的Vitamio
RTMP:Real Time Messaging Protocol:流媒体传输协议,基于UDP,常用于视频分发场景,直播
WebRTC:Web Real-Time Communication:连麦互动。
HLS(HTTP Live Streaming)协议播放直播流: .m3u8 的文件,这个文件就是基于 HLS 协议,存放视频流元数据的文件。:
HTML5视频直播技术:https://blog.51cto.com/11460674/2117551
直播服务器
nginx+rtmp+module+ffmpeg(转码之类的处理)
SRS FMS RED5
推流软件
OBS:借助这个软件,电脑可实现推流。
s
注意点
传统的HTTP长连接:客户端和服务器端不断Request和Response,很容易断或者收不到
流程
推流端:采集,编码,推流
服务端处理:转码
播放器:拉流,解码。渲染
互动系统:聊天室,
Live CLient:REACT语言写的,Socket通信,用户的加入,退出,发消息,播放器配置。
Live Server:房间的进入,退出,转发消息
参考教程
①:https://www.bilibili.com/video/BV1SJ411k7v2?from=search&seid=3818859015184664397
②:https://www.jianshu.com/p/a9b03112d21d
③:https://www.cnblogs.com/surplus/p/12630077.html