多协议、性能稳定、丰富API的流媒体服务器软件
如何对直播流进行录制?
Wowza Streaming Engine软件提供了一个全新的直播流录制系统,它可以让你通过Wowza Streaming Engine Manager管理界面或者Java API来对录制任务进行访问和控制(在以前,录制是一个免费的Wowza插件,在Wowza Media Server 3.5时代已经被整合进了Wowza标准产品中)。 你可以用管理界面和一个新的Java API  LiveStreamRecordManager  对录制任务进行启动、监控、暂停、控制。

本文侧重于介绍如何利用Wowza Streaming Engine Manager管理界面来进行录制操作。关于利用  LiveStreamRecordManager  API进行录制的细节信息,请参考如何用Java程序来控制对直播流的录制?

目录


准备工作

启动Wowza Streaming Engine 和 Wowza Streaming Engine Manager

对通过Http接口控制录制任务做认证

设置HTTP访问的IP白名单和黑名单

发布一个直播流

支持的文件格式

查看可用的输入流及其录制状态

使用基于WEB浏览器的管理界面进行录制

直播流录制的相关参数

使用http接口进行录制

用Java程序控制直播流的录制

用模版字符串定义录制片段的文件名

故障排查

通过启用更多的Debug信息来检查关于录制的设置都是否能正常工作

附录: 理解linux下的 crontab 语法


准备工作


启动 Wowza Streaming Engine 和 Wowza Streaming Engine Manager


你必须先启动Wowza Streaming Engine 和它的Web管理界面Wowza Streaming Engine manager。请参考如何启动和停止Wowza软件


对通过Http接口控制录制任务做认证


Wowza Streaming Engine中的直播流录制功能可以通过Http服务来控制,要启用这个http服务需要在[install-dir]/conf/VHost.xml文件的每一个端口中进行配置。默认的HTTP服务配置如下:
<HTTPProvider>
	<BaseClass>com.wowza.wms.livestreamrecord.http.HTTPLiveStreamRecord</BaseClass>
	<RequestFilters>livestreamrecord*</RequestFilters>
	<AuthenticationMethod>admin-digest</AuthenticationMethod>
</HTTPProvider>
        
这个AuthenticationMethod 属性设置了访问这个Http服务的认证方式。默认值为(admin-digest),表示用摘要认证Digest authentication (一个经过加密的盘问/回答机制来验证用户身份)方式来控制对HTTP服务的访问,如果你要从一个远程电脑上的Web浏览器上控制直播流的录制,建议你采用这个认证方式。

要使用这个认证方式,你必须要在[install-dir]/conf/admin.password文件中设定一个用户名和密码。用一个文本编辑器打开这个文件在新的一行输入用户名和密码。举个例子,你可以添加一个用户名myuser和一个密码mypassword:
# Admin password file (format [username][space][password])
#username password
myuser mypassword
		
如果要设置为不用认证就可以访问这个Http服务,请用文本编辑器打开VHost.xml文件,将AuthenticationMethod属性设置为none。如果是从一台远程电脑上的WEB浏览器上控制直播流的录制,因为安全原因不建议你这么做。


作为对对通过Http接口控制录制任务做认证的补充,你可以设置一个IP白名单和黑名单来限制哪些IP才能访问这个Http接口。 这个配置是HTTP Provider 配置的一个部分,你可以在[install-dir]/conf/VHost.xml文件中对应的Http Provider中的Properties里添加liveStreamRecordWhitelistRequestIPsliveStreamRecordBlacklistRequestIPs参数。
<HTTPProvider>
	<BaseClass>com.wowza.wms.livestreamrecord.http.HTTPLiveStreamRecord</BaseClass>
	<RequestFilters>livestreamrecord*</RequestFilters>
	<AuthenticationMethod>admin-digest</AuthenticationMethod>
	<Properties>
		<Property>
			<Name>liveStreamRecordWhitelistRequestIPs</Name>
			<Value>192.168.1.1</Value>
			<Type>String</Type>
		</Property>
		<Property>
			<Name>liveStreamRecordBlacklistRequestIPs</Name>
			<Value>192.168.1.2</Value>
			<Type>String</Type>
		</Property>
	</Properties>
</HTTPProvider>
		
这个liveStreamRecordWhitelistRequestIPs参数是一个逗号隔开的IP地址列表,表示允许访问的来源IP地址。而liveStreamRecordBlacklistRequestIPs参数也是逗号隔开的IP地址列表,但它表示不允许访问的来源IP地址。

如果liveStreamRecordWhitelistRequestIPs 参数中有任何IP地址,那么只有在这个列表中的才可以访问直播流录制的Http接口。
如果liveStreamRecordWhitelistRequestIPs 是空的,就表示除了在liveStreamRecordBlacklistRequestIPs中列出的,其它所有IP地址都可以访问的。


支持的文件格式


直播流录制功能支持将直播流录制为MP4 (QuickTime container) 文件或FLV (Flash Video container) 文件。

如果要录制为MP4格式,直播流必须采用以下编码格式:

视频

  • H.264

音频

  • AAC
  • MPEG-1 Layer 3 (MP3)
  • Speex


如果要录制为FLV格式,直播流必须采用以下编码格式:

Video


Audio




查看可用的输入流及其录制状态


Wowza Streaming Engine manager 为每一个Wowza直播应用提供了一个叫做Incoming Streams的页面,这个页面显示了当前所有发布到当前这个Wowza应用中的输入流以及它们的录制状态。 另外,它还在Incoming Streams Details的页面里里列出了每一个流的详细信息。

以默认的live应用为例,按下面的步骤操作:

  1. 请先确认你已经完成了前面介绍的准备工作。要了解它,请阅读前面的准备工作章节。

  2. 在Wowza Streaming Engine本机或一台远程电脑上,用WEB浏览器访问下面的URL: http://[wowza-ip-address]:8088/enginemanager/Home.htm,然后登陆进去。

  3. 在Streaming Engine manager的页面顶部,点击Applications菜单。

  4. 点击左侧的live 菜单,会显示出live应用下的功能菜单。

  5. 点击 incoming streams 菜单。

在这个例子中,在Default Instance (_definst)下,现在应该会有一个输入流myStream,状态是Active ,并且在Actions下有一个Record的图标。

wowza


在Wowza Streaming Engine Manager里对直播流做录制


你可以在Wowza Streaming Engine Manager的Incoming StreamsIncoming Streams Details页面对录制进行控制。包括启动、停止、文件名、存储路径、文件格式以及其它一些细节。 此外,你还可以依据播放时长、时钟、文件大小将录制的直播流分割为多个文件。举例,如果要对myStream流开始录制,生成一个MP4文件,按以下操作:

  1. 请先确认你已经完成了前面介绍的准备工作。要了解它,请阅读前面的准备工作章节。

  2. 根据查看可用的输入流及其录制状态的说明,查看live应用下的输入流的状态

  3. 点击Record图标,打开Recording 对话框。

  4. 根据你的需求配置录制参数。默认的配置是将直播流录制为一个MP4文件,文件名就是流的名字。

    注意: 在Recording对话框中的这些录制参数同样可以用StreamRecorder properties来配置。

    Recording Tab页



    Filename - 录制文件的文件名,你可以输入任意一个文件名。但文件名不能包含以下字符: 小于号(<), 大于号(>), 冒号 (: ), 引号 (' and "), 斜杠 (/), 反斜杠 (\), 管道符 (|), 问号 (?), 星号 (*), 双点(..), 以及波浪符(~)。

    Path设置一个保存录制文件的物理路径。默认的设置为[install-dir]/content目录。如果你希望设置为另外一个路径,你先要确认这个路径是真实存在的,然后再填上这个路径。路径不能包含以下字符:小于号(<), 大于号(>), 冒号 (: ), 引号 (' and "), 斜杠 (/), 反斜杠 (\), 管道符 (|), 问号 (?), 星号 (*) 。

    输出的文件格式 - 录制文件的格式,可以是MP4 (默认值) 或 FLV

    录制选项:

    • Record data - 如果输入流中包含metadata信息,则将这些信息一并录制到文件中。

    • Start on keyframe - 录制文件的第一个视频帧是从关键帧开始。


    Segmentation Tab页

    wowza

    Segmentation Option设置了如何将直播流录制为多个文件。可以基于文件大小、时长或者一个时间计划:

    • None - 录制为一个单独的文件(这是默认选项),不分割。 当录制的文件已经存在时,下面的Versioning Options选型可以设置如何生成新的文件:

      • Append to existing file - 重新录制的文件数据将会追加到原有的文件上。

      • Version existing file - 当直播流重新启动后将生成一个新的文件(这是默认的设置)。新文件的名字的依据File Versioning Template的设置。

      • Overwrite existing file - 重新录制的文件将覆盖原有的文件。

    • Segment by size - 依据文件的大小来分隔,Segment Size是文件的最大值,到了这个值就会生成一个新的文件。(以MB为单位)。支持的最小值是1MB。新生成的文件的名字依据File Versioning Template的设置。

    • Segment by duration - 依据文件的时长来分隔,Segment Duration是最大时长(格式为Hours:Minutes:Seconds)。支持的最小值是10秒。新生成的文件的名字依据File Versioning Template的设置。

    • Segment by schedule - 依据时间计划来分隔,你可以选择以下Segment Schedule选项:

      • Every hour on the hour - 在每个小时的整点时生成一个新的文件。这是默认设置。

      • Advanced - 按自定义的时间计划来分隔,格式为crontab表达式


      File Versioning Template and File Versioning Module

      如果你选择Segmentation Option将直播流生成为多个文件,那么新生成的文件在命名上将遵循一个规则模板,这个规则模板是依据File Versioning Module中的模块生成的,格式填写在File Versioning Template中。要了解更多关于File Versioning Template的信息,请参考用模板类定义录制生成的文件名。 你也可以自己做开发一个自定义模块生成这个文件名,这时,你需要在File Versioning Module中输入这个Module的完整Java类名。

  5. 点击 Record 启动对直播流的录制。

当你点击Record后,Wowza Streaming Engine 立即启动对直播流的录制。 同时,Recording 对话框将退出,回到输入流列表的界面,并且显示了这个流的状态是录制中。 你可以点击Refresh显示最新的输入流状态。



停止录制

若要停止对直播流的录制,点击正在录制状态中的流旁边的Stop recording图标(Actions下面)。


对录制进行强制分割

若要手动强制分隔一个正在录制中的直播流,点击这个流旁边的 Split recording图标(Actions下面)。 这将使得Wowza Streaming Engine 从此刻开始将直播流录制到一个新的文件中。


将直播流录制到多个文件中

在录制时,可以自动分割录制的数据到多个文件中,分隔点可以基于时长、时钟、文件大小,请选择下面的配置组合来设置如何分割录制文件:

注意: Wowza Streaming Engine 在分割录制文件时,是在离分割点最近的关键帧开始的。因此,分隔文件的大小或时长可能不会严格按你在Segmentation Options中的设置来。
  • 如果是按文件大小将将直播流录制到多个文件中,请在Recording对话框的Segmentationtab 页,在Segmentation Options下面选择Start Recording Segment By Size。 然后在Segment Size输入框中,设置一个文件的最大值(MB)。默认是10 MB。
    wowza

  • 如果是按播放时长将直播流录制到多个文件中,请在Recording对话框的Segmentationtab 页,在Segmentation Options下面选择Start Recording Segment By Duration。 然后在Segment Duration输入框中,设置一个文件的最大播放时长hours:minutes:seconds。默认是15 分钟 (00:15:00)。
    wowza

  • 如果是按自定义的时间计划将直播流录制到多个文件中,请在Recording对话框的Segmentationtab 页,在Segmentation Options下面选择Start Recording Segment By Schedule。 然后在Segment Schedule输入框中,按crontab 表达式来设置一个时间计划。默认值是在每一个小时开始时将流录制到一个新的文件中。
    注意:crontab表达式并不能用来让Wowza Streaming Engine启动和暂停录制,它仅仅是针对一个已经处于录制状态的任务,用于将录制数据按时间计划分隔到新的文件中。 wowza



直播流录制的相关参数


StreamRecorder 参数可以被用于直播流录制的默认参数配置,默认的StreamRecorder值是Recording对话框中的设置。

你可以在Wowza的Javadoc文档的"com.wowza.wms.livestreamrecord.manager.IStreamRecorderConstants"部分找到StreamRecorder的所有参数列表。


使用Http接口来录制直播流


你可以使用HTTP Get 方法和URL查询参数来录制直播流。下面展现了录制一个直播流时最简单的URL:
Code:
http://[wowza-ip-address]:8086/livestreamrecord?app=live&streamname=myStream&action=startRecording
相关URL参数:

  • app=[app-name]
  • streamname=[stream-name] (必须是直播流)
  • action=startRecording | stopRecording | splitRecordingNow | startRecordingSegmentByDuration | startRecordingSegmentBySize | startRecordingSegmentBySchedule

你可以在这个URL后面加上如下一些可选的参数:

  • option=version | append | overwrite
    默认值为version.

  • startOnKeyFrame=true | false
    默认值为true

  • recordData=true | false
    默认值为true.

  • outputPath=[path]
    默认值为空字符串,这意味着录制的文件将被存储在Wowza Streaming Engine的content文件夹([install-dir]/content)。如果你设置了另一个目录,你必须用绝对路径(例如C:/Content)。同时不要在路径中包含文件名。

  • outputFile=[filename].[extension]
    默认值为空字符串,这意味着录制的文件名依据[stream-name]和在format中设置的[extension]来命名。

  • format=1 | 2
    1 = FLV and 2 = MP4。默认为2

  • segmentSize=[megabytes]
    默认为10 (10 megabytes).

  • segmentDuration=[seconds]
    默认为900 (15 分钟)。

  • segmentSchedule=[crontab string]
    请阅读附录:理解crontab表达式以获得更多信息。


如果你设置了一个认证方式(请阅读对通过Http接口控制录制任务做认证)用username和password来认证,那么你需要将username和password添加到URL查询参数中,如下:
http://[username]:[password]@[wowza-ip-address]:8086/livestreamrecord?app=live&streamname=myStream&action=startRecording
		


用Java API LiveStreamRecordManager 控制直播流的录制


Wowza Streaming Engine 提供了一个叫做LiveStreamRecordManager的API,让你可以用Java程序控制对直播流的录制:

这些API提供了以下功能:

  • 启动/停止/分割直播流的录制 - (ILiveStreamRecordManager)

  • 获得一个录制任务列表 - (ILiveStreamRecordManager)

  • 注册/注销录制任务管理器LiveStreamRecordManager 相关事件监听 - (ILiveStreamRecordManagerActionNotify)

  • 为录制任务设置各种录制参数 - (IStreamRecorderConstants)

  • 在启动录制时,设置录制参数 - (StreamRecorderParameter)

  • 注册/注销一个具体录制任务相关事件监听 - (IStreamRecorderActionNotify)

  • 获得一个录制任务的详细信息 - (IStreamRecorder)

  • 用自定义程序创建分割文件的文件名 - (IStreamRecorderFileVersionDelegate)


用模版字符串来定义录制直播流后生成的分割文件

在默认情况下,系统允许你通过模版字符串来定义录制直播流后产生的分割文件.

  • public void setFileTemplate(String template). 设置一个自定义的模版字符串作为文件名。

  • public String getFileTemplate(). 返回当前正在使用的作为文件名的模版字符串。

模版字符串可以按任意顺序将任意的合法的文件名字符以及任意的合法模版键值(template key)组合起来。

这些字符串可以配合以下场景使用:

  • 根据文件大小开始新的录制分割
  • 根据播放时长开始新的录制分割
  • 根据时钟计划开始新的录制分割

合法的模版键值(template key)包括:

  • ${SourceStreamName}. 直播流的StreamName。

  • ${SegmentNumber}. 一个自动增长的数字,代表了被分割的录制片段的顺序,从0开始。

  • ${RecordingStartTime}. 录制开始时间.

  • ${SegmentTime}. 录制片段被创建的时间.

注意: ${RecordingStartTime}${SegmentTime} 的格式为yyyy-MM-dd-HH.mm.ss.SSS-zzz (<year>-<month>-<day>-<hour>.<minute>.<second>.<millisecond>-<time zone>). 默认的文件名模版为${SourceStreamName}_${RecordingStartTime}_${Segmen tNumber}, 它产生录制文件名如下所示:

myStream_2013-05-12-08.51.31.104-PDT_0.mp4
myStream_2013-05-12-08.51.31.104-PDT_1.mp4
myStream_2013-05-12-08.51.31.104-PDT_2.mp4

文件名模版例子:

${SourceStreamName}_${SegmentNumber}:

mystream_0
mystream_1
mystream_2

${SourceStreamName}_t${RecordingStartTime}_ct${Seg mentTime}:

mystream_t2013-05-12-02.34.53.102-PDT_ct2013-05-12-02.00.00.000-PDT
mystream_t2013-05-12-02.34.53.102-PDT_ct2013-05-12-02.15.00.000-PDT
mystream_t2013-05-12-02.34.53.102-PDT_ct2013-05-12-02.30.00.000-PDT


故障排查


  • 在你开始对直播流进行录制时,直播流必须已经进入到Wowza Streaming Engine中。

  • 在没有录制完成前,你不能去点播这个录制文件。

  • 直播流的录制API是基于服务端的录制。Wowza不提供在客户端的录制。

  • 当使用SegmentBy* API时,Version参数被启用,并且不能被修改


添加更多的Log信息来验证你的设置是否正确

你可以在Wowza Streaming Engine manager管理界面添加streamRecorderDebugEnable参数,让Wowza在录制时打印更多详细的日志:

  1. 在管理界面点击live应用。

  2. live 应用主界面的Properties tab页,在Quick Links导航条上点击StreamRecorder Defaults
  3. StreamRecorder Defaults部分,点击Edit

  4. 点击streamRecorderDebugEnable边上的Enabled复选框,然后将这个参数的值设置为True
    wowza
  5. 点击Save

  6. live应用主界面右上角点击Restart重启应用。

你也可以在[install-dir]/conf/[application]/Application.xml文件中,手工配置这个streamRecorderDebugEnable参数。请用文本编辑器打开这个文件,在<StreamRecorder>/<Properties>中添加下面的参数:
<Property>
    <Name>streamRecorderDebugEnable</Name>
    <Value>true</Value>
    <Type>boolean</Type>
</Property>
		
之后,日志信息会记录在[install-dir]/logs/wowzastreamingengine_access.log文件中。

下面是启用了streamRecorderDebugEnable参数之后的一条例子日志信息,你可以通过日志来检查你的设置。
comment server INFO 200 - [live/_definst_]StreamRecorder:stopRecorder(): recording stopped: C:\Program Files (x86)\Wowza Media Systems\Wowza Streaming Engine 4.0.0\content\myStream.mp4
		


附录: 理解crontab表达式


在Wowza Media Server中,你可以使用crontab表达式将录制的直播流基于时钟计划分割到多个文件中。crontab表达式可以用分钟、小时、月、年、一个月的某几天、一周的某几天多种方式设置一个间隔时间.合规的crontab字段如下(按顺序):

<Minute> <Hour> <Day_of_the_Month> <Month_of_the_Year> <Day_of_the_Week> <Year>

其中:

  • <Minute> - 分钟 (介于059之间),在这个时间将开始分割录制文件。

  • <Hour> - 小时(介于023之间,基于24小时时钟格式),在这个时间将开始分割录制文件。

  • <Day_of_the_Month> - 日期(介于031之间) ,在这个时间将开始分割录制文件。例如要设置在月的最后一天开始分割录制文件,可以设置为31.

  • <Month_of_the_Year> - 设置开始分割录制文件的月份。你可以设置一个月份的缩写(例如, Jan) 或等同的数字(例如1).

  • <Day_of_the_Week> - 设置在一周的某一天开始分割录制文件。你可以设置一个星期几的缩写(例如, Mon) 或者等同的数字(例如1).

  • <Year> - 设置开始分割录制文件的年份(例如2013).

crontab字段采用cron表达式(用空格分割的多个字符串的组合)格式,它提供了一个强大的机制来分割对直播流的录制。你也设置一些特殊字符来让它更加灵活。Wowza Media Server 3.5 支持nnCcron cron 格式 (http://www.nncron.ru/help/EN/working/cron-format.htm).

注意: nnCron 非标准的问号字符(?)代表了nnCron的启动时间,现在还不支持它的。 crontab表达式的例子:

下面是一些介绍cron表达式的例子。要获得更多高级的例子,请阅读nnCcron cron format 页面(http://www.nncron.ru/help/EN/working/cron-format.htm).

每隔30分钟开始录制直播流(在一个小时开始时和一个小时的一半时):

0,30 * * * * *
0,30
(简化版本)

在偶数小时里,每隔15分钟:

*/15 */2 * * * *
*/15 */2
(简化版本)

在早晨8点和下午6点开始录制直播流:

0 8,18 * * * *
0 8,18
(简化版本)