如何为直播流配置隐藏字幕?
转载请注明:文章来自www.wowza.cn
注意: 要访问最新的技术资料,请访问http://www.ttstream.com/wowza/
Wowza Stream Engine 4 支持直播流的隐藏字幕。它可以接收注入的字幕数据并将其转化为合适的格式以对外提供包括Apple HTTP Live Streaming (Apple HLS)、Adobe HTTP Dynamic Streaming (Adobe HDS)以及 RTMP协议在内的流媒体服务。 许多播放器技术,包括Apple iOS devices、VideoLAN VLC 播放器以及很多机顶盒都可以显示嵌入在直播流中的CEA-608格式的隐藏字幕。 www.wowza.cn另外还有一些播放器技术,例如JW Player 和 Flowplayer, 只能显示AMF onTextData格式的隐藏字幕。

注意: 需要Wowza Media Server® 3.6.0 及更高版本。

内容



简介
支持的输入源
支持的输出
支持的字幕转换(translations)

注入 CEA-608 格式的字幕
配置Application.xml
属性参数细节
实践的考量

注入 AMF onTextData 格式的字幕
背景
配置Application.xml
属性参数细节
发布 onTextData

播放
在Apple iOS 设备上播放
使用JW Player播放
使用Flowplayer播放


介绍



隐藏字幕有很多不同的数据来源,在流媒体输出时,每一个流媒体播放协议需要在流中嵌入不同数据格式的隐藏字幕。 www.wowza.cn Wowza Stream Engine 4的直播流隐藏字幕功能支持以下输入和输出格式。

支持的输入格式


  • 嵌入到输入流中的Action Message Format (AMF) onTextData
  • 嵌入到输入流中的CEA-608 字幕。
  • 用API将onTextData嵌入到实时流中


支持的输出格式


下面的所有输出格式,都可以用上面支持的输入格式来转化:

  • onTextData Adobe HDS (San Jose)中的events和RTMP直播流。
  • Apple HLS (Cupertino) 直播流视频轨道中的CEA-608 格式的 SEI 数据。


支持的字幕格式转化


下面的表格对Wowza Stream Engine 4支持的输入到输入的格式转换功能进行了总结:

输出 >

输入 ˅
Adobe HDS (San Jose)
(onTextData)
RTMP
(onTextData)
Apple HLS (Cupertino)
(CEA-608 in video)
AMF onTextData Yes Yes Yes
CEA-608 Yes Yes Yes
via API Yes Yes Yes

在Wowza Media Server的后续版本中,将增加更多的输入输出格式。

输入CEA-608格式的字幕



这个部分介绍了如何配置ModuleCEA608ToOnTextData 模块,它能监听输入的直播流并得到其中CEA-608格式的字幕,对字幕进行解码,然后将它们转换为onTextData事件。

注意: 针对Wowza Media Server 3.6及以上版本

配置Application.xml


  1. 先配置一个直播应用,为了播放直播流中的onTextData格式的隐藏字幕,配置的直播流最好是要支持Adobe HDS (San Jose),这样可以让你方便地测试字幕功能。 www.wowza.cn 如果要这么做,请用文本编辑器打开[install-dir]/conf/[application]/Application.xml并将Streams/LiveStreamPacketizers设置为:
    Code:
    <LiveStreamPacketizers>cupertinostreamingpacketizer,sanjosestreamingpacketizer</LiveStreamPacketizers>
  2. [install-dir]/conf/[application]/Application.xml 文件中,还要做如下改动:

    1. <Modules> 列表中添加下面的模块:
      Code:
      <Module>
      	<Name>ModuleCEA608ToOnTextData</Name>
      	<Description>ModuleCEA608ToOnTextData</Description>
      	<Class>com.wowza.wms.timedtext.live.module.ModuleCEA608ToOnTextData</Class>
      </Module>
    2. [install-dir]/conf/[application]/Application.xml文件的最下面的应用级<Properties> 列表中添加下面的属性参数:
      Code:
      <Property>
            	<Name>ccIngestCEA608LanguageID</Name>
             	<Value>eng</Value>
             	<Type>String</Type>
      </Property>
      <Property>
             	<Name>ccIngestCEA608TrackNumber</Name>
             	<Value>99</Value>
             	<Type>Integer</Type>
      </Property>
      <Property>
            	<Name>ccIngestCEA608EnableField1</Name>
             	<Value>true</Value>
             	<Type>Boolean</Type>
      </Property>
      <Property>
             	<Name>ccIngestCEA608EnableField2</Name>
             	<Value>false</Value>
             	<Type>Boolean</Type>
      </Property>
      <Property>
              <Name>ccIngestCEA608LogCaptions</Name>
      	<Value>true</Value>
      	<Type>Boolean</Type>
      </Property>
      <Property>
             	<Name>ccIngestCEA608LogAsSCC</Name>
             	<Value>false</Value>
             	<Type>Boolean</Type>
      </Property>
      <Property>
             	<Name>ccIngestCEA608VerboseLogging</Name>
             	<Value>false</Value>
             	<Type>Boolean</Type>
      </Property>
      要了解更多的可用属性参数,请阅读属性参数细节

  3. 启动 Wowza Media Server 并从编码器发布一个直播流。在这个例子中, 我们将使用名为myStream的直播流


属性参数细节


  • ccIngestCEA608LanguageID: 字幕使用的语言代码。如果没有设置,默认是本地服务器的3个字母所所代表的国家编码(3-letter)

  • ccIngestCEA608TrackNumber: 字幕的轨道编号。如果没有设置,默认采用99

  • ccIngestCEA608EnableField1: 设置CEA-608 field 1是否为enabled。默认为true (enabled). 通常情况,field 1 和 field 2 只有其中一个是enabled, 不会两个都是。

  • ccIngestCEA608EnableField2: 设置CEA-608 field 2是否为enabled。默认为false (disabled).

  • ccIngestCEA608LogCaptions: 设置在解析字幕时是否要记录日志。默认为true (enabled).

  • ccIngestCEA608LogAsSCC: 设置是否将所有的CEA-608 命令记录为Scenarist Closed Caption (SCC) 格式。默认为false (disabled).

  • ccIngestCEA608VerboseLogging: 设置是否在解析CEA-608时记录更详细的日志。默认是false (disabled).


实践的考量


由于单纯的CEA-608字幕和流媒体服务器中的字幕两者存在一些不同,一些字幕模型的解码可能比另一些的要好。Pop-on captions (可以显示在屏幕的任意位置,后面跟随另一个字幕或者结束)是最好的。 www.wowza.cn 其它字幕模型(例如scroll-up 字幕直接在屏幕上绘制)可能表现的有些延时。这是由于CEA-608是直接在设备上绘制,然而Wowza Stream Engine 4必须每一个字幕以获得它并将它嵌入到输出的直播流里。

当考虑采用什么字幕模型插入到Wowza Stream Engine 4 的直播流中时:

  • Use pop-on 字幕是最合适的

  • 如果使用其它字幕模型,要尽可能的降低字幕显示的开始时间到结束时间的时长。


嵌入 AMF onTextData 格式的字幕



下面介绍了如何配置ModuleOnTextDataToCEA608模块, 它对输入的直播流进行监听以获得AMF onTextData 格式的字幕, 对字幕进行解码,并将它转换为CEA-608格式的字幕。

注意: 适用于Wowza Media Server® 3.6.及以上版本

背景



onTextData 事件是一个Action Message Format (AMF) 事件,它通常和Adobe HDS 以及 RTMP streaming 协议配合使用,被用于封装隐藏字幕或标题信息。onTextData 事件通常包括下面的字段:

  • text. 封装了UTF-8 编码的文本。

  • lang. 三个字母代表的语言(例如,eng).

  • trackid. (可选) 针对VOD点播流,这个ID是视频文件中的字幕轨道ID。对于直播流,这个字段可以忽略或者设置为99.

ModuleOnTextDataToCEA608 模块监听输入的直播流,以获得onTextData 事件,解开其中的text字段, 将其转换为CEA-608 格式, 然后将它嵌入到视频流的SEI NAL 单元。包括Apple iOS 设备、VideoLAN VLC播放器及许多机顶盒在内的众多播放器技术都可以显示这些嵌入在视频流中的隐藏字幕。

你可以用Wowza Stream Engine 4中调用server-side API IMediaStream.sendDirect()以将onTextData事件嵌入到直播流中。 www.wowza.cn 这使得发布可以将隐藏字幕以timed text 事件或 SMPTE 事件的形式传递并使用Wowza Media Server server-side API将onTextData嵌入到直播流中。 当使用ModuleOnTextDataToCEA608 模块, onTextData 会被拦截并以CEA-608 事件的格式嵌入到直播流中。

配置Application.xml


  1. 先在Wowza Media Server上配置一个直播流应用,要播放直播流中的CEA-608隐藏字幕,直播流应用最好是要支持Apple HLS (Cupertino)以方便测试。 如果要这么做,用文本编辑器打开[install-dir]/conf/[application]/Application.xml ,并将Streams/LiveStreamPacketizers 设置为:
    Code:
    <LiveStreamPacketizers>cupertinostreamingpacketizer,sanjosestreamingpacketizer</LiveStreamPacketizers>
  2. [install-dir]/conf/[application]/Application.xml 文件中,做如下改动:

    1. <Modules> 列表的最后添加以下模块:
      Code:
      <Module>
      	<Name>ModuleOnTextDataToCEA608</Name>
      	<Description>ModuleOnTextDataToCEA608</Description>
      	<Class>com.wowza.wms.timedtext.live.module.ModuleOnTextDataToCEA608</Class>
      </Module>
    2. [install-dir]/conf/[application]/Application.xml最下面的应用级<Properties>列表中添加以下属性参数:
      Code:
      <Property>
      	<Name>closedCaptionLiveMaxDisplayTime</Name>
      	<Value>10000</Value>
      	<Type>Integer</Type>
      </Property>
      <Property>
      	<Name>closedCaptionLiveCommandsPerFrame</Name>
      	<Value>30</Value>
      	<Type>Integer</Type>
      </Property>
      <Property>
      	<Name>closedCaptionLiveChannel</Name>
      	<Value>0</Value>
      	<Type>Integer</Type>
      </Property>
      <!-- white:0, green:2, blue:4, cyan:6, red:8, yellow:10, magenta:12 -->
      <Property>
      	<Name>closedCaptionLiveColor</Name>
      	<Value>0</Value>
      	<Type>Integer</Type>
      </Property>
      <Property>
      	<Name>closedCaptionLiveCharacterSet</Name>
      	<Value>UTF-8</Value>
      </Property>
      <Property>
      	<Name>closedCaptionLiveLogOnTextDataEvents</Name>
      	<Value>true</Value>
      	<Type>Boolean</Type>
      </Property>
      <Property>
      	<Name>closedCaptionLiveEnableTranscoderResults</Name>
      	<Value>true</Value>
      	<Type>Boolean</Type>
      </Property>
      要了解更多关于可用的属性参数,请阅读属性参数细节.

  3. 启动Wowza Stream Engine 4,并从编码器发布一个直播流。在这个例子中,我们使用名为myStream的直播流。


属性参数细节


  • closedCaptionLiveMaxDisplayTime: 隐藏字幕在屏幕上显示的最大时长,单位毫秒.

  • closedCaptionLiveCommandsPerFrame: 每一帧中隐藏字幕命令的最大数量(最大为31).

  • closedCaptionLiveChannel: 隐藏字幕频道(channel).合法的值为0 (CC1) 和 1 (CC2). (注意: 好像Apple iOS 设备只支持CC1.)

  • closedCaptionLiveColor: 隐藏字幕的字体颜色. 合法的值是0 (白色), 2 (绿色), 4 (蓝色), 6 (青色), 8 (红色), 10 (黄色)以及 12 (紫红色).

  • closedCaptionLiveCharaterSet. 隐藏字幕的字符集,当将onTextData 文本转换为字幕数据时的字符集.

  • closedCaptionLiveLogOnTextDataEvents: 对每一个onTextData事件记录日志,如果设置为true, 所有的onTextData 事件都会被记录在日志中.

  • closedCaptionLiveEnableTranscoderResults: 是否在Wowza transcoder中对CEA-608 字幕透传。如果设置为true, 所有的 CEA-608 字幕都会被透传.


发布 onTextData



你可以下载例子模块(ModulePublishOnTextData) ,它会将onTextData 事件嵌入到直播流中。在测试ModuleOnTextDataToCEA608模块时,它会非常有用。 这个模块从一个文本文件读取字幕数据,然后每隔6.5秒向直播流插入onTextData 事件。这个模块仅仅是为了测试,是一个如何向直播流嵌入onTextData 事件的例子。


配置Application.xml


  1. [install-dir]/conf/[application]/Application.xml 文件中,做如下改动:

  1. <Modules>列表的最后添加如下模块:
    Code:
    <Module>
    	<Name>ModulePublishOnTextData</Name>
    	<Description>ModulePublishOnTextData</Description>
    	<Class>com.wowza.wms.plugin.closedcaption.test.ModulePublishOnTextData</Class>
    </Module>
  2. [install-dir]/conf/[application]/Application.xml文件最后面的应用级<Properties>列表中添加下面的属性参数:
    Code:
    <Property>
    	<Name>publishOnTextDataFile</Name>
    	<Value>${com.wowza.wms.context.VHostConfigHome}/content/ontextdata.txt</Value>
    </Property>
    <Property>
    	<Name>publishOnTextDataPublishInterval</Name>
    	<Value>6500</Value>
    	<Type>Integer</Type>
    </Property>
    <Property>
    	<Name>publishOnTextCharsetTest</Name>
    	<Value>false</Value>
    	<Type>Boolean</Type>
    </Property>
    <Property> 
    	<Name>publishOnTextDataLanguageID</Name> 
    	<Value>eng</Value> 
    	<Type>String</Type> 
    </Property>
    <Property> 
    	<Name>publishOnTextDataTrackNumber</Name> 
    	<Value>99</Value> 
    	<Type>Integer</Type> 
    </Property>
    适用的属性参数如下:

    • publishOnTextDataFile: ontextdata.txt 文件的路径.

    • publishOnTextDataPublishInterval: 插入事件的时间间隔,单位毫秒.

    • publishOnTextCharsetTest: 如果设置为true, 这个模块将发布一个测试的onTextData 事件,它囊括了从0x20到0xFF的全部UTF-8编码字符.

    • publishOnTextDataLanguageID: 设置使用何种基于3-character ISO-639 code ISO-639-2 language code的语言。默认是: eng.

    • publishOnTextDataTrackNumber: 设置使用哪一个轨道编号. 可以使用任何编号,但99 (默认值)是通常采用的值.

  3. 启动Wowza Stream Engine 4 并从编码器发布一个直播流。在这个例子中,我们将使用一个名为myStream的直播流。

  4. 播放这个直播流,请阅读下面播放部分的介绍以获得更多信息。


Playback



在Apple iOS 设备上播放


Apple iOS 播放器 可以从Apple HLS (Cupertino) 流中获取CEA-608格式的数据,将其作为字幕显示。

  • 在iOS 设备中启用隐藏字幕。要这么做,在设置 > 视频, 将隐藏字幕 设置为 ON.

    (不过在较新的iOS设备上,已经没有这个功能了)
  • 用iOS设备的Safari浏览器访问下面的URL:

    URL: http://[wowza-ip-address]:1935/[application]/myStream/playlist.m3u8


使用JW Player (RTMP)


JW Player 可以播放RTMP流中的字幕,请使用5.x 或 6.5 及更高版本JW Player。

你必须下载JW Player的JS库,并在Web服务器上部署一个HTML页面。将下面的直播地址修改为你自己的应用名和流名。

例如,如果你的直播流应用名为cclive,流的stream name 为myStream, 你使用JWPlayer 5.x时使用的页面代码看起来如下所示:
Code:
<div id="sample" ></div>
<script type="text/javascript">
jwplayer("sample").setup({
    file: 'myStream',
    flashplayer: 'jwplayer5/player.swf',
    height: 300,
    plugins: {
        'jwplayer5/captions.swf': {}
    },
    streamer: 'rtmp://10.0.0.10:1935/cclive',
    width: 400
});
</script>
使用JWPlayer 6时,页面代码可能如下所示:
Code:
<div id="sample" ></div>

<script type="text/javascript">
    jwplayer("sample").setup({
        playlist: [{
            file: 'rtmp://10.0.0.10:1935/cclive/myStream4',
            title: 'sample',
            description: 'sample'
	}],
        height: 300,
        width: 400
});
</script>

使用Flowplayer (RTMP and Adobe HDS/San Jose)


Flowplayer 可以播放RTMP 和 Adobe HDS (San Jose) 流中的字幕(要使用合适的字幕和流插件)。

你必须下载Flowplayer JS库,并在Web服务器上部署一个页面。 并将下面的直播地址修改为你自己的应用名和流名。

例如,如果你的直播流应用名为cclive ,流的stream name 为myStream, 你的页面代码看起来如下所示:
Code:
<a href="" style="display:block;width:400;height:300px" id="sample"> </a>

<script type="text/javascript">
	flowplayer("sample", "flowplayer/flowplayer-3.2.15.swf", {
		clip: {
		url: 'http://10.0.0.10:1935/cclive/myStream/manifest.f4m',
                urlResolvers: ['f4m'],
		provider: 'httpstreaming',
		autoPlay: false,
		autoBuffering: false,
		scaling: 'fit',
		},
	plugins: {
       		// streaming plugin configuration
		f4m: { 
			url: "flowplayer/flowplayer.f4m-3.2.9.swf" 
	  	},
 
        	httpstreaming: {
            		url: "flowplayer/flowplayer.httpstreaming-3.2.9.swf"
        	},

		captions: {
			url: 'flowplayer/flowplayer.captions-3.2.9.swf',
			captionTarget: 'content'
			},
		content: {
			url:'flowplayer/flowplayer.content-3.2.8.swf',
			bottom: '15%',
			backgroundColor: 'transparent',
			backgroundGradient: 'none',
			border: 0,
			opacity: .90,
			textDecoration: 'outline',
			style: {
				'body': {
					fontSize: '18',
					fontFamily: 'Verdana, Arial, Helvetica',
					fontWeight: 'bold',
					textAlign: 'center',
					color: '#ffff00'
					}
				}
			}
		},
	}
);
</script>