你可以下载本文讨论的包含源代码以及编译后的jar包的例子模块zip文件,它们为你展示如何使用最新的 LiveStreamRecordManager API 来实现自动录制功能。
点击这里下载StreamRecorderAutoRecord_4.0.zip。
大纲
关于两个例子代码
关于模块(Module)的基础概念
ModuleAutoRecordBasicExample
ModuleAutoRecordAdvancedExample
安装直播流的自动录制例子模块
关于LiveStreamRecordManager的API文档
关于两个代码示例
StreamRecorderAutoRecordBasicExample 模块为实现对进入一个Wowza应用的所有直播流进行自动录制的需求提供了最基本的功能。它使用了StreamRecorder功能的默认配置参数。
StreamRecorderAutoRecordAdvancedExample 模块展示了如何设置StreamRecorder的配置参数,例如segmentationType、segmentationDuration、fileFormat等等。 这个模块也实现了一个自定义的录制文件名序号,它实现了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事件中:
-
实例化一个StreamRecorderParameters 对象
StreamRecorderParameters recordParams = new StreamRecorderParameters(this.appInstance);
-
为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中看到每一个参数的有效值及其介绍。
- StreamRecorderParameters Java 对象包含了直播流录制相关的所有配置参数。如果你不去设置这些参数,它将使用Wowza Streaming Engine的默认设置。
-
调用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 有两个内建的文件名实现类: StreamRecorderFileVersionDelegate 和 StreamRecorderSimpleFileVersionDelegate。 请参见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中的录制参数。 这意味着MyFileVersionDelegate 和 MyStreamRecorderListener 会被每一个流的录制器所调用。
你也可以在每一个流启动录制时(onCreateRecorder), 为录制器设置一个自定义的StreamRecorderParameters,作为录制参数。
注意: LiveStreamRecordManager 不支持为一个直播流配置启动多个录制器;
安装这个直播流自动录制模块
- 将下载的安装包下的lib/wms-plugin-wms-plugin-livestreamrecordautorecord_4.0.jar文件拷贝到Wowza安装目录的lib下([install-dir]/lib)。
- 在Wowza Streaming Engine Manager的管理界面上, 选择你需要安装录制模块的直播应用。
-
在应用的面板中,点击Modulestab页。
-
在Modules tab页,按如下操作:
- 点击Edit按钮。
-
点击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
- 点击Edit按钮。
- 点击应用的Restart 按钮。
- 发布到这个应用上的所有直播流的录制文件都会被保存在[install-dir]/content 目录下。
关于LiveStreamRecordManager 的API文档
关于LiveStreamRecordManager的 API 文档在Wowza Streaming Engine 安装目录 ([install-dir]/documentation/serverapi) 的Javadoc文档以及Wowza 相关技术文档 中服务端API的"com.wowza.wms.livestreamrecord.manager" 部分。