天天看点

使用 JW Player 播放RTMP 流

译序:JW Media Player 是开源的网页使用的 Flash 播放器。本文采摘于 JW Player 的官方文档,讲解了 JW Player 对于 RTMP 的使用方法,我们可以从 JW Player 客户端的角度来了解 RTMP 协议。以下是官方原文:

简介

RTMP 可以进行视频直播,人们可以在你录制的同时观看视频。

RTMP 可以做动态流,播放视频的质量可以根据带宽而自动变化。

播放器可以快进到视频的后面部分,这对于大于十分钟的视频很有用 (这一点是 HTTP 下载方式的在线视频无法匹敌的)。

播放器维护有一个小小的缓冲,避免了视频回放时的重新下载,节省了带宽。

缺点

但是,请注意 RTMP 也有自身的缺点,最重要的几个是:

RTMP 使用了跟 HTTP 不同的协议和端口号,这使得它很容易遭受 (公司) 防火墙的封堵。可以使用 RTMPT (通过 HTTP 通道) 避免这个问题,但这需要服务器付出一定的性能代价。

RTMP 数据被流化后传给播放器,这意味着连接的带宽必须要比视频的数据速率大。如果连接中止了几秒,流将卡住。这个问题在很大问题上可以使用包含一个低质量文件的动态流来进行预防。

服务器支持

要使用 RTMP,你的主机或者 CDN 需要安装一个专用 RTMP 服务器。这里有两个主流产品,JW Player 都支持:

CDNS

以下 CDN (Content Delivery Networks 内容分发网络) 能够支持 RTMP,并且使用 JW Player 测试效果良好。它们都支持动态流,除了 CloudFront,也都支持现场直播:

<a href="http://www.akamai.com/" target="_blank">Akamai</a>

<a href="http://www.cdnetworks.com/" target="_blank">CDNetworks</a>

<a href="http://www.edgecast.com/" target="_blank">Edgecast</a>

<a href="http://www.limelight.com/" target="_blank">Limelight</a>

现场直播

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 视频:

<code>1</code>

<code>jwplayer(</code><code>"myElement"</code><code>).setup({</code>

<code>2</code>

<code></code><code>file:</code><code>"rtmp://example.com/application/mp4:myVideo.mp4"</code><code>,</code>

<code>3</code>

<code></code><code>image:</code><code>"/assets/myVideo.jpg"</code><code>,</code>

<code>4</code>

<code></code><code>height: 360,</code>

<code>5</code>

<code></code><code>width: 640</code>

<code>6</code>

<code>});</code>

以上例子仅仅工作在桌面上,因为 Flash 在移动终端不可用。下面是另一个例子,使用 RTMP 和 HTTP 加载的一个 MP4。RTMP 流将会在桌面播放,下载的 HTTP 将会在移动终端播放:

<code>01</code>

<code>02</code>

<code></code><code>playlist: [{</code>

<code>03</code>

<code>04</code>

<code></code><code>sources: [{</code>

<code>05</code>

<code></code><code>file:</code><code>"rtmp://example.com/application/mp4:myVideo.mp4"</code>

<code>06</code>

<code></code><code>},{</code>

<code>07</code>

<code></code><code>file:</code><code>"/assets/myVideo.mp4"</code>

<code>08</code>

<code></code><code>}]</code>

<code>09</code>

<code></code><code>}],</code>

<code>10</code>

<code>11</code>

<code></code><code>primary:</code><code>"flash"</code><code>,</code>

<code>12</code>

<code>13</code>

因为主要呈现模式设置为Flash,RTMP 流被选中。如果这一选项没有设置,JW Player 将会播放 HTTP 下载,因为很多浏览器 (比如 Chrome、IE)在 HTML5 中支持那个 (JW6 中的默认模式)。

应用和流

技术上讲,一个 RTMP 流包含两块:

应用路径 (例如rtmp://example.com/vod/)。

流标识 (例如mp4:myFolder/video.mp4)。

JW Player 6 中,这两块被整合到单个 URL。JW Player 根据mp4、flv或者mp3前缀的位置来决定应用和流之间的分割。

1. MP4/M4V/MOV/F4V 视频需要一个mp4:前缀:

<a href="https://code.csdn.net/snippets/129678/fork" target="_blank"></a>

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:

<code></code><code>file:</code><code>"/assets/myVideo.smil"</code><code>,</code>

这是另一个例子,使用了一个 RTMP 动态流 (为桌面) 和一个渐进 MP4 下载 (为移动终端):

<code></code><code>file:</code><code>"/assets/myVideo.smil"</code>

SMIL 内容

这是一个基本的例子,使用了三个不同的流:

<code>&lt;</code><code>smil</code><code>&gt;</code>

<code></code><code>&lt;</code><code>head</code><code>&gt;</code>

<code></code><code>&lt;</code><code>meta</code><code>base</code><code>=</code><code>"rtmp://example.com/vod/"</code><code>/&gt;</code>

<code></code><code>&lt;/</code><code>head</code><code>&gt;</code>

<code></code><code>&lt;</code><code>body</code><code>&gt;</code>

<code></code><code>&lt;</code><code>switch</code><code>&gt;</code>

<code></code><code>&lt;</code><code>video</code><code>src</code><code>=</code><code>"myVideo-high.mp4"</code><code>height</code><code>=</code><code>"720"</code><code>system-bitrate</code><code>=</code><code>"2000000"</code><code>width</code><code>=</code><code>"1280"</code><code>/&gt;</code>

<code></code><code>&lt;</code><code>video</code><code>src</code><code>=</code><code>"myVideo-medium.mp4"</code><code>height</code><code>=</code><code>"360"</code><code>system-bitrate</code><code>=</code><code>"800000"</code><code>width</code><code>=</code><code>"640"</code><code>/&gt;</code>

<code></code><code>&lt;</code><code>video</code><code>src</code><code>=</code><code>"myVideo-low.mp4"</code><code>height</code><code>=</code><code>"180"</code><code>system-bitrate</code><code>=</code><code>"300000"</code><code>width</code><code>=</code><code>"320"</code><code>/&gt;</code>

<code></code><code>&lt;/</code><code>switch</code><code>&gt;</code>

<code></code><code>&lt;/</code><code>body</code><code>&gt;</code>

<code>&lt;/</code><code>smil</code><code>&gt;</code>

品质的切换由 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 秒的缓冲。这意味着有三秒钟的视频被从服务器端获取并随时可以播放。这个长度可以使用 RTMPbufferlength选项进行修改:

<code></code><code>file:</code><code>"rtmp://example.com/vod/mp4:myVideo.mp4"</code><code>,</code>

<code></code><code>rtmp: {</code>

<code></code><code>bufferlength: 0.1</code>

<code>7</code>

<code></code><code>},</code>

<code>8</code>

<code>9</code>

可用值的范围是从0.1(对于低延时的直播) 到10(为防止频繁的重缓冲)。

FC 订阅

当使用 Akamai、Edgecast 或者 Limelight 等 CDN 分发直播流时,播放器不能简简单单地连接到直播流。播放器需要通过发送一个叫做FC Subscribe的调用到服务器进行订阅。JW Player 包含了对此的支持,使用 RTMPsubscribe选项:

<code></code><code>file:</code><code>"rtmp://example.com/xxxx/myStream"</code><code>,</code>

<code></code><code>image:</code><code>"/assets/myLivestream.jpg"</code><code>,</code>

<code></code><code>subscribe:</code><code>true</code>

注意这一个功能仅适用于单一 RTMP 流。对于多位率的直播流,应该使用 HLS 协议。

安全令牌

<a href="http://www.open-open.com/lib/view/open1388104840406.html#viewSource" target="_blank">查看源码</a>

<code></code><code>securetoken:</code><code>"Kosif093n203a"</code>

注意我们不支持编译安全令牌的选项。SWF 通过提供了对 JS (它们都是客户端) 的安全增强,尤其是当 JS 代码有点混乱时。

继续阅读