Wowza® 提供了两个代码示例,它展示了如何使用LiveStreamRecordManager API对直播流的录制进行控制,当直播流被发布到Wowza的一个应用上时自动开始录制,当直播流停止发布时,自动停止录制。
注意: 本文针对Wowza Streaming Engine™ 4.0及以上版本。
你可以下载本文讨论的包含源代码以及编译后的jar包的例子模块zip文件,它们为你展示如何使用最新的 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 接口。
这两个例子的主要代码逻辑就是在一个Wowza的application启动的notification方法onAppStart中。
ModuleAutoRecordBasicExample
源代码文件: com.wowza.wms.plugin.livestreamrecord.module.ModuleAutoRecordBasicExample.java
这个例子展示了对进入Wowza的某个应用的所有直播流进行自动录制所必须的基本功能,代码的基本逻辑介绍如下:
在onAPPStart事件中:
实例化一个StreamRecorderParameters 对象
Code:
StreamRecorderParameters recordParams = new StreamRecorderParameters(this.appInstance);
为StreamRecorderParameters设置参数
Code:
recordParams.segmentationType = IStreamRecorderConstants.SEGMENT_NONE;
recordParams.versioningOption = IStreamRecorderConstants.OVERWRITE_FILE;
注意:
?
Code:
this.vhost.getLiveStreamRecordManager().startRecording(appInstance, recordParams);
当你为一个Wowza应用安装好这个模块后,所有进入这个应用的直播流都将会被安装上面配置的录制参数StreamRecorderParameters来录制。
ModuleAutoRecordAdvancedExample
源代码文件: com.wowza.wms.plugin.livestreamrecord.module.ModuleAutoRecordAdvancedExample.java
这个例子模块基于basic example,但做了如下改进:
MyFileVersionDelegate class
直播流的录制器在保存录制文件时,需要获得一个带完整路径的文件名。Wowza Streaming Engine 有两个内建的文件名实现类: StreamRecorderFileVersionDelegate 和 StreamRecorderSimpleFileVersionDelegate。
创建一个新的录制文件名实现类
你可以创建一个新的文件名实现类,实现IStreamRecorderFileVersionDelegate接口。 这个Java class 只有一个Function (getFilename) 需要被实现。你可以用包括stream name,开始录制时间在内等各种信息来组成这个文件名。你可以从这个Function传进来的参数IStreamRecorder获得这些信息。
MyFileVersionDelegate 的示例,演示了在默认的文件名后增加了系统时间(毫秒)(默认的文件名通常是流的名字),然后将新的名字返回给调用者:
Code:
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接口设置一个实例,如下:
Code:
recordParams.fileVersionDelegate = new MyFileVersionDelegate();
MyStreamRecorderListener class
直播流录制器会向注册的监听器通知录制事件,这些事件在LiveStreamRecordManager documentation有详细介绍。 这些说明详见LiveStreamRecordManager类包下的"IStreamRecorderActionNotify"接口,包括有哪些事件,什么时候会被触发。
注意: 还有一个类似的关于LiveStreamRecordManager的事件监听接口。它提供了关于录制的另一个角度的事件监听。 具体请参见"LiveStreamRecordManager"类包下的"ILiveStreamRecordManagerActionNotify" ,在LiveStreamRecordManager documentation 有更多介绍。
创建一个新的StreamRecorderActionNotify监听器
Listener是一个简单的Java 实现类,它实现了IStreamRecorderActionNotify接口。 这个接口的所有方法都需要实现;当然,对于你不感兴趣的事件,在实现这个方法是可以什么都不做。
在MyStreamRecorderListener的这个例子中,它在每一个事件的实现中都只是输出了一句Log:
Code:
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 设置一个实例:
Code:
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 页需要管理员具备高级操作权限。
在Modules tab页,按如下操作:
a. 点击Edit按钮。
b. 点击Add Module 按钮,添加下面两个Module中的任意一个:
Code:
Name: ModuleAutoRecordBasicExample
Description: ModuleAutoRecordBasicExample
Fully Qualified Class Name: com.wowza.wms.plugin.livestreamrecord.module.ModuleAutoRecordBasicExample
-或-
Code:
Name: ModuleAutoRecordAdvancedExample
Description: ModuleAutoRecordAdvancedExample
Fully Qualified Class Name: com.wowza.wms.plugin.livestreamrecord.module.ModuleAutoRecordAdvancedExample
点击应用的Restart 按钮。
发布到这个应用上的所有直播流的录制文件都会被保存在[install-dir]/content 目录下。
关于LiveStreamRecordManager 的API文档
关于LiveStreamRecordManager的 API 文档在Wowza Streaming Engine 安装目录 ([install-dir]/documentation/serverapi) 的Javadoc文档以及Wowza 相关技术文档中服务端API的"com.wowza.wms.livestreamrecord.manager" 部分。
Wowza Streaming Engine 4是业界功能强大、API接口丰富的流媒体Server产品,采用它作为流媒体服务器产品的案例很多,直播、在线教育、IPTV都有它的用武之地。