[wowza]RTP直播流推送到另一个远端的服务器
Push Publishing 插件可以让你通过Real Time Messaging协议(RTMP)、MPEG-2 Transport Stream (MPEG-TS)以及Real-time Transport 协议(RTP)将一个直播流推送到另一个远端的服务器上。 例如CDN或其它运行Wowza Media Server® 或 Adobe® Media Server的服务器,或组播网络上。从而可以支持更大规模的用户。
系统使用一个映射文件,来建立输入流到推送目的地的映射,同时这个文件可以被动态更新。此外,一个输入流可以被推送到多个目的地址上。
获得Push Publishing 插件
要获得Push Publishing 插件, 请填写AddOn 申请表。 在这个申请表中,请确定要选择Click to Request Push Publishing 复选框。当你的申请被审核通过后,你将在会3个工作日收到一封包含下载指南的邮件。下面是在推送时支持的传输协议:
- Real Time Messaging Protocol (RTMP)
- Adobe Media Server (RTMP authentication)
- MPEG-2 Transport Stream (MPEG-TS)
- Real-time Transport Protocol
- RTSP Playback (native RTP or MPEG-TS (RTP wrapped)
注意: PushPublishMap.txt 文件中的key和value现在支持双引号(")以兼容JSON规范。以前的文件中,没有采用双引号时在未来的一段时间依然可以继续工作。你可以更新这个文件以兼容未来版本的Push Publishing 插件。
安装
- 将插件包解压缩到一个临时的文件夹。
- 将[package]/lib/wms-plugin-pushpublish.jar 拷贝到Wowza Media Server的 [install-dir]/lib/ 文件夹下。
注意: 如果你正在使用low-level API 建立个性化的发布程序,请跳过下面的步骤。
- 将[package]/conf/PushPublishMap.txt 和 [package]/conf/PushPublishProfiles.xml 拷贝到 [install-dir]/conf/ 文件夹下。
- 按照快速上手指南的介绍创建一个直播应用根据。
- 用文本编辑器打开[install-dir]/conf/[application]/Application.xml,在列表的最后加上下面的:
ModulePushPublish Wowza PushPublishing Module com.wowza.wms.plugin.pushpublish.module.ModulePushPublish
- 在[install-dir]/conf/[application]/Application.xml文件最后面的中添加下面的属性参数:
pushPublishProfilePath ${com.wowza.wms.context.VHostConfigHome}/conf/PushPublishProfiles.xml pushPublishMapPath ${com.wowza.wms.context.VHostConfigHome}/conf/PushPublishMap.txt pushPublishSDPStorageDir
${com.wowza.wms.context.VHostConfigHome}/applications/${com.wowza.wms.context.Application}/sdp - 重启 Wowza Media Server。
注意: 默认情况下,push publishing 对所有应用使用同一个映射(map)文件。要为每一个应用配置自己的映射(map)文件,请将 [install-dir]/conf/PushPublishMap.txt 拷贝到 [install-dir]/conf/[application] 文件夹下,然后将pushPublishMapPath 属性改为下面的配置:pushPublishMapPath ${com.wowza.wms.context.VHostConfigHome}/conf/${com.wowza.wms.context.Application}/PushPublishMap.txt
配置
ModulePushPublish 模块将监听发布到这个服务器上的所有输入流(原始流)。 [install-dir]/conf/PushPublishMap.txt 映射文件被用于建立输入流和推送目的服务器之间的映射。映射文件中的每一行都代表了一个输入流以及要推送的目的服务器。 通过为一个输入流在多行配置多个目的地的方式可以实现一个输入流被推送到多个目的地的需求。 在Wowza Media Server运行时刻,映射信息可以被实时的添加和修改。但是修改并不会影响已经发布到服务器上的流。只有在映射信息被修改后发布到服务器上的流才会收影响。
映射信息的格式如下:
[src-stream-name]={profile:["profile"], [additional-configuration-items]}
例如,使用RTMP协议将一个名为myStream的流推送到另一个Wowza Media Server上, 在PushPublishMap.txt 文件中的映射信息看起来如下所示:
myStream={profile:"rtmp", streamName:"myStream", host:"www.mydestination.com"}
每一个映射信息都引用了一个Profile,它定义了Wowza将采用什么方式来推送这个流。所有可用的Profile都定义在[install-dir]/conf/PushPublishProfiles.xml文件中。Wowza支持以下profile:
rtmp | Publish to Wowza Media Server or Adobe Media Server |
rtmp-akamai | Publish to Akamai HD Network |
rtmp-limelight | Publish to Limelight CDN |
rtp | Publish stream as native RTP |
mpegts | Publish stream as MPEG-TS |
每一个profile都有一些各自的附加参数,可以添加到映射信息中。如下:
rtmp, rtmp-akamai, and rtmp-limelight
参数名字 | 描述信息 |
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) |
sendFCPublish | 要在推送之前调用FCPublish命令,需要设置为true(默认是true) |
sendReleaseStream | 要在推送之前调用releaseStream命令,需要设置为true(默认为true) |
sendStreamCloseCommands | 要在当推送停止时发送stream close命令,需要设置为true(默认是false) |
removeDefaultAppInstance |
要从connect命令中删除应用的实例名_definst_,需要设置为true(默认是false) |
sendOriginalTimecodes | 要发送原始输入流的绝对时间戳时,需要设置为true(多码率自适应时需要,默认是false) |
originalTimecodeThreshol |
将原始输入流的timecodes发送到更低级别的(timecode magnitude)目的地时使用 (当目的服务器是Adobe Media Server时需要, 默认是0) |
connectionFlashVersion | 与远端服务器连接时,发送Flash的版本(默认依赖profile) |
queryString | 在与远端服务器建立连接时,作为查询字符串添加在URL上(默认是[no-value]) |
debugLog | 设置为true以打开建立连接的日志记录开关(默认是false) |
debugPackets | 设置为true 以打开详细的打包日志记录开关(默认是false) |
akamai.network | 设置为false 以允许为Akamai AMS network扁平化(non EVENT_ANGLE_BITRATE) stream name (只针对rtmp-akamai only)(默认是 true) |
akamai.streamId | 用于定义StreamId (只针对rtmp-akamai ) |
akamai.sendToBackupServer | 如果设置为true, 目的服务器将被设置为备份服务器(只针对rtmp-akamai) (默认是false) |
注意: connectionFlashVersion 的值可以采用下面的变量:
${com.wowza.wms.pushpublish.CurrentFMLEVersion} 当前 Adobe® Flash® Media Live Encoder version number: FMLE/3.0 (compatible; FMSc/1.0) ${com.wowza.wms.pushpublish.CurrentFlashVersion} Adobe Flash Player version: WIN 10,0,12,36 ${com.wowza.wms.pushpublish.PushPublishVersion} Wowza Media Server Push Publishing version
rtp
参数名字 | 描述信息 |
streamName | SDP 文件的文件名 |
host | 目的服务器的主机名或IP地址 |
videoPort | 目的服务器的视频端口 |
audioPort | 目的服务器的音频端口 |
timeToLive | 当通过组播推流时,这是UDP包的TTL(默认是63) |
streamWaitTimeout | 当一个输入流进入时,这是等待这个流被识别和 接受的毫秒时间(默认是5000) |
mpegts
参数名字 | 描述信息 |
streamName | SDP文件的文件名 |
host | 目的服务器的主机名或IP地址 |
port | 目的服务器的端口 |
timeToLive | 当通过组播推流时,这是UDP包的TTL(默认是63) |
rtpWrap | 设置为true 以将MPEG-TS流封装在RTP包中(默认是false) |
streamWaitTimeout | 当一个输入流进入时,这是等待这个流被识别和 接受的毫秒时间(默认是5000) |
多个目的服务器
一个输入流可以被推送到多个目的服务器。要这么做,只要为这个输入流添加一个新的映射信息。例如,要将一个名为myStream的输入流推送到一个远端的Wowza Media Server,同时还要按MPEG-TS流的形式将其推送到一个组播地址上,你可以在映射文件中添加下面的信息:
myStream={profile:"rtmp", streamName:"myStream", host:"wowza.myserver.com", userName:"myuser", password:"mypassword"} myStream={profile:"mpegts", streamName:"myStreamMPEGTS", host:"239.1.1.1", port:10000}
推送连接的调试
要调试连接时遇到的问题,你可以为每一个目的服务器配置2个级别的调试: debugLog 和 debugPackets。当使用它们时,debugLog 记录了高层面(high-level)的连接信息以及连接状态。 专业的RTMP连接信息则位于数据包层面,debugPackets 记录了详细的每一个包的信息。下面是一个同时采用了这两个级别的log的映射信息:
myStream={profile:"rtmp", streamName:"myStream", host:"wowza.myserver.com", userName:"myuser", password:"mypassword", debugLog:true, debugPackets:true}
对于更深入的调试需求,请阅读如何调试Push Publishing 插件
API
Push Publishing AddOn 包含了一个底层的(low-level)的应用程序接口(API),你可以用它创建你自己的推送程序。这些API的Javadoc文档被包含在这个插件包的documentation/javaapi 文件夹下。 模块[package]/src/ModulePushPublishSimpleE
这个模块监听准备推送的新的输入流,将其推送到一个名为push-[streamName]的应用上。当这个输入停止时(unPublished),它也停止了推送。要使用这个模块。请下载并安装Wowza IDE 并创建包含这个Class的一个项目。要将这个模块添加到你的应用中,用文本编辑器打开[install-dir]/conf/[application]/Application.xml,在列表中添加下面的信息:
ModulePushPublishSimpleExample ModulePushPublishSimpleE xample com.wowza.wms.plugin.test.pushpublish.ModulePushPublishSimpleE xample
推送的目的地
Wowza Media Server
将流推送到另一个Wowza Media Server时,请使用rtmp profile。UserName 和 Password 仅仅在目的服务器要对推流进行认证时才需要。
下面是一个例子,它将流myStream 推送到一个远端的位于wowza.myserver.com上的Wowza Media Server,并假定远端要对RTMP推流进行认证并使用下面的认证信息:
- User Name: myuser
- Password: mypassword
映射信息的例子:
myStream={profile:"rtmp", streamName:"myStream", host:"wowza.myserver.com", userName:"myuser", password:"mypassword"}
为了实现码率自适应,就要确认关键帧是对齐的,这样会导致映射信息会略为复杂一些。例如,针对下面三个码率的流:
- myStream_480p: 500Kbps
- myStream_360p: 750Kbps
- myStream_720p: 1000Kbps
下面的映射信息可以使得推送正常工作,并能确保关键帧对齐:
myStream_480p={profile:"rtmp", streamName:"myStream_480p", userName:"myuser", password:"mypassword", adaptiveStreaming:true} myStream_360p={profile:"rtmp", streamName:"myStream_360p", userName:"myuser", password:"mypassword", adaptiveStreaming:true} myStream_720p={profile:"rtmp", streamName:"myStream_720p", userName:"myuser", password:"mypassword", adaptiveStreaming:true}
为了能够正常播放并实现码率自适应,你必须在远端的Wowza Media Server的[install-dir]/content目录下创建一个同步多媒体集成语言(SMIL)文件。例如,上面的流对应的SMIL文件如下:
播放:
- 打开 [install-dir]/examples/LiveVideoStreaming/FlashRTMPPlayer/player.html。
- 在Server输入框输入Wowza Media Server的服务器IP地址和应用名,格式为: rtmp://[wowza-ip-address]/[application]/。
- 在Stream输入框输入stream name。
- 点击Connect 按钮。
Adobe Media Server
要将流推送到Adobe Media Server, 请使用rtmp profile。 UserName 和 Password 仅在Adobe Media Server对推流进行认证时使用。
下面是将流myStream推送到远端的Adobe Media Server时的例子,假定它需要对推送流进行RTMP认证并使用下面的认证信息:
- User Name: myuser
- Password: mypassword
映射信息如下:
myStream={profile:"rtmp", streamName:"myStream", userName:"myuser", password:"mypassword", originalTimecodeThreshold:0x100000}
播放:
- 打开[install-dir]/examples/LiveVideoStreaming/FlashRTMPPlayer/player.html。
- 在Server输入框中输入Adobe Media Server 的IP地址和应用名,格式为rtmp://[adobe-address]/[application]/。
- 在Stream中输入stream name
- 点击Connect按钮。
MPEG-2 Transport Stream (MPEG-TS)
将MPEG-TS流推送到一个组播地址239.1.1.1:10000, 请使用下面的映射信息:
myStream={profile:"mpegts", streamName:"myStreamMPEGTS", host:"239.1.1.1", port:10000, rtpWrap:false}
将MPEG-TS流推送到一个组播地址239.1.1.1:10002,并将其封装到RTP包中,使用下面的映射信息:
myStream={profile:"mpegts", streamName:"myStreamMPEGTSWrapped", host:"239.1.1.1", port:10002, rtpWrap:true}
Real-time Transport Protocol (RTP unicast 或 multicast)
将native RTP 流推送到一个组播地址239.1.1.1,端口为10004-10007,使用下面的映射信息:
myStream={profile:"rtp", streamName:"myStreamRTP", host:"239.1.1.1", videoPort:10004, audioPort:10006}
Note: 当推送native RTP流时,视频和音频分别使用2个UDP端口。请确认VideoPort 和 AudioPort 的值是偶数,这样会给第二个端口做出预留。
Note: 当推送native RTP流或MPEG-TS流,Wowza会在[install-dir]/applications/[application]/sdp文件夹下自动生成一个SDP文件。SDP文件的名字是映射信息中StreamName的值,并以.sdp 为文件扩展名。支持组播的播放器可以使用这个文件播放这个流。
Note: 当推送native RTP流或MPEG-TS流,单播和组播地址场景下的映射配置基本一样。唯一不同的是映射配置信息中的Host字段必须在正确的范围内。关于组播地址的范围,请参考: Multicast address
RTSP Playback (native RTP 或 MPEG-TS (RTP Wrapped))
native RTP流或MPEG-TS流(rtpWrap:true) 都可以采用RTSP/RTP来播放。要播放组播地址的RTSP/RTP流, 你必须在RTSP/RTP播放URL后面加上multicastplay 的查询参数。例如, 一个推送过来的流为myStream,那么RTSP/RTP播放URL为:
默认的单播RTSP: rtsp://[wowza-ip-address]:1935/[application]/myStream 组播RTSP: rtsp://[wowza-ip-address]:1935/[application]/myStream?multicastplay以上将播放第一个被加载native RTP 或 MPEG-TS profile。如果native RTP 或 MPEG-TS 使用了多个profile,或者第一个profile是使用rtpWrap:false的MPEG-TS, 请将要播放的流的streamName作为multicastplay参数的值。
native RTP: rtsp://[wowza-ip-address]:1935/[application]/myStream?multicastplay=myStreamRTP MPEG-TS (rtpWrap:true): rtsp://[wowza-ip-address]:1935/[application]/myStream?multicastplay=myStreamMPEGTSWrapped
热门文章推荐
- [rtmp]流媒体协议RTMP,RTSP与HLS有什么不同?
- [Wowza]流媒体服务器Wowza Media Server的安装与启动教程
- [wowza]wowza推流发布和播放(推流RTMP流)介绍
- [wowza]Wowza Streaming Engine 4的安装与配置教程
- [wowza]Wowza Media Server 安装教程(含windows/Linux平台)
- [wowza]RTP直播流推送到另一个远端的服务器
- [AS3]Wowza Media Server服务器
- [wowza]wowza推RTSP流要求用户名密码