多协议、性能稳定、丰富API的流媒体服务器软件
如何用代码来控制直播流录制的开始和停止?
Wowza® 提供了两个代码示例,它展示了如何使用LiveStreamRecordManager API对直播流的录制进行控制,当直播流被发布到Wowza的一个应用上时自动开始录制,当直播流停止发布时,自动停止录制。
你可以下载本文讨论的包含源代码以及编译后的jar包的例子模块zip文件,它们为你展示如何使用最新的 LiveStreamRecordManager API 来实现自动录制功能。

点击这里下载StreamRecorderAutoRecord_4.0.zip

大纲


关于两个例子代码
关于模块(Module)的基础概念
ModuleAutoRecordBasicExample
ModuleAutoRecordAdvancedExample
MyFileVersionDelegate class
MyStreamRecorderListener class
安装直播流的自动录制例子模块
关于LiveStreamRecordManager的API文档

关于两个代码示例


StreamRecorderAutoRecordBasicExample 模块为实现对进入一个Wowza应用的所有直播流进行自动录制的需求提供了最基本的功能。它使用了StreamRecorder功能的默认配置参数。

StreamRecorderAutoRecordAdvancedExample 模块展示了如何设置StreamRecorder的配置参数,例如segmentationTypesegmentationDurationfileFormat等等。 这个模块也实现了一个自定义的录制文件名序号,它实现了IStreamRecorderFileVersionDelegate 接口,这个模块用这个接口设置了StreamRecorder的参数,而没有用Wowza默认的那个。
这个模块也实现了StreamRecorder的notification listener, 并且设置了StreamRecorder的参数来使用这个listener。这个listener将它在整个StreamRecorder的生命周期中所接收到的通知事件都记录在了日志中。

StreamRecorder中的参数将被应用到这个模块创建的每一个直播流录制任务中。

关于模块(Module)的基础概念


这两个例子模块继承了ModuleBase Java类,并实现了IModuleOnApp 接口。

  • ModuleBase Java类提供一些关于Wowza当前应用环境的基本功能,也提供了一个简单的记录日志的接口。本文的例子模块仅仅使用了ModuleBase提供的Logging API。

  • IModuleOnApp接口在当一个Wowza的application启动和停止时,提供了notification 方法。

这两个例子的主要代码逻辑就是在一个Wowza的application启动的notification方法onAppStart中。

ModuleAutoRecordBasicExample



源代码文件: com.wowza.wms.plugin.livestreamrecord.module.ModuleAutoRecordBasicExample.java

这个例子展示了对进入Wowza的某个应用的所有直播流进行自动录制所必须的基本功能,代码的基本逻辑介绍如下:

onAPPStart事件中:

  1. 实例化一个StreamRecorderParameters 对象
    StreamRecorderParameters recordParams = new StreamRecorderParameters(this.appInstance);
    			
  2. StreamRecorderParameters设置参数
    recordParams.segmentationType = IStreamRecorderConstants.SEGMENT_NONE;
    recordParams.versioningOption = IStreamRecorderConstants.OVERWRITE_FILE;
    			
    注意:
    • StreamRecorderParameters Java 对象包含了直播流录制相关的所有配置参数。如果你不去设置这些参数,它将使用Wowza Streaming Engine的默认设置。

    • 你会在Javadoc文档"com.wowza.wms.livestreamrecord.manager.IStreamRecordConstants"部分的LiveStreamRecordManager 的API中看到每一个参数的有效值及其介绍。
  3. 调用LiveStreamRecordManager 的startRecording 方法来启动对进入到这个Wowza应用的输入流进行录制,参数是应用实例和这个录制配置参数对象StreamRecorderParameters
    this.vhost.getLiveStreamRecordManager().startRecording(appInstance, recordParams);
    			

了解更多Wowza产品细节当你为一个Wowza应用安装好这个模块后,所有进入这个应用的直播流都将会被安装上面配置的录制参数StreamRecorderParameters来录制。

ModuleAutoRecordAdvancedExample



源代码文件: com.wowza.wms.plugin.livestreamrecord.module.ModuleAutoRecordAdvancedExample.java

这个例子模块基于basic example,但做了如下改进:

  • 一个自定义的Java Class, 它实现了IStreamRecorderFileVersionDelegate接口。当需要把直播流录制为一段一段的小片段时,它定义了录制文件的路径和文件名。

  • 一个自定义的Java Class, 它实现了IStreamRecorderActionNotify接口。它可以监听到直播流录制的通知事件(例如开始录制或停止录制等)。

  • StreamRecorderParameters中配置了上述两个自定义Class。

MyFileVersionDelegate class

直播流的录制器在保存录制文件时,需要获得一个带完整路径的文件名。Wowza Streaming Engine 有两个内建的文件名实现类: StreamRecorderFileVersionDelegateStreamRecorderSimpleFileVersionDelegate。 请参见LiveStreamRecordManager documentation了解更多这些Class的细节。

创建一个新的录制文件名实现类

你可以创建一个新的文件名实现类,实现IStreamRecorderFileVersionDelegate接口。 这个Java class 只有一个Function (getFilename) 需要被实现。你可以用包括stream name,开始录制时间在内等各种信息来组成这个文件名。你可以从这个Function传进来的参数IStreamRecorder获得这些信息。

MyFileVersionDelegate 的示例,演示了在默认的文件名后增加了系统时间(毫秒)(默认的文件名通常是流的名字),然后将新的名字返回给调用者:
File file = new File(recorder.getBaseFilePath());
String oldBasePath = file.getParent();
String oldName = file.getName();
String oldExt = "";
int oldExtIndex = oldName.lastIndexOf(".");
if (oldExtIndex >= 0)
{
	oldExt = oldName.substring(oldExtIndex);
	oldName = oldName.substring(0, oldExtIndex);
}

name = oldBasePath+"/"+oldName+"_"+DateTime.now().millisOfDay().getAsText()+oldExt;
			

将自定义的录制文件名实现类设置到录制参数中

将将自定义的录制文件名实现类MyFileVersionDelegate设置到录制参数中,在onAppStart方法中, 为recordParams.fileVersionDelegate接口设置一个实例,如下:
recordParams.fileVersionDelegate = new MyFileVersionDelegate();
		

MyStreamRecorderListener class

直播流录制器会向注册的监听器通知录制事件,这些事件在LiveStreamRecordManager documentation有详细介绍。 这些说明详见LiveStreamRecordManager类包下的"IStreamRecorderActionNotify"接口,包括有哪些事件,什么时候会被触发。

注意: 还有一个类似的关于LiveStreamRecordManager的事件监听接口。它提供了关于录制的另一个角度的事件监听。 具体请参见"LiveStreamRecordManager"类包下的"ILiveStreamRecordManagerActionNotify" ,在LiveStreamRecordManager documentation 有更多介绍。

创建一个新的StreamRecorderActionNotify监听器

Listener是一个简单的Java 实现类,它实现了IStreamRecorderActionNotify接口。 这个接口的所有方法都需要实现;当然,对于你不感兴趣的事件,在实现这个方法是可以什么都不做。

MyStreamRecorderListener的这个例子中,它在每一个事件的实现中都只是输出了一句Log:
class MyStreamRecorderListener implements IStreamRecorderActionNotify
{
		@Override
		public void onCreateRecorder(IStreamRecorder recorder)
		{
			/*
			To set stream specific StreamRecorderParameter values, set them here
			if (recorder.getStreamName().equals("mySpeciaStream"))
			{
				StreamRecorderParameters params = recorder.getRecorderParams();
				params.fileVersionDelegate = new SpecialStreamFileVersionDelegate();
				params.notifyListener = new SpecialStreamOtherListener();
			}
			*/
			getLogger().info("MyStreamRecorderListener.onCreateRecorder[" + appInstance.getContextStr() + "]: new Recording created:" + recorder.getStreamName());
		}
...

		@Override
		public void onSegmentEnd(IStreamRecorder recorder)
		{
			getLogger().info("MyStreamRecorderListener.onSegmentEnd[" + appInstance.getContextStr() + "]: segment closed:" + recorder.getStreamName());
		}
}

将这个监听器设置在录制的参数中

要将这个MyStreamRecorderListener的监听设置在录制中的参数中,在onAppStart方法中, 为recordParams.notifyListener 设置一个实例:
recordParams.notifyListener = new MyStreamRecorderListener();
		
当这个自定义模块被部署到一个应用上后,所有发布到这个应用上的流在被录制时都将使用StreamRecorderParameters中的录制参数。 这意味着MyFileVersionDelegateMyStreamRecorderListener 会被每一个流的录制器所调用。

你也可以在每一个流启动录制时(onCreateRecorder), 为录制器设置一个自定义的StreamRecorderParameters,作为录制参数。

注意: LiveStreamRecordManager 不支持为一个直播流配置启动多个录制器;

安装这个直播流自动录制模块


  1. 将下载的安装包下的lib/wms-plugin-wms-plugin-livestreamrecordautorecord_4.0.jar文件拷贝到Wowza安装目录的lib下([install-dir]/lib)。

  2. 在Wowza Streaming Engine Manager的管理界面上, 选择你需要安装录制模块的直播应用。

  3. 在应用的面板中,点击Modulestab页。

  4. Modules tab页,按如下操作:

    1. 点击Edit按钮。

    2. 点击Add Module 按钮,添加下面两个Module中的任意一个:
      Name: ModuleAutoRecordBasicExample
      Description: ModuleAutoRecordBasicExample
      Fully Qualified Class Name: com.wowza.wms.plugin.livestreamrecord.module.ModuleAutoRecordBasicExample
      -或-
      Name: ModuleAutoRecordAdvancedExample
      Description: ModuleAutoRecordAdvancedExample
      Fully Qualified Class Name: com.wowza.wms.plugin.livestreamrecord.module.ModuleAutoRecordAdvancedExample
  5. 点击应用的Restart 按钮。

  6. 发布到这个应用上的所有直播流的录制文件都会被保存在[install-dir]/content 目录下。


关于LiveStreamRecordManager 的API文档


关于LiveStreamRecordManager的 API 文档在Wowza Streaming Engine 安装目录 ([install-dir]/documentation/serverapi) 的Javadoc文档以及Wowza 相关技术文档 中服务端API的"com.wowza.wms.livestreamrecord.manager" 部分。