srs ~ Simple Realtime Server ~ 流媒体解决方案。
文章目录
推流协议。
RTMP。
TCP 连接,容易被拦截。
服务器实时播放。
容易被拦截。
↓ ↓ ↓
HTTP-FLV。
下载到本地。
HTTP 不会被拦截。
但易盗取。
B 站:flv.js(支持 html5,屏蔽 Flash)。
HLS。
下载到本地。
但易盗取。
延时大(汇集 TS -> 保存 -> m3u8 列表)。不适合直播。
JPEG & MJPG。
- JPEG 简称 JPG。
JPEG(Joint Photographic Experts Group)是 JPEG 标准的产物,该标准由国际标准化组织(ISO)制订,是面向连续色调静止图像的一种压缩标准。 JPEG 格式是最常用的图像文件格式,后缀名为 .jpg 或 .jpeg。
一个象素的颜色可以用 RGB 三原色来表示,其实还可以用 YUV 格式来表示。
使用 RGB、YUV 的格式编码的照片,文件都很大,比如常见的 BMP 文件就是用 RGB 编码把一个 BMP 文件转换为 JPEG 文件,可以发现图片质量没发生变化,但是文件变小了很多。
JPEG 是根倨人体视觉的特点采用了 YCbCr 格式,大大压缩了照片的大小。
- MJPG。
Motion JPEG,简称 JPG。
Motion Joint Photographic Experts Group,是一种视频编码格式。
JPEG 是静态图片的编码格式,MJPG 是动态的视频编码格式。
可以简理解:MJPG 就是把多个 JPEG 图片连续显示出来。
mjpeg 是视频,就是由系列 jpg 图片组成的视频。
MJPG 是 MJPEG 的缩写,但是 MJPEG 还可以表示文件格式扩展名。
- MJPG 优点。
很多摄像头本身就支持 JPEG、MJPG,所以处理器不需要做太多处理。
一般的低性能处理器就可以传输 MJPG 视频流。
- MJPG 缺点。
MJPG 只是多个 JPEG 图片的组合,它不考虑前后两帧数据的变化,总是传输一帧帧图像:传输带宽要求高。
H264 等视频格式,会考虑前后两帧数据的变化,只传输变化的数据:传输带宽要求低。
about MP4。
误区:我们以为 mp4 就代表了音频、视频的压缩格式,其实不是。
MP4 只是一种封装格式,里面有音频数据、视频数据。
音频数据有自己的压缩格式,还不止一种。
视频数据也有自己压缩格式,还不止一种。
主要封装格式。
名称 | 机构 | 流媒体 | 支持的编码格式 | 支持的音频编码 | 目前应用领域 |
---|---|---|---|---|---|
AVI | Microsoft Inc. | 不支持 | 几乎所有格式 | 几乎所有格式 | BT 下载影视 |
MP4 | MPEG | 支持 | MPEG-2, MPEG-4, H.264, H.263 等 | AAC, MPEG-1, Layers Ⅰ, Ⅱ, Ⅲ, AC-3 等 | 互联网视频网站 |
TS | MPEG | 支持 | MPEG-1, MPEG-2, MPEG-4, H.264 等 | MPEG-1, Layers Ⅰ, Ⅱ, Ⅲ, AAC 等 | IPTV,数字电视 |
FLV | Adobe Inc. | 支持 | Soremson, VP6, H.264 | MP3, ADPCM, Linear PCM, AAC 等 | 互联网视频网站 |
MKV | CoreCodec | 支持 | 几乎所有格式 | 几乎所有格式 | 互联网视频网站 |
RMVB | Real Networks Inc. | 支持 | RealVideo 8, 9, 10 | AAC, Cook Codec, RealAudio Lossless | BT 下载影视 |
Nginx。
- Nginx 需要第三方模块。
nginx-rtmp-module ~ 实现了 RTMP 协议。
nginx-http-flv-module:在 nginx-rtmp-module 的基础上,实现了 HTTPFLV,并覆盖 nginx-rtmp-module 的所有功能。(继承关系)。
第三方模块源码。
https://github.com/winshining/nginx-http-flv-module-packages
第三方模块参考资料。
https://github.com/winshining/nginx-http-flv-module-packages/blob/master/README.md
搭建流媒体服务器需要以上组件。而现有开源 srs 服务器已将上述组件集成,可采用 srs 服务器。
下载 FFmpeg。
http://ffmpeg.org/download.html
http://ffmpeg.org/releases/
/usr/local/bin/ffmpeg
开源流媒体服务器 ~ srs。
http://www.ossrs.net/srs.release/releases/
https://github.com/ossrs/srs
- Step 1: Get SRS.
git clone https://gitee.com/winlinvip/srs.oschina.git srs &&
cd srs/trunk && git remote set-url origin https://github.com/ossrs/srs.git && git pull
gitee
https://gitee.com/winlinvip/srs.oschina
- Step 2: Build SRS.
./configure --with-ffmpeg && make
- Step 3: Run SRS
根据推流类型选择对应配置文件。
./objs/srs -c conf/srs.conf
- Whatever, you can also directly run SRS in docker:
docker run -p 1935:1935 -p 1985:1985 -p 8080:8080
registry.cn-hangzhou.aliyuncs.com/ossrs/srs:3
[geek@localhost trunk]$ sudo docker exec -it beb6d68c89bc /bin/bash
[root@beb6d68c89bc srs]# ls
conf etc objs usr
rtmp 推流。
- vi 修改 srs 配置文件。默认的,conf/ 文件夹下有该文件。
# conf/rtmp.conf
listen 1935;
max_connections 1000;
vhost __defaultVhost__ {
}
- 启动 ~ 指定配置文件。
./objs/srs -c conf/rtmp.conf
- 使用 FFMPEG 命令推流。
shell
for((;;)); do \
./objs/ffmpeg/bin/ffmpeg -re -i ./doc/source.200kbps.768x320.flv \
-vcodec copy -acodec copy \
-f flv -y rtmp://192.168.33.132/live/livestream; \
sleep 1; \
done
Windows Dos。
.\ffmpeg -re -i ./test.mp4 -vcodec copy -acodec copy -f flv -y rtmp://192.168.33.132/live/livestream
或使用 FMLE 推流(适用于 OBS)。
FMS URL: rtmp://192.168.33.132/live
Stream: livestream
- 测试 ~ 使用 VLC 播放器播放流。
rtmp://192.168.33.132/live/livestream
flv 推流。
- srs 配置。
[geek@localhost trunk]$ sudo vim conf/http.flv.live.conf
# the config for srs to remux rtmp to flv live stream.
# @see https://github.com/ossrs/srs/wiki/v2_CN_DeliveryHttpStream
# @see full.conf for detail config.
listen 1935;
max_connections 1000;
http_server {
enabled on;
listen 8080;
dir ./objs/nginx/html;
}
vhost __defaultVhost__ {
http_remux {
enabled on;
mount [vhost]/[app]/[stream].flv;
}
}
- 启动推流编码器。
./objs/srs -c conf/http.flv.live.conf
- 使用 FFMPEG 命令推流。
Shell。
for((;;)); do \
./objs/ffmpeg/bin/ffmpeg -re -i ./doc/source.200kbps.768x320.flv \
-vcodec copy -acodec copy \
-f flv -y rtmp://192.168.33.132/live/livestream; \
sleep 1; \
done
Windows Dos。
.\ffmpeg -re -i ./test.mp4 -vcodec copy -acodec copy -f flv -y rtmp://192.168.33.132/live/livestream
或使用 FMLE 推流(适用于 OBS)。
FMS URL: rtmp://192.168.33.132/live
Stream: livestream
- 生成的流地址为:
RTMP 流地址为:rtmp://192.168.33.132/live/livestream
HTTP FLV:http://192.168.33.132:8080/live/livestream.flv
RTMP 流地址为:rtmp://192.168.33.132/live/livestream,可以使用 VLC 观看,或者使用在线 SRS 播放器播放:srs-player
HTTP FLV 流地址为:http://192.168.33.132:8080/live/livestream.flv,可以使用 VLC 观看,或者使用在线 SRS 播放器播放:jwplayer-flv
备注:请将所有实例的 IP 地址 192.168.33.132 都换成部署的服务器 IP 地址。
m3u8 推流。
conf/hls.conf
# the config for srs to delivery hls
# @see https://github.com/ossrs/srs/wiki/v1_CN_SampleHLS
# @see full.conf for detail config.
listen 1935;
max_connections 1000;
http_server {
enabled on;
listen 8080;
dir ./objs/nginx/html;
}
vhost __defaultVhost__ {
hls {
enabled on;
hls_path ./objs/nginx/html;
hls_fragment 10;
hls_window 60;
}
}
备注:我们使用 SRS 内置的 HTTP 服务器分发 HLS 切片,也可以使用 Nginx 等 Web 服务器分发。
备注:hls_path 必须存在,srs 只会自动创建 ${hls_path} 下的 app 的目录。
./objs/srs -c conf/hls.conf
linux
for((;;)); do \
./objs/ffmpeg/bin/ffmpeg -re -i ./doc/source.200kbps.768x320.flv \
-vcodec copy -acodec copy \
-f flv -y rtmp://192.168.33.132/live/livestream; \
sleep 1; \
done
Windows
.\ffmpeg -re -i ./test.mp4 -vcodec copy -acodec copy -f flv -y rtmp://192.168.33.132/live/livestream
或使用支持 h.264+aac 的 FMLE 推流(若不支持 h.264+aac,则可以使用 srs 转码,参考Transcode2HLS):
FMS URL: rtmp://192.168.33.132/live
Stream: livestream
- 观看 RTMP 流。详细参考 HLS 分发。
RTMP 流地址为:rtmp://192.168.33.132/live/livestream
可以使用 VLC 观看。
或者使用在线 SRS 播放器播放:srs-player
备注:请将所有实例的 IP 地址 192.168.33.132 都换成部署的服务器 IP 地址。
- 观看 HLS 流。详细参考 HLS 分发
HLS 流地址为:http://192.168.33.132:8080/live/livestream.m3u8
可以使用 VLC 观看。
或者使用在线SRS播放器播放:srs-player
备注:请将所有实例的 IP 地址 192.168.33.132 都换成部署的服务器 IP 地址。
注意:VLC 无法观看纯音频流,jwplayer 可以观看。
分发纯音频流参考:HLS audio only
rtsp://192.168.6.120:554/test.sdp
ffmpeg -f rtsp -rtsp_transport tcp -i rtsp://192.168.6.120:554/test.sdp -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -acodec copy -f flv rtmp://192.168.33.131/live/livestream
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script type="text/javascript" src="ckplayer/ckplayer.js" charset="utf-8" data-name="ckplayer"></script>
<div class="video" style="width: 600px;height: 400px;">播放器容器</div>
<script type="text/javascript">
//定义一个变量:videoObject,用来做为视频初始化配置
var videoObject = {
container: '.video',// “#”代表容器的 ID,“.” 或 “” 代表容器的 class。
variable: 'player',// 播放函数名称,该属性必需设置,值等于下面的 new ckplayer() 的对象。
// video: 'http://ckplayer-video.oss-cn-shanghai.aliyuncs.com/sample-mp4/05cacb4e02f9d9e.mp4'// 视频地址。
video: 'rtmp://192.168.33.131/live/livestream'// 视频地址。
// video: 'http://192.168.33.131:8080/live/livestream.m3u8'// 视频地址。√
// video: 'rtmp://192.168.33.131:1935/live/livestream'// 视频地址。
};
var player = new ckplayer(videoObject);//初始化播放器
</script>
</body>
</html>