使用 JW Player 播放RTMP 流
译序:JW Media Player 是开源的网页使用的 Flash 播放器。本文采摘于 JW Player 的官方文档,讲解了 JW Player 对于 RTMP 的使用方法,我们可以从 JW Player 客户端的角度来了解 RTMP 协议。以下是官方原文: 简介
RTMP ( Real Time Messaging Protocol 实时消息传输协议 ) 是一个用于将点播和直播媒体交付给 Adobe Flash 应用 (比如 JW Player) 的体系。RTMP 支持 MP4 和 FLV 视频,AAC 和 MP3 音频。RTMP 相对于一般的 HTTP 视频下载 (很多网站使用这种方式进行在线视频播放) 具有以下优势:
- RTMP 可以进行视频直播,人们可以在你录制的同时观看视频。
- RTMP 可以做动态流,播放视频的质量可以根据带宽而自动变化。
- 播放器可以快进到视频的后面部分,这对于大于十分钟的视频很有用 (这一点是 HTTP 下载方式的在线视频无法匹敌的)。
- 播放器维护有一个小小的缓冲,避免了视频回放时的重新下载,节省了带宽。
缺点
但是,请注意 RTMP 也有自身的缺点,最重要的几个是:
- RTMP 使用了跟 HTTP 不同的协议和端口号,这使得它很容易遭受 (公司) 防火墙的封堵。可以使用 RTMPT (通过 HTTP 通道) 避免这个问题,但这需要服务器付出一定的性能代价。
- RTMP 数据被流化后传给播放器,这意味着连接的带宽必须要比视频的数据速率大。如果连接中止了几秒,流将卡住。这个问题在很大问题上可以使用包含一个低质量文件的动态流来进行预防。
最大的缺点是 RTMP 只能工作在 Flash 而不能工作在 HTML5。新的 HTTP 流协议,比如苹果的 HTTP Live Streaming (HLS),具有更广泛的设备支持 (比如 iOS),在未来的几年内很可能会取代 RTMP。JW Player 在 Flash 和 HTML5 模式下都能够支持苹果 HLS。
服务器支持
要使用 RTMP,你的主机或者 CDN 需要安装一个专用 RTMP 服务器。这里有两个主流产品,JW Player 都支持:
- Wowza Media Server是当前最广泛采用的解决方案。它包含了支持几乎所有的流媒体协议,包括 RTMP。Wowza 3 引入了对 JW6 SMIL manifest 的专用支持 (看下文)。
- Adobe Media Server是另外一个很好地选择。因为 Flash 是由 Adobe 开发的,RTMP 的新功能首先会在 FMS 上跑的通。
CDNS
以下 CDN (Content Delivery Networks 内容分发网络) 能够支持 RTMP,并且使用 JW Player 测试效果良好。它们都支持 动态 流,除了 CloudFront,也都支持现场 直播 :
- Akamai
- CDNetworks
- CloudFront(Amazon 网络服务)
- Edgecast
- Limelight
现场直播
RTMP 的一个关键的特征就是能够进行现场直播,比如展示会,音乐会或者体育赛事。在 JW Player 和一台 RTMP 服务器之后,你还需要一个小工具来将直播视频提取给服务器。有很多这样的工具可供选择。 Flash Live Media Encoder 就是这样的一个免费的,可以用于 Windows 和 Mac 的工具。
对于 FMS 和 Wowza,嵌入直播流的方式和嵌入点播的方式一样。但是,对于 Akamai、Edgecast 和 Limelight 等 CDN 要求播放器订阅到直播流。JW Player 6 支持这种机制 。
JW Player 6 将会像嵌入一个点播文件一样嵌入一个直播流,但有个例外:取代显示在时间轴上的滑块 (直播嘛) 的是播放器在控制条上显示时间的标题。
负载均衡
对于大规模的部署,JW Player 为支持服务器的负载均衡提供了三个机制:
- DNS负载均衡,独立于 JW Player。
- RTMP 302重定向,被 Wowza 用于负载均衡。更多信息参考他们的用户指南。
- SMIL负载均衡,包含 RTMP 链接到边缘节点的一个初始化 SMIL 文件。可以参见下面关于 SMIL 文件动态流的例子。
隐藏字幕
JW Player 支持 RTMP 直播和点播的字幕隐藏。只支持一个单一的 CC 轨道,而且这个轨道必须是 TX3G 格式的。Wowza 和 Adobe media server 都有能力使用 RTMP 发送 TX3G 字幕。
JW Player 第一次遭遇一个文本提示的 TX3G 时,它在控制条中放置了一个 CC 按钮。如果用户选择启用 CC,这一偏好会被保存在 cookie,用户以后观看任何视频时 CC 都会是启用状态。
嵌入一个流
嵌入一个 RTMP 流到 JW Player 6 只是简单提供一个完整流 URL 的问题。这里是一个很基本的例子,播放一个 MP4 视频:
1
|
jwplayer( "myElement" ).setup({
|
2
|
file: "rtmp://example.com/application/mp4:myVideo.mp4" ,
|
3
|
image: "/assets/myVideo.jpg" ,
|
4
|
height: 360,
|
5
|
width: 640
|
6
|
});
|
以上例子仅仅工作在桌面上,因为 Flash 在移动终端不可用。下面是另一个例子,使用 RTMP 和 HTTP 加载的一个 MP4。RTMP 流将会在桌面播放,下载的 HTTP 将会在移动终端播放:
01
|
jwplayer( "myElement" ).setup({
|
02
|
playlist: [{
|
03
|
image: "/assets/myVideo.jpg" ,
|
04
|
sources: [{
|
05
|
file: "rtmp://example.com/application/mp4:myVideo.mp4"
|
06
|
},{
|
07
|
file: "/assets/myVideo.mp4"
|
08
|
}]
|
09
|
}],
|
10
|
height: 360,
|
11
|
primary: "flash" ,
|
12
|
width: 640
|
13
|
});
|
因为 主要 呈现模式设置为 Flash ,RTMP 流被选中。如果这一选项没有设置,JW Player 将会播放 HTTP 下载,因为很多浏览器 (比如 Chrome、IE)在 HTML5 中支持那个 (JW6 中的默认模式)。
参见 Working with Playlists 以获取关于加载多路源的更多信息。
应用和流
技术上讲,一个 RTMP 流包含两块:
- 应用路径 (例如rtmp://example.com/vod/)。
- 流标识 (例如mp4:myFolder/video.mp4)。
JW Player 6 中,这两块被整合到单个 URL。JW Player 根据 mp4 、 flv 或者 mp3 前缀的位置来决定应用和流之间的分割。
1. MP4/M4V/MOV/F4V 视频需要一个 mp4: 前缀:
- rtmp://example.com/vod/mp4:myFolder/myVideo.mp4
2. FLV 视频或者一个直播流 (FLV 容器下的) 需要一个 flv: 前缀:
- rtmp://example.com/vod/flv:myFolder/myVideo.flv
- rtmp://example.com/live/flv:myFolder/myLiveStream
3. MP3 音频需要一个 mp3: 前缀:
- rtmp://example.com/vod/mp3:myFolder/mySong.mp3
4. M4A/F4A/AAC 音频文件也需要一个 mp4: 前缀:
- rtmp://example.com/vod/mp4:myFolder/mySong.m4a
如果没有找到任何前缀,player 在文件名最后一个 / 之后对应用和流进行分割。前缀随后被自动添加 (mp4:,mp3:)。注意flv前缀并不被 Wowza/Adobe 服务器内部使用,因此 JW Player 将在请求流之前将其剥离。
动态流
除了加载单一 RTMP 流之外,JW Player 6 支持加载动态流。一个 动态 流包含多个具有同一内容的单流,它们具有不同的品质。JW Player 允许在这样一个流中进行不同品质的自动或者手工切换。
动态流必须使用叫做 SMIL manifest 设置。这是一些包含有 RTMP 应用路径加上存放在 RTMP 服务器上的流的路径的简单的 XML 文件。播放器经常假定一个带有 .smil 后缀的文件是一个 RTMP SMIL manifest:
1
|
jwplayer( "myElement" ).setup({
|
2
|
file: "/assets/myVideo.smil" ,
|
3
|
image: "/assets/myVideo.jpg" ,
|
4
|
height: 360,
|
5
|
width: 640
|
6
|
});
|
这是另一个例子,使用了一个 RTMP 动态流 (为桌面) 和一个渐进 MP4 下载 (为移动终端):
01
|
jwplayer( "myElement" ).setup({
|
02
|
playlist: [{
|
03
|
image: "/assets/myVideo.jpg" ,
|
04
|
sources: [{
|
05
|
file: "/assets/myVideo.smil"
|
06
|
},{
|
07
|
file: "/assets/myVideo.mp4"
|
08
|
}]
|
09
|
}],
|
10
|
height: 360,
|
11
|
primary: "flash" ,
|
12
|
width: 640
|
13
|
});
|
注意 SMIL manifest 是 跨域安全限制 的主题。如果你的 SMIL 文件位于你的网站或播放器之外的另一台服务器上,你需要去设置一个 crossdomain.xml 文件。
SMIL 内容
这是一个基本的例子,使用了三个不同的流:
01
|
< smil >
|
02
|
< head >
|
03
|
< meta base = "rtmp://example.com/vod/" />
|
04
|
</ head >
|
05
|
< body >
|
06
|
< switch >
|
07
|
< video src = "myVideo-high.mp4" height = "720" system-bitrate = "2000000" width = "1280" />
|
08
|
< video src = "myVideo-medium.mp4" height = "360" system-bitrate = "800000" width = "640" />
|
09
|
< video src = "myVideo-low.mp4" height = "180" system-bitrate = "300000" width = "320" />
|
10
|
</ switch >
|
11
|
</ body >
|
12
|
</ smil >
|
品质的切换由 JW Player 自动完成,它将选用最高品质:
- 谁的 system-bitrate 更适合连接的当前带宽。
- 谁的 width 更适合播放器屏幕的当前宽度。
用户可以通过设置快捷菜单中的品质对这些自动选项进行重写。manifest 中的 关于流的 height 属性用于设置菜单的标签 (例如 720p )。
WOWZA 3
Wowza Media Server 3 为这些 SMIL manifest 引入了专门的支持。如果你在运行 3.1.2.15 或更高版本的 Wowza,在你适配的流的 URL 后面添加 /jwplayer.smil 来得到这些 manifest。
这里是 Wowza3 中 SMIL manifest 和 M3U8 manifest 的 URL 的样子:
- http://example.com/vod/smil:myvideo.smil/jwplayer.smil
- http://example.com/vod/smil:myvideo.smil/manifest.m3u8
配置选项
RTMP 提供了一些配置选项来对流的播放进行调整。它们设置在一个专用的 rtmp 选项块中。
缓冲长度
在默认情况下,JW Player 试着为 RTMP 视频维护一个长度为 3 秒的缓冲。这意味着有三秒钟的视频被从服务器端获取并随时可以播放。这个长度可以使用 RTMP bufferlength 选项进行修改:
1
|
jwplayer( "myElement" ).setup({
|
2
|
file: "rtmp://example.com/vod/mp4:myVideo.mp4" ,
|
3
|
height: 360,
|
4
|
image: "/assets/myVideo.jpg" ,
|
5
|
rtmp: {
|
6
|
bufferlength: 0.1
|
7
|
},
|
8
|
width: 640
|
9
|
});
|
可用值的范围是从 0.1 (对于低延时的直播) 到 10 (为防止频繁的重缓冲)。
FC 订阅
当使用 Akamai、Edgecast 或者 Limelight 等 CDN 分发直播流时,播放器不能简简单单地连接到直播流。播放器需要通过发送一个叫做 FC Subscribe 的调用到服务器进行订阅。JW Player 包含了对此的支持,使用 RTMP subscribe 选项:
1
|
jwplayer( "myElement" ).setup({
|
2
|
file: "rtmp://example.com/xxxx/myStream" ,
|
3
|
height: 360,
|
4
|
image: "/assets/myLivestream.jpg" ,
|
5
|
rtmp: {
|
6
|
subscribe: true
|
7
|
},
|
8
|
width: 640
|
9
|
});
|
注意这一个功能仅适用于单一 RTMP 流。对于多位率的直播流,应该使用 HLS 协议。
安全令牌
Wowza Media Server 具有一个叫做 安全令牌 的特性,用于保护你的流被下载。它通过播放器发送给服务器一个令牌,然后服务器在开始发送流之前对令牌验证进行工作。JW Player 通过使用 RTMP securetoken 选项支持这一机制:
1
|
jwplayer( "myElement" ).setup({
|
2
|
file: "rtmp://example.com/vod/mp4:myVideo.mp4" ,
|
3
|
height: 360,
|
4
|
image: "/assets/myVideo.jpg" ,
|
5
|
rtmp: {
|
6
|
securetoken: "Kosif093n203a"
|
7
|
},
|
8
|
width: 640
|
9
|
});
|
注意我们不支持编译安全令牌的选项。SWF 通过提供了对 JS (它们都是客户端) 的安全增强,尤其是当 JS 代码有点混乱时。
原文链接: http://www.longtailvideo.com/support/jw-player/28854/using-rtmp-streaming/ 。
使用 JW Player 播放RTMP 流相关推荐
- 直播视频流+html,前端页面播放 rtmp 流与 flv 格式视频文件
技术 :angular/cli , html5 , typescript , scss ,es 6 ... 项目类型:直播视频与视频回放 使用到 插件 : videojs + ckplayer 遇到的 ...
- 直播视频流 html,html 播放rtmp流视频
最近项目上需要将视频在web上能够预览. 起初用到了VLC插件.但是该插件有个弊端让人很蛋疼.因为谷歌37版以后及其火狐等主流浏览器很多不支持.除此之外即使支持,也要另外下载一个vlc客户端安装好了. ...
- videojs集成--播放rtmp流
要是播不了的话,可以看下这篇文章.http://blog.csdn.net/cmqwan/article/details/76059703 之前说到已经把流推送过来了,这时候就可以使用videojs来 ...
- PC端播放RTMP流(手机端无法播放)
这是之前从网上搜到的资料保存下来,已经忘记是哪位大神的了 望见谅! 当前手机端不支持RTMP和RTSP 需要自己做播放器才可以进行支持 有效的RTMP直播源:(亲测可用!) rtmp://live.h ...
- 使用video.js播放rtmp流时报错FLASH: NetStream.Play.Failed
1.选用X5版本video.js,因为X6及以上版本不支持rtmp的播放 2.指定video-js.swf文件路径 videojs.options.flash.swf = "lib/vide ...
- 如何在IE浏览器播放RTSP或RTMP流
好多开发者一直苦恼于如何在IE浏览器环境下,构建低延迟的RTSP或RTMP播放,对于RTSP流来说,好多公司通常的做法是把RTSP转RTMP,然后分发到RTMP服务器,然后服务器转http-flv出来 ...
- h5 rtmp推荐控件_H5播放Rtmp之videojs播放
一.简介 我们看到了HLS播放视频实时性非常差,好的在6-7s,差点的就要10-12s了,也就是人走了,估计视频上还能看到,这对观感效果造成了很大的影响!但是好处就是它是基于http协议文件下载的,所 ...
- Android 直播RTMP流
原文链接 : How To Stream RTMP live in Android 原文作者 : Mohit Gupt 译文出自 : 开发技术前线 www.devtf.cn 译者 : ayyb1988 ...
- Vue项目中播放直播流
直播流播放协议 视频直播服务支出输出RTMP.FLV.HLS三种协议 阿里云视频直播 RTMP(Real Time Message Protocol:实时消息传输协议)延时低(1s~3s),TCP长连 ...
- jw player flash网页播放器 参数说明以及应用配置
jw player flash网页播放器 参数说明以及应用配置 1.参数解释 这些参数可以配置被嵌入到html中的播放器的行为和外观.如果使用swfobject.js,可以用addVariable() ...
最新文章
- 微信公众号开发本地环境开发_如何在5分钟内使HTTPS在本地开发环境上工作
- foreach去除重复元素java_Java foreach 中List移除元素抛出ConcurrentModificationException原因全解析...
- Kerberos策略的配置
- vs2010 ATL创建windows服务程序
- 用隐马尔可夫模型(HMM)做命名实体识别——NER系列(二)
- Ubuntu switch window switch terminal tab
- linkedin爬虫_您应该在LinkedIn上关注的8个人
- 【CodeForces - 1042B】Vitamins(去重方法,二进制或stlmap,水题)
- 天龙八部手游显示与服务器断开连接,天龙八部手游怎么设置 游戏设置方法(图文详解)...
- linux-优化内核参数 /etc/sysctl.conf
- ajax zlib,jQuery递增地读取Ajax流吗?
- 网络机顶盒固件编辑器_电信机顶盒刷固件补丁下载
- 编译时Collected errors
- r语言中检测异常值_R中的异常值检测
- 服务器遇到Broken Pipe崩溃
- 海信IP108H_S905L2_免拆_U盘卡刷固件包
- Oracle数据库断电致使控制文件不一致的恢复方法
- RichView TextBox Items 文本框
- 如何使用JavaMailSender给曾经心爱的她发送一封特别的邮件
- 微信小程序如何返回到上一个页面,并刷新页面呢?
热门文章
- 2021最新Java面试真题解析!java开发技能掌握
- 从外包月薪5K到阿里月薪15K,大厂面试必备技能
- docker学习--数据卷
- [已解决]smallbin double linked list
- 小程序入门说明以及资料整理
- calipso是什么意思_library是什么意思_library的翻译_音标_读音_用法_例句_爱词霸在线词典...
- 管理大师德鲁克60句经典名言
- 【学习笔记】Android Fragments
- 电脑连接上wifi,但是无法打开网页上网,小记
- 蚂蚁管网参数化三维建模方案