您应该对网络上的流视频和为Flash编码视频有一般的了解。
中级
Adobe HTTP Dynamic Streaming由Adobe开发,用于通过HTTP向用户传送内容,支持根据可供用户使用的带宽动态切换视频内容质量。它在与Adobe Flash Accesss 2.0结合使用时,对于保护宝贵的资产尤其有效。本文循序渐进地指导您获取Flash媒体视频平台并运行。
以下是在与Flash Access 2.0结合使用时,HTTP Dynamic Streaming内容传送的主要功能:
这些功能满足了大部分主流视频内容版权所有者的需求,进而使您能够在在线资源中保留广泛的内容选择。
保护内容和使用Flash Access分发它的解决方案可能是使用HTTP Dynamic Streaming技术保护多媒体项目中的内容(参见图1)。
图1. Flash Access Server for Protected Streaming功能图(单击放大)
该解决方案包含4个主要模块(内容阶段):
内容准备(使用File Packager实现视频点播)
内容准备包括使用File Packager工具编码和加密,这支持FLV(VP6/MP3)和F4V(H.264/AAC)文件格式。
在内容回放时应用的策略可由许可证服务器管理,所以您可以为HTTP Dynamic Streaming应用最简单的(匿名的)内容加密策略。
关于详细描述,请查阅本教程的“内容准备”一节。
内容传送(HTTP传送)
内容加密流程创建3种类型的文件:
对于缓存视频碎片,可以使用一个CDN或Nginx服务器。
许可证服务器
Adobe Flash Access Server for Protected Streaming是一个许可证服务器,向用户发放许可证并管理内容传送策略。关于详细描述,请查阅“配置Flash Access Server for Protected Streaming”一节。
回放
要回放测试内容,您可以使用免费的OSMF播放器。可在“OSMF视频播放器”一节中找到详细描述。
要让各项内容正常工作(参见图1),您将必须使用其他一些工具和模块,如下所示。
File Packager(f4fpackager)是一个Adobe控制台应用程序,执行以下操作:
关于详细说明,请参阅“内容准备”一节。
对于视频内容加密,使用了一种对称块加密算法(AES)以及128位的块和128位的密钥。这是一种加密标准,在CDN中提供了高度的存储安全和内容传送。
HTTP Origin Module for Apache处理对内容碎片的请求。它包含在所有Flash Media Server 4版本中,或者可以从Adobe网站下载它。
关于内容传送流程的详细说明,请参阅“HTTP Origin Module操作”一节。
开源媒体框架是一个可靠且灵活的ActionScript框架,用于快速开发基于SWF的视频播放器。OSMF示例播放器(参见图2)针对HTTP Dynamic Streaming而设计。关于该播放器的详细说明,请参阅“OSMF视频播放器”一节。
图2. OSMF示例播放器
要为HTTP传输准备内容,您需要使用File Packager,它提供了以下功能:
要在Windows中启用内容碎片化:
f4fpackager - input-file = sample.f4v - output-path = c: \ sampleoutput
编码完成后,您得到以下文件:sampleSeg1.f4f、sample.f4x和sample.f4m。
要在Linux中启用内容碎片化:
f4fpackager - input-file = sample.f4v - output-path = / sampleoutput
编码之后,您得到以下文件:sampleSeg1.f4f、sample.f4x和sample.f4m。
这包括使用多种位率加密内容:例如150 kbps、700 kbps和1500 kbps。在本例中,3个文件使用不同的位率编码:sample1_150kbps.f4v、sample1_700kbps.f4v和sample1_1500kbps.f4v。在Flash Media Server中。这些文件位于rootinstall\applications\vod\media目录中。
f4fpackager - input-file = sample1_150kbps.f4v - bitrate = 150
编码完成后,您得到以下文件:sample1_150kbpsSeg1.f4f、sample1_150kbps.f4x和sample1_150kbps.f4m。
f4fpackager - input-file = sample1_700kbps.f4v - manifest-file = sample1_150kbps.f4m - bitrate = 700
编码完成后,您得到以下文件:sample1_700kbpsSeg1.f4f、sample1_700kbps.f4x和sample1_700kbps.f4m。
除了当前编码(sample1_700kbps.f4m)的详细信息,描述文件sample1_700kbps.f4m还包含关于第一次编码的信息(sample1_150kbps.f4m)。
编码完成后,您得到以下文件:sample1_1500kbpsSeg1.f4f、sample1_1500kbps.f4x和sample1_1500kbps.f4m。
除了当前编码的详细信息,描述文件sample1_1500kbps.f4m包含关于第一次编码(sample1_150kbps.f4m)和第二次编码(sample1_700kbps.f4m)的信息。如果您使用多种位率编码,来自第一个描述文件的信息复制到第二个描述文件,第二个描述文件的信息复制到第三个描述文件,依此类推。
最新的描述文件包含所有3个已编码文件和它们不同的位率的最新信息。
File Packager不仅设计用于编码内容,还可以加密内容。使用配置文件,可以非常轻松地设置大量参数:
#offline <input-file> someFile.f4v </ input-file> <content-id> contentId </ content-id> <common-key> commonKey.bin </ common-key> <license-server-url> http://server1.com:9999 </ license-server-url> <license-server-cert> licenseServer.der </ license-server-cert> <transport-cert> transportCert.der </ transport-cert> <packager-credential> packagerCredential.pfx </ packager-credential> <credential-pwd> mYpwd </ credential-pwd> <policy-file> policyFile.pol </ policy-file> #offline
f4fpackager - conf-file = f4fpackager_config.xml
以下是参数的描述
所有参数应该包含文件的相对或绝对文件路径。关于File Packager的更多信息,请查阅以下资源:
描述文件(F4M)包含以下内容:
这是用于内容回放的描述文件的一个示例:
<?xml version = "1.0" encoding = "utf-8"?> <manifest xmlns="http://ns.adobe.com/f4m/1.0"> <id> myvideo </ id> <duration> 253 </ duration> <mimeType> video / x-flv </ mimeType> <streamType> recorded </ streamType> <baseURL> http://example.com "</ baseURL> <drmMetadata url="http://mydrmserver.com/mydrmmetadata"/> <bootstrapInfo profile="named" url="/mybootstrapinfo"/> <media url="/myvideo/medium" bitrate="908" width="800" height="600"/> </ Manifest>
这是用于多位率内容回放的描述文件的示例:
<?xml version = "1.0" encoding = "utf-8"?> <manifest xmlns="http://ns.adobe.com/f4m/1.0"> <id> myvideo </ id> <duration> 253 </ duration> <mimeType> video / x-flv </ mimeType> <streamType> recorded </ streamType> <baseURL> http://example.com "</ baseURL> <drmMetadata url="http://mydrmserver.com/mydrmmetadata"/> <bootstrapInfo profile="named" url="/mybootstrapinfo"/> <media url="/myvideo/low" bitrate="408" width="640" height="480"/> <media url="/myvideo/medium" bitrate="908" width="800" height="600"/> <media url="/myvideo/high" bitrate="1708" width="1920" height="1080"/> </ Manifest>
内容文件(F4F)包含加密的内容的碎片。您将在白皮书HTTP Dynamic Streaming on the Adobe Flash Platform(PDF)中找到F4F文件的更多信息。
当您的视频库准备好通过HTTP Dynamic Streaming传送时,您就可以配置服务器的HTTP基础结构了。内容传送由两个主要模块启用:
HTTP提供了多种流行的工具来实现负载平衡、缓存和适合标准Web内容的有效内容传送。
表1对比了各种内容传送方法和它们的参数,准确描述了HTTP Dynamic Streaming的优势。
表1. 内容传送方法对比
|
RTMP Dynamic Streaming |
HTTP渐进下载 |
HTTP Dynamic Streaming |
Flash Player版本 |
Flash Player 6或更高版本 |
Flash Player 7或更高版本 |
Flash Player 10.1或更高版本 |
服务质量 |
调节带宽和性能 |
不适用(常常导致糟糕的用户体验) |
调节带宽和性能 |
自适应位率 |
是 |
否 |
是 |
发布工作流 |
简单 |
简单 |
需要封装额外的描述文件 |
内容保护 |
实时(RTMPe)、SWF验证、DRM |
DRM仅用于VOD |
DRM同时用于实况和VOD |
实况支持 |
是 |
否 |
是 |
实况延迟 |
小于1秒* |
不适用 |
小于30秒** |
同步通信 |
是 |
否 |
不适用 |
日志 |
服务器端 |
否 |
客户端 |
可否缓存 |
否 |
是 |
是 |
RTMP的实况延迟可能因具体的网络基础结构和缓冲区设置不同而不同。
HTTP Dynamic Streaming的实况延迟可能因编码、碎片和缓冲区设置不同而不同。
HTTP Dynamic Streaming的一个最显著的优势在于,具有速度很低的Internet连接的用户可以暂停回放并等待视频内容完全下载。这样,甚至具有窄带Internet连接的用户也可以观看高品质视频,而不会中断。
您将在Adobe白皮书HTTP Dynamic Streaming on the Adobe Flash Platform(PDF)中看到HTTP Dynamic Streaming的特征的更多信息。
要在OSMF播放器中回放内容,您应该制定描述文件(F4M)的URL。下面是它的工作原理:
碎片化的内容结构(F4F)如图3所示。
图3. 碎片化内容(F4F)的结构
当将内容通过HTTP传送时,传送流程可使用Firefox和安装的FireBug插件分析(参见图4)。
图4. Firebug报告显示HTTP Dynamic Streaming内容传送
要创建HTTP Dynamic Streaming应用程序,执行以下操作:
为HTTP Dynamic Streaming设置Flash Media Interactive Server 4的过程已在白皮书HTTP Dynamic Streaming on the Adobe Flash Platform(PDF)中介绍。关于FMS设置和配置的更一般的信息,请查阅Flash Media Server 4.0帮助。
注意:如果webroot目录已有“images”目录,将这些文件从OSMF播放器的\images目录复制到webroot\images。
关于更多细节,请参阅“OSMF视频播放器”一节。
注意:OSMF播放器需要Flash Player 10.1或更高版本。
对于多位率传输,可以按下Q。按下Q–和Q+以更改回放位率。
为了管理受保护内容的数字版权和用户访问,Adobe提供了Flash Access Server for Protected Streaming。此服务器向用户发放受保护内容的许可证。
由于应用于内容回放的策略可由许可证服务器自定义,您可以使用最简单的(匿名的)内容保护策略加密内容。
Flash Access Server for Protected Streaming忽略加密文件本身中的策略。相反,在以下配置文件中,内容访问参数和限制需要在服务器端上定义:
在所有者的全局配置文件中,您可以指定flashaccess-tenant.xml的完整路径或相对于租户的目录的路径(LicenseServer.ConfigRoot/flashaccessserver/tenants/tenantname)。
租户的配置文件:
租户的配置文件flashaccess-tenant.xml提供了控制对租户内容的访问的设置:
注意:Flash Access Server for Protected Streaming发放的所有许可证都仅在24小时(86,400秒)内有效。
全局配置文件:
最重要的设置(比如缓存和日志)在全局配置文件flashaccess-global.xml中配置:
<Caching refreshDelaySeconds ="..." numTenants ="..."/>
refreshDelaySeconds确定更新频率。较小的间隔可能影响服务器性能。
numTenants是服务器的租户数量。
<Logging level ="..." rollingFrequency =""/>
level确定日志级别。如果它设置为“DEBUG”,则会将大量消息保存到日志文件中。为实现最优性能,Adobe建议将该值设置为“WARN”。但是,存在丢失重要信息的风险,比如授权审计数据。要记录尽可能少的日志,可以将该值设置为“INFO”。
rollingFrequency指定日志文件更改的频率。您可以将该值设置为“MINUTELY”、“HOURLY”、“TWICE- DAILY”、“DAILY”、“WEEKLY”、“MONTHLY”或“NEVER”
使用Flash Access Server for Protected Streaming,在回放内容时使用一条特定策略(参数默认会在Flash Access配置文件中设置):
日志文件由Flash Access Server for Protected Streaming创建并位于LicenseServer.LogRoot目录中。
注意:如果当前的日志文件在服务器启动时删除或移动,服务器将不会创建新日志文件,数据可能会在未来丢失。
目录结构:
LicenseServer.LogRoot/ flashaccess-global.log flashaccessserver/ flashaccess-partition.log tenants/ tenantname/ flashaccess-tenant.log
全局日志文件flashaccess-global.log位于LicenseServer.LogRoot目录中。这个日志文件包含来自Flash Access SDK的消息和服务器初始化时生成的消息。
flashaccess-partition.log配置文件位于LicenseServer.LogRoot/flashaccesserver目录中。此日志文件包含与请求的许可证相关的消息。
配置文件flashaccess-tenant.log位于LicenseServer.LogRoot/flashaccesserver/tenants/tenantname中。
此日志文件包含与每个请求的许可证相关的信息。
使用自定义身份验证机制需要将一个特殊令牌(AuthenticationToken)插入到许可证请求中:
要在Flash Access Server for Protected Streaming中启用自定义身份验证,您应该:
<AuthExtensions> <Extension className="com.adobe.flashaccess.server.license.extension.auth.SampleAuthorizer"/> </AuthExtensions>
关于更多信息,请参阅白皮书Protecting Content(PDF)。
要实现自定义身份验证类,执行以下步骤:
图5. 单击此处并插入您的图片标题。
package com.adobe.flashaccess.server.license.extension.auth; import java.io.DataInputStream; import java.io.IOException; import java.net.URL; import java.net.URLConnection; import org.apache.commons.logging.Log; public class SampleAuthorizer implements IAuthorizer { public SampleAuthorizer() {} public void authorize(IMessageFacade message, IAuthRequestFacade request, IAuthResponseFacade response, IAuthChain chain, Log log) throws Exception { if(message.getAuthToken() != null){ System.out.println(new String(message.getAuthToken())); URLConnection conn = null; DataInputStream dis = null; boolean authValid = false; try { conn = new URL("http://localhost/auth.jsp?" + new String(message.getAuthToken())).openConnection(); conn.setDoOutput(true); conn.setConnectTimeout(10000); conn.setReadTimeout(10000); dis = new DataInputStream(conn.getInputStream()); String inputLine = null; while ((inputLine = dis.readLine()) != null) if(inputLine.equalsIgnoreCase("auth=true")){authValid = true; k;} } catch (IOException e) { } finally{ if(dis != null) dis.close(); } if(authValid){ chain.execute(message); return; } } throw new Exception("AuthToken error"); } @Override public IAuthorizer clone() { return new SampleAuthorizer(); } }
要在您的应用程序中播放视频内容,您应该创建一个兼容Flash Access的视频播放器来保护基于OSMF 1.5的内容回放(参见图6)。播放器的源代码已在本文中给出。
图6. 基于OSMF的示例视频播放器,用于观看授权的内容(单击放大)
在初始化视频播放器期间,创建MediaPlayerSprite类的一个新实例。对于它的mediaPlayer属性,设置DRMEvent.DRM_STATE_CHANGE事件处理函数。这意味着在DRMEvent上,将调用onDRMStateChangeHandler方法来分析事件:
private function initMediaPlayer (): void { _mediaPlayerSprite = new MediaPlayerSprite (); _mediaPlayerSprite.mediaPlayer.addEventListener (DRMEvent.DRM_STATE_CHANGE, onDRMStateChangeHandler) addChild (_mediaPlayerSprite); }
addMedia方法用户添加要播放的新流。此方法创建URLResource类的一个实例,内容URL(比如http://server_url/content.f4m)传递给类构造函数。接下来,创建一个新MediaFactory对象和一个F4Melement类实例(该类的构造函数接受您的URLResource),以及一个F4Mloader类实例(它的构造函数接受MediaFactory对象):
private function addMedia (m_url: String): void { var _urlResource: URLResource = new URLResource (m_url); var _factory: MediaFactory = new MediaFactory (); var _f4mElement: F4MElement = new F4MElement (_urlResource, new F4MLoader (_factory)); _mediaPlayerSprite.mediaPlayer.media = _f4mElement; }
只要MediaPlayerSprite类的mediaPlayer属性出现了DRMEvent事件,就会调用onDRMStateChangeHandler方法。此方法对此类型的所有事件进行循环,在它找到一个匹配值时发起某些操作。例如,当出现RMState.AUTHENTICATION_NEEDED事件时,这表明需要身份验证。在这种情况下,身份验证按如下方式执行:
_mediaPlayerSprite.mediaPlayer.authenticate ("test", "test")
其中的两个test分别表示用户名和密码。
应该注意,可以实现身份验证功能来让用户名和密码扮演完全不同的角色(比如作为Web会话标识符):
protected function onDRMStateChangeHandler (evt: DRMEvent): void { switch (evt.drmState) { case DRMState.AUTHENTICATING: break; case DRMState.AUTHENTICATION_COMPLETE: break; case DRMState.AUTHENTICATION_ERROR: break; case DRMState.AUTHENTICATION_NEEDED: _mediaPlayerSprite.mediaPlayer.authenticate ("test", "test"); break; case DRMState.DRM_SYSTEM_UPDATING: break; case DRMState.UNINITIALIZED: break; } }
通过使用这些方法,您可以在基于SWF的视频播放器中回放DRM内容。
如果您需要传递一个令牌以进行身份验证,您应该使用DRMManager中的新API。方法setAuthenticationToken (serverUrl: String , domain: String , token: ByteArray ): void 可用于传递您拥有的任何令牌。
关于更多信息,请参阅ActionScript 3.0参考文档中的DRMManager类部分。
本教程介绍了使用Flash Access来保护HTTP Dynamic Streaming所提供的内容,包括构建一个兼容Flash Access、基于OSMF的媒体播放器。
此教程中参考的资源提供了更深入的知识和指南:
另请查阅DENIVIP博客,我们在其中发布与Flash Platform相关的有用内容,比如播客Flash Media Server: URLs tokenization。
原文地址: http://www.infoq.com/cn/vendorcontent/show.action?vcr=1444#header_4