Wowza Streaming Engine 的Push Publishing 技术及其API可以让你通过Real Time Messaging Protocol(RTMP)、Apple HLS (cupertino), Adobe HDS (sanjose)、MPEG-2 Transport Stream (MPEG-TS)以及Real-time Transport 协议(RTP)将一个直播流推送到另一个远端的服务器上, 例如CDN或其它运行Wowza Streaming Engine® 或 Adobe® Media Server的服务器,或组播网络上。从而可以支持更大规模的用户。
在Wowza Streaming Engine4.2之前,Push Publishing技术使用一个映射文件来建立输入流到推送目的地的映射,同时这个映射文件可以被动态更新。此外,一个输入流可以被推送到多个目的地址上。
注意:
- 这篇文章仅针对Wowza Streaming Engine™ 4.0及更高版本。
- 关于推流到更多外部第三方系统的Map文件示例,请参考Push Publishing destinations (with sample mapping file information).
- 你可以下载使用Push Publishing API的例子模块(下载例子程序 PushPublishExampleModule_4.0.zip)。你可以看看压缩包中的README.html文件,以了解更多。
内容提纲
关于安装
配置ModulePushPublish 模块
配置 PushPublishMap.txt 映射文件
关于Push的传输协议(profile)
Debugging connections
Push Publishing 的配置参数
Push Publishing API
Push Publishing 的目的服务器
关于安装
只要启动Wowza Streaming Engine 4就行,不需要其它任何附加的安装步骤。这个Push Publishing功能已经被集成到Wowza Streaming Engine 软件中了。
配置 ModulePushPublish 模块
ModulePushPublish 模块将监听所有进入Wowza Streaming Engine的输入流。
- 在Wowza Streaming Engine Manager管理界面中,点击你希望启用这个Push Publishing功能的直播应用。
-
在直播应用的页面,点击Modules tab页。
注意: 只有高级权限管理帐号才能看到Modules tab 页。要了解更多,请看Manage credentials. -
在Modules tab页,点击Edit,再点击Add Module, 然后填写以下模块信息:
Name ModulePushPublish Description ModulePushPublish Fully Qualified Class Name com.wowza.wms.pushpublish.module.ModulePushPublish
- 点击 Add, 然后再点击 Save,再然后按提示信息点击application的Restart。
配置 PushPublishMap.txt 映射文件
[install-dir]/conf/PushPublishMap.txt文件用于在源流和推送目的地之间建立映射关系(即什么流推送到什么地方去)。 文件中的每一行都代表了一个源流及其推送的目的地。如果你要把一个源流推送到多个目的地,只要多加几行即可。 在Wowza Wowza Streaming Engine 运行过程中,这个映射文件可以被动态的修改,但正在被推送的任务是不受影响的。 受影响的只是在文件被更新完成后才进入Wowza Streaming Engine 的输入流。
注意:
- PushPublishMap.txt文件现在对参数名和参数值支持双引导("),以兼容JSON规范,以前没有用双引导的映射文件在今后一段时间依然可以用,你可以更新这个文件,添加这个双引号,以保证能和未来版本的PushPublish模块兼容。
- 当前,Streaming Engine Manager 的管理界面还不支持对[install-dir]/conf/PushPublishMap.txt 文件的编辑。
从源流到目的地的映射
映射文件中的一条Push任务的格式如下:
例如,如果要采用RTMP协议将一个叫做myStream的流推送另一个运行Wowza Streaming Engine的服务器,PushPublishMap.txt文件中的这个Push任务就类似如下:
一个源流可以被推送到多个目的地,如果要这么做,为这个源流添加多条推送任务即可。例如要把myStream推送到一个运行Wowza Streaming Engine服务器,并且同时以MPEG-TS推送到一个组播网络,你可以在map文件加入以下推送任务:
myStream={profile:"mpegts", streamName:"myStreamMPEGTS", host:"239.1.1.1", port:10000}
不同的'profile'的其它附加配置参数
每一个推送任务中的Profile决定了采用什么协议进行推送,而每一种不同的Profile都有一些各自附加的配置参数。 要了解更多,请参考关于Push的传输协议(profile).
针对每个Wowza应用的Map文件
默认情况下,所有Wowza的应用共用一个Map文件。 如果要为每一个Wowza应用使用单独的Map文件,只要将[install-dir]/conf/PushPublishMap.txt文件拷贝到[install-dir]/conf/[application]文件夹下(每一个应用的配置根目录下),然后在Application.xml中增加一个参数pushPublishMapPath,将其配置为${com.wowza.wms.context.Application}即可。 关于这个配置参数,请看Push Publishing 的配置参数中的例子。 如果没有明确定义pushPublishMapPath参数,默认就会使用[install-dir]/conf/PushPublishMap.txt文件。
关于Push的传输协议(profile)
PushPublishMap.txt文件中的每一个推送任务中的profile定义了视频流将被如何推送。 每一个profile都有一些各自的附加参数,可以添加到映射信息中。这个章节介绍了这些profile以及它们的附加参数:
- rtmp - 使用RTMP协议推流到Wowza Streaming Engine 或 Adobe Media Server。
- rtmp-akamai - 使用RTMP协议推流到Akamai HD Network。
- rtmp-limelight - 使用RTMP协议推流到Limelight CDN。
- cupertino-akamai - 使用Apple HLS协议推流到Akamai HD Network。
- sanjose-akamai - 使用Adobe HDS 协议推流到Akamai HD Network。
- rtp - 使用native RTP 协议推流。
- mpegts - 使用MPEG-TS协议推流。
参数名字 | 描述信息 |
streamName | 定义了 stream name (默认是输入流的stream name) |
application | 定义了 application name (默认是 _defapp_) |
applicationInstance | 定义了 application instance name (默认是_definst_) |
host | 定义了目的地址的IP或主机名(默认地址依赖不同的profile) |
port | 定义了目的地址的端口号(默认是1935) |
userName | 定义了推送时需要的user name (如果目的地服务器要对推送进行认证,就需要这个user name) |
password | 定义了推送时需要的password(如果目的地服务器要对推送进行认证,就需要这个password) |
secureTokenSharedSecret | SecureToken 用于与远端服务器建立连接(如果目的地服务器使用SecureToken的话) |
adaptiveStreaming | 如果要做多码率自适应,需要设置为true (默认是false)。它会自动将sendOriginalTimecodes 设置为 true 并将 originalTimecodeThreshold 设置为 0x100000 |
sendFCPublish | 如果要在推送之前调用FCPublish命令,需要设置为true(默认是true) |
sendReleaseStream | 如果要在推送之前调用releaseStream命令,需要设置为true(默认为true) |
sendStreamCloseCommands | 如果要在停止推送时发送stream close命令,需要设置为true(默认是false) |
removeDefaultAppInstance | 如果要从connect命令中删除应用的实例名_definst_,需要设置为true(默认是false) |
sendOriginalTimecodes | 如果要发送原始输入流的绝对时间戳时,需要设置为true(在多码率自适应时需要这个时间戳,默认是false) |
originalTimecodeThreshold | 将原始输入流的timecodes发送到更低级别的(timecode magnitude)目的地时使用 (当目的服务器是Adobe Media Server时需要, 默认是0) |
connectionFlashVersion | 与远端服务器连接时,发送Flash的版本(默认值依赖不同的profile)。connectionFlashVersion 的参数值接受的变量:
${com.wowza.wms.pushpublish.CurrentFMLEVersion} - 目前Adobe Flash Media Live Encoder 的最新版本: FMLE/3.0 (compatible with FMSc/1.0) ${com.wowza.wms.pushpublish.CurrentFlashVersion} - Adobe Flash Player 的版本: WIN 10,0,12,36 ${com.wowza.wms.pushpublish.PushPublishVersion} - Wowza Streaming Engine Push Publishing 的版本 |
queryString | 在与远端服务器建立连接时,作为查询字符串添加在URL上(默认是[no-value]) |
debugLog | 设置为true以打开建立连接的日志记录开关(默认是false) |
debugPackets | 设置为true 以打开详细的打包日志记录开关(默认是false) |
localBindAddress | 在多网卡情况下(指运行pushPublish功能的本机),Wowza在推流时采用的IP地址(默认是系统默认网卡IP地址) |
akamai.network | 设置为false 以允许为Akamai AMS network扁平化(non EVENT_ANGLE_BITRATE)的 stream name (只针对rtmp-akamai,默认是 true) |
akamai.streamId | 用于定义StreamId (只针对rtmp-akamai ) |
akamai.sendToBackupServer | 如果设置为true, 目的服务器将采用akamai的备份服务器(只针对rtmp-akamai,默认是false) |
Profiles: cupertino-akamai 和 sanjose-akamai
参数名字 | 描述信息 |
streamName(必须) | akamai中流的名字。请参考下面Akamai的播放流URL格式 |
cupertino.renditions |
推送的媒体流范围。合法的配置包括: audiovideo 和 audioonly。如果没有设置,默认是audiovideo。 这个设置主要用于单个流的播放,但是也可以用"|"来隔开设置多个。例如,如果你打开了LiveStreamPacketizer的cupertinoCreateAudioOnlyRendition参数,那么你可以为设置为"audiovideo|audioonly"。 这样就会推送两个流,包括audio/video流以及audio-only的流(支持Apple AppStore)。 |
cupertino.playlistCount | 已经不推荐使用这个参数了。参见http.playlistCount。 |
cupertino.playlistAcrossSessions | 已经不推荐使用这个参数了。参见http.playlistAcrossSessions。 |
cupertino.playlistTimeout | 已经不推荐使用这个参数了。参见http.playlistTimeout. |
http.playlistCount |
在playlist中的切片数量。默认值是(0) 意味着将使用应用配置文件中live stream packetizer 里面的PlaylistChunkCount参数的设置值: cupertinoPlaylistChunkCount 参数 - 默认是 3 sanjosePlaylistChunkCount 参数- 默认是4 |
http.playlistAcrossSessions | 如果设置为true,则会在多个push publishing推送任务(cross session)中维护一个统一的切片列表(默认是false)。 |
http.playlistTimeout | 毫秒为单位的时长,是在多个push publishing推送任务(cross session)中维护一个统一的切片列表的超时时间(默认是120000 – 2 minutes). |
http.fakePosts | true或false (作用没太搞懂,没关系了,反正国内也很少用Akamai的)debug-only parameter that instructs the server to "fake" posting of cupertino or sanjose files to Akamai, in terms of logging. 用于分离出Akamai 服务器内部的通信错误。没有任何文件被推送到Akamai,因此播放不会成功。 |
debugLog | 设置为true以打开连接目的服务器时的日志输出(默认是false)。 |
http.writerDebug | 可以设置为true或false,用于将Http连接相关的日志输出出来(包括失败的连接、重连以及Socket的读写时间)。 |
akamai.streamId (必须) |
在Akamai 中这个流的StreamId。 |
akamai.hostId | 在Akamai 中的HostId (如果没有设置,默认为example-i)。 |
akamai.eventName (可选) |
在Akamai中的event name。 |
adaptiveGroups (可选) |
用"|"分割,设置多个输出。 |
akamai.sendToBackupServer | 已经不推荐使用这个参数了。参见akamai.destinationServer. |
akamai.destinationServer (optional) |
Akamai 的冗余服务器设置,有效的配置包括: primary、backup或redundant。和akamai.sendToBackupServer类似,如果设置为redundant,Wowza将把这一条推送任务推送到akamai的primary 和 backup 服务器上。 它会覆盖这条推送任务中akamai.sendToBackupServer 的设置。 设置为redundant后,会分别生成冗余的manifest/playlist,为在播放时同时提供primary 和 backup 播出流。 |
sanjose.representationId |
Defines a unique ID string for the stream representation used in the naming of the HDS stream-level manifest and bootstrap file names, and the bootstrapInfo ID and media URL values in the stream level manifest.
可以是任意alphanumeric字符。
If not provided, a calculated bitrate value in kbps is used as the representationId such as "752kbps", so a resulting stream-level manifest file name could be "752kbps.f4m". |
Akamai HTTP 协议的播放URL格式
设置了akamai.eventName的Primary播出流:
没有设置akamai.eventName的Primary播出流:
HDS: http://[akamai.hostId].akamaihd.net/hds/live/[akamai.streamId]/[streamName]/setlevelmanifest.f4m
设置了akamai.eventNameBackup播出流:
HDS: http://b-[akamai.hostId].akamaihd.net/hds/live/[akamai.streamId]-b/[akamai.eventName]/[streamName]/setlevelmanifest.f4m
没有设置akamai.eventName的冗余播出流:
HLS backup: http://b-[akamai.hostId].akamaihd.net/hls/live/[akamai.streamId]-b/[streamName]_red/playlist.m3u8
HDS primary: http://[akamai.hostId].akamaihd.net/hds/live/[akamai.streamId]/[streamName]_red/setlevelmanifest.f4m
HDS backup: http://b-[akamai.hostId].akamaihd.net/hds/live/[akamai.streamId]-b/[streamName]_red/setlevelmanifest.f4m
设置了akamai.eventName的Primary stream in adaptive group:
HDS: http://[akamai.hostId].akamaihd.net/hds/live/[akamai.streamId]/[akamai.eventName]/[adaptiveGroup]/setlevelmanifest.f4m
没有设置akamai.eventName的Primary stream in adaptive group:
HDS: http://[akamai.hostId].akamaihd.net/hds/live/[akamai.streamId]/[adaptiveGroup]/setlevelmanifest.f4m
设置了akamai.eventName的Backup stream in adaptive group:
HDS: http://b-[akamai.hostId].akamaihd.net/hds/live/[akamai.streamId]-b/[akamai.eventName]/[adaptiveGroup]/setlevelmanifest.f4m
注意:
- In cases where both akamai.destinationServer:"redundant" and adaptiveGroups:"[groupName]" are specified, a redundancy manifest/playlist won't be generated for the stream and the adaptive group manifest/playlist should instead be used for playback, since both the primary and backup streams will be listed there as well.
- Akamai encoder documentation indicates that their ingest servers only support 6-second chunk durations in the current version of their product for Adobe HDS. The Streaming Engine default chunk duration is 10 seconds for HDS. Therefore, we recommend changing the sanjoseChunkDurationTarget property value in Wowza Streaming Engine Manager to 6000 (6 seconds) for applications configured to push HDS streams to Akamai. Also, to ensure that accurate chunks durations are produced, we recommend that the the source stream is encoded with 1, 2, or 3-second keyframe intervals.
参数名字 | 描述信息 |
streamName | SDP 文件的文件名 |
host | 目的服务器的主机名或IP地址 |
videoPort | 目的服务器的视频端口 |
audioPort | 目的服务器的音频端口 |
timeToLive | 当通过组播推流时,这是UDP包的TTL(默认是63) |
streamWaitTimeout | 当一个输入流进入时,这是等待这个流被识别和 接受的毫秒时间(默认是5000) |
Profile: mpegts
参数名字 | 描述信息 |
streamName | SDP文件的文件名 |
host | 目的服务器的主机名或IP地址 |
port | 目的服务器的端口 |
timeToLive | 当通过组播推流时,这是UDP包的TTL(默认是63) |
rtpWrap | 设置为true 以将MPEG-TS流封装在RTP包中(默认是false) |
推送到目的服务器时的调试
要调试流传输建立连接时可能遇到的问题,你可以为每一个推送任务配置两个级别的Debug日志: debugLog 和 debugPackets。当使用它们时,debugLog 记录了高层面(high-level)的连接信息以及连接状态。
专业的RTMP连接信息则位于数据包层面,debugPackets 记录了详细的每一个包的信息。
下面是一个同时采用了这两个级别的log的映射信息:
myStream={profile:"cupertino-akamai", streamName:"myStream", cupertino.renditions:"audiovideo", akamai.streamId:215930, akamai.hostId:"wowzadevapple-i", debugLog:true}
对于一些更复杂的debug需求,请参考如何对Wowza的Push Publishing功能进行调试。
Push Publishing 的配置参数
你可以为Push Publishing功能添加下面介绍的配置参数,来对它的功能进行微调,请参考下面的连接学习如何在Wowza的管理界面 配置这些参数。
Path |
Name |
Type |
Example Values |
Notes |
Root/Application | pushPublishMapPath | String |
${com.wowza.wms.context.VHostConfigHome}/conf/PushPublishMap.txt (默认)
${com.wowza.wms.context.VHostConfigHome}/conf/${com.wowza.wms.context.Application}/PushPublishMap.txt |
定义publishing map 文件的路径。如果要为每一个Wowza应用用自己的map文件,你可以在这个配置中使用Application 变量。
这个配置应用于所有的Push Publishing profile. |
API
Wowza Streaming Engine中的Push Publishing功能提供了一个底层的(low-level)的应用程序接口(API),你可以用它创建你自己的推送程序。这些API的Javadoc文档被包含在Wowza安装目录的documentation/serverapi 文件夹下。 请看其中的com.wowza.wms.pushpublish.* 类包部分。
Wowza为您提供了一个自定义Module的例子,你可以下载。它展示如何用Push Publishing API向一个远端的服务器推送一个RTMP直播流。(下载 PushPublishExampleModule_4.0.zip)。
这个module 监听Wowza的输入流,然后将它推送到当前Wowza应用,新推送的流名为push-[streamName]。
当源流停止时(unpublished),它会停止推送。
要安装这个module,请参考压缩包中的README.html文件。
Push Publishing 的目的服务器
下面的文章介绍了一些Map文件的例子,包括了Wowza Streaming Engine支持的所有推送目的服务器: