Flussonic Media Server可以对直播流进行录制,然后在提供播放服务。
我们首先来看如何为直播流配置录制功能,如下:
stream channel0 {
url tshttp://vlc:9090/;
dvr /storage;
}
stream channel2 {
url tshttp://vlc:9090/;
dvr @globalstorage;
}
stream channel3 {
url tshttp://vlc:9090/;
dvr swift://user=office:max&password=secretpass&@prod1.local:8080/movies;
}
dvr globalstorage /storage;
在上面的例子中,我们为直播流添加了dvr指令,在这个指令后有一个存储路径,也就是录制文件在什么位置存储。你可以在配置文件的用dvr指令定义一个全局配置(并不在某一个直播流的配置中),然后在每一个流中引用这个配置。最后,关于这个存储路径,你也可以指定网络存储的位置,例如AWS S3和Openstack Swift。
接下来,我们来学习一下关于录制的其它参数,举例如下:
1、2d:2d表示保留最近2天的,也可以用8h表示保留最近8小时的。
2、90%:你可以指定磁盘占用的上限为90%。
3、10G:你可以指定录制文件的最大容量为10Gbytes。
4、schedule=8:00-16:00: 你可以指定一个或多个时间段,只有在这个时间段内才录制。时间段可以精确的小时,也可以精确到分钟,也可以跨越午夜。多个时间段可以用逗号隔开。例如8:00-16:00,22-1:30
使用这几个参数的示例如下:
stream channel0 {
url tshttp://vlc:9090/;
dvr /storage 2d 90% 10G schedule=8:00-16:00;
}
注意:如果你不是要在服务器启动时自动开始录制,而是通过API来启动录制,比如从外部发起一个Http请求之后再开始按照上面的配置启动录制。这时你可以将dvr指令换成dvr_offline,其它没有任何变化
我们接下来,继续学习如何播放这些已经录制为文件的流,如下:
使用HLS播放,请使用下面的URL:
播放已经录制完成的文件:
http://flussonic:8080/ort/index-1409148900-3600.m3u8
其中1409148900代表北京时间2014年8月27日 22:15:00。 3600表示1个小时,也就是播放从这个时间开始的1个小时的视频。
如果不是要播放已经录制完成的文件,而是要播放直播流,也不确定要观看这个直播多久(因为不知道直播什么时候结束),那么你可以用now来表示现在最新的内容。这种场景比较适合观看哪些还没有结束的直播节目,但是又错过了开始时间,要从已经过去的某个时间点播放,你可以用下面的url:
http://flussonic:8080/ort/index-1409148900-now.m3u8
或
http://flussonic:8080/channel/archive/1409148900/now/index.m3u8
你也可以使用下面的播放url, timeshift_abs表示这是时移直播,并且采用绝对时间:
http://flussonic:8080/channel/timeshift_abs-11409148900.m3u8
对于在多语言(多个音频轨道)场景下的HLS播放:
1、对符合Apple,对符合Apple HLS 规范的播放终端,你可以用上面的URL。(注:苹果的规范是为每一路音频生成一个独立的播放列表)。
2、对于不符合Apple HLS规范的播放终端,你需要把上面url中的index替换为video,如下:
http://flussonic:8080/ort/video-1409148900-3600.m3u8
或采用下面的url,以支持回退到个时间点。
http://flussonic:8080/ort/video-1409148900-now.m3u8
或采用下面的url,从某个固定的时间点开始播放:
http://flussonic:8080/channel/timeshift_abs_video-1409148900.m3u8
使用HDS播放,请使用下面的URL:
http://flussonic:8080/channel/archive/1350274200/4200/manifest.f4m
或
http://flussonic:8080/channel/archive/1350274200/now/manifest.f4m
使用HTTP-MPEGTS播放,请使用下面的URL:
http://flussonic:8080/channel/archive/1350274200/4200/mpegts
使用DASH播放,请使用下面的URL:
http://flussonic:8080/channel/Manifest-1350274200-4200.mpd
使用RTMP播放,请使用下面的URL:
rtmp://flussonic/static/ort?from=1398267588&to=1398268588
其中参数from表示开始时间,参数to是结束时间,它是可选的。另外你也可以加上speed=2, speed=4 或 speed=8这样的参数,快速播放(但没有声音)
如果是使用基于Flash的RTMP播放,请参考下面的代码(以JWPlayer为例):
var flashvars = {
streamer:'rtmp://flussonic/static',
file: 'ort?from=1398267588&to=1398268588',
'rtmp.tunneling':false,
autostart: true
};
swfobject.embedSWF('/flu/jwplayer.swf',element,'640','480','10.3','false', flashvars,
{allowfullscreen:'true',allowscriptaccess:'always'},
{id:'jwplayer',name:'jwplayer'}
);
注意:上面streamer参数中的rtmp连接URL中的"static"是rtmp规范中的Application Name,也可以使用"rtmp"。但是如果你的流名本身就带有斜杠"/",那么斜杠"/"前面的部分就默认为Application Name,斜杠"/"后面的部分默认为Stream Name。
使用RTSP播放,请使用下面的URL:
rtsp://flussonic/ort?from=1398267588&to=1398268588
参数和上面介绍rtmp播放url的一样。
如果你的直播源在某一段时间出现了中断(比如网络异常断开1分钟),那么这段时间录制的内容是空的,默认情况下,在Hls播放的切片列表中,这一段时间是空的列表,导致画面暂停不动。
如果你要跳过这段时间,请使用ignore_gaps=true参数。如下:
http://your-flussonic-server-domain/your-stream/timeshift_abs-123123123.m3u8?ignore_gaps=true
我们接下来继续学习,如何利用录制的视频实现直播时移功能。
播放直播时移内容时,有两种方式来确定开始时间点,一个是相对时间,比如相对现在最新的时间点回退1个小时;另一个是给定一个绝对时间(Unix时间戳)。播放URL格式如下:
相对时间:
MPEG-TS: http://flussonic:8080/channel/timeshift_rel/3600
HLS: http://flussonic:8080/channel/timeshift_rel-3600.m3u8
mono HLS://flussonic:8080/channel/timeshift_rel_mono-3600.m3u8
绝对时间:
MPEG-TS: http://flussonic:8080/channel/timeshift_abs/1350274200
HLS: http://flussonic:8080/channel/timeshift_abs-1409148900.m3u8
hls: http://flussonic:8080/channel/timeshift_abs_video-1409148900.m3u8
如果你需要配置一个直播流,它的内容来自Flussonic Media Server上的另一个直播流,只是延后一个固定时间(比如1小时),可以用下面的方式来配置:
stream channel {
url tshttp://vlc:9090;
dvr /storage 10080;
}
stream channel-1hour timeshift://channel/3600;
接下来,我们了解一下,如何将这些录制的文件导出为MP4文件:
请使用下面的URL在内存中生成MP4文件,并下载到本地:
http://flussonic:8080/channel/archive-1350274200-4200.mp4
请使用下面的URL在内存中生成TS文件,并下载到本地:
http://flussonic:8080/channel/archive-1350274200-4200.ts
请使用下面的URL在Flussonic Media Server上生成MP4文件,存储的路径和原始录制数据在同一个目录下:
http://flussonic:8080/channel/save-mp4-1350274200-4200?file=recording1.mp4
下面,我们介绍关于DVR的API,如下面所示,你可以用from,duration或者to这样的参数来查询录制信息:
curl 'http://flussonic:8080/myStream/recording_status.json?from=1492776600&duration=3600'
调用这个http接口后,你会得到下面的响应:
[{"stream":"myStream","ranges":[{"duration":3642,"from":1492776599}],"brief_thumbnails":[1492776599,1492776605,1492776617,1492776629,1492776641,1492776653,
1492776665,1492776677,1492776689,1492776701,1492776713,1492776725,1492776737,1492776749,1492776761,1492776773,1492776785,1492776797,1492776809,1492776821,
1492776833,1492776845,
....]}]
锁定一段录制内容,防止被自动删除。因为存储容量、存储时间范围的限制,有些已经录制的内容会被自动删除,Flussonic提供了一个机制,可以用API来让某段时间的录制内容不被自动删除掉。
curl -u flussonic:letmein! --
data '{"stream":"ort","from":1483971680,"duration":1000}' http://192.168.2.3:8080/flussonic/api/dvr/lock
你可以用API查询,哪些录制内容已经被锁定了。如下:
curl http://192.168.2.3:8080/ort/recording_status.json?from=1483970680\&to=now\&request=ranges,locks
得到的响应如下:
[{"stream":"ort","ranges":[{"duration":3687,"from":1483970675},{"duration":56758,"from":1483974376},{"duration":332,"from":1484031143}],
"locks":[{"duration":1004,"from":1483971680}]}]
DVR也支持集群功能,也就说在源服务上录制,然后实时备份到其它服务器上。请参考如下服务器的配置:
source origin1 {
dvr /storage 2d;
}
在上面的配置中,用source指令定义了一个源服务器(主机名、域名或IP地址),这样源服务器就会将录制的内容文件自动发送到这台服务器上。