多协议、性能稳定、丰富API的流媒体服务器软件
如何为直播业务配置和运行Wowza nDVR功能?
Wowza nDVR 可以让你在对一个直播流进行录制的同时,向用户提供播放、暂停、倒回到之前某一个时刻、重新回到直播的当前时刻等用户体验。


故障排查


开始



Wowza nDVR 的功能


  • 对直播流进行录制:

    • H.264 视频

    • AAC 或 MP3 音频

    • 音频/视频, 纯音频, 纯视频

  • HTTP协议播放录制的流:

    • Adobe HTTP Dynamic Streaming (Adobe HDS/San Jose)

    • Apple HTTP Live Streaming (Apple HLS/Cupertino)

    • Microsoft Smooth Streaming (Smooth)

    • 时间戳对齐的多码率自适应流媒体

  • 支持源/边缘(Origin/Edge)架构。请阅读如何为直播流中继(origin/edge)架构下使用Wowza nDVR .

  • 将最近录制的音频和视频缓存在内存中

  • 提供Java™ API


Wowza应用的基础配置


用Wowza Streaming Engine Manager来配置


这个部分介绍了如何用Wowza Streaming Engine Manager管理界面来配置NDVR功能。

  1. 在Wowza Streaming Engine Manager管理界面中点击Applications菜单,再点击Add Application.

  2. Add Application页面,点击Live这个应用类型

    Wowza Streaming Engine

  3. New Application对话框中,输入一个应用名字dvr, 然后点击Add.

    Wowza Streaming Engine

  4. 点开dvr 应用菜单,点击nDVR,然后点击Enable nDVR.

    Wowza Streaming Engine
  5. 点击Restart Now重启服务,让配置生效

    Wowza Streaming Engine

  6. Status将会显示Wowza nDVR的状态是启用的.

    Wowza Streaming Engine

  7. 点击Edit 来配置nDVR的一些参数

    Wowza Streaming Engine

你可以在Application.xml文件中配置下面的DVR参数:

  • DVR/StorageDir: 设置录制的DVR流存放的文件夹。它可以包含环境变量(例如${com.wowza.wms.context.VHostConfigHome}) 或一个明确的路径,例如C:/myDvr)。

    注意: 支持下面的环境变量:

    • ${com.wowza.wms.AppHome}: 应用的根目录

    • ${com.wowza.wms.ConfigHome}: 配置文件所在目录

    • ${com.wowza.wms.context.VHost}: Virtual host 的名字

    • ${com.wowza.wms.context.VHostConfigHome}: Virtual host 的配置目录

    • ${com.wowza.wms.context.Application}: 应用名

    • ${com.wowza.wms.context.ApplicationInstance}: 应用实例名
    DVR 流文件存储在StorageDir 文件夹下的子目录下,这个子目录的结构包含应用名、应用实例名、流的名字(stream name)以及一个数字编号。例如,如果DVR/StorageDir被设置为C:/myDvr, 应用dvr下有两个名字为"streamA" and "streamB"的直播流,那么存储路径为:
    • C:/myDvr/dvr/_definst_/streamA.0
    • C:/myDvr/dvr/_definst_/streamB.0

  • DVR/ArchiveStrategy:设置了DVR流在保存时,如果遇到相同应用实例、相同流名字时,如果处理已有的DVR流目录和文件。可选项包括:
    • append: 将录制的流添加到现有DVR存储目录中。这是默认值。
    • delete: 删除已有的DVR流目录及文件,开始一个新的DVR流存储。
    • version: 用下一个可用到数字编号创建一个新的DVR存储目录。已有的DVR存储目录不会被删除。

  • DVR/WindowDuration: 这个时长(以秒为单位)是一个平移时间窗口的概念,它被用来定义DVR录制文件中哪个时间范围内的数据可以用于时移播放(也就是从当前直播点往后倒推的总时长)。 在这个时间窗口之外的录制文件,随着时间不断往前推进,会变成不可用的并会被从文件系统中清除。 WindowDuration设置为0时表示没有window duration,即所有的DVR数据都是可用的。


用XML文件来配置



本章节提供了在配置一个直播流应用的Application.xml的基本步骤。

  1. 创建应用文件夹[install-dir]/applications/dvr.

  2. 创建配置文件夹[install-dir]/conf/dvr 并将[install-dir]/conf/Application.xml 拷贝到这个新的文件夹下。

  3. 编辑这个新拷贝的Application.xml 文件,然后做如下改动(可能有些是已经设置好的):

    1. Streams/StreamType 属性设置为:
      Code:
      <StreamType>live</StreamType>
    2. Streams/LiveStreamPacketizers 属性设置为:
      Code:
      <LiveStreamPacketizers>dvrstreamingpacketizer</LiveStreamPacketizers>
      这样的设置使得来源于存储在这台Wowza Media Server上的录制直播流可以以HTTP协议对外提供流服务。

      作为对这个DVR流的补充设置,你可以为这个直播流添加以下打包服务。例如:
      Code:
      <LiveStreamPacketizers>cupertinostreamingpacketizer,smoothstreamingpacketizer,sanjosestreamingpacketizer,dvrstreamingpacketizer</LiveStreamPacketizers>
    3. DVR/Recorders 属性设置为:
      Code:
      <Recorders>dvrrecorder</Recorders>
    4. DVR/Store 属性设置为:
      Code:
      <Store>dvrfilestorage</Store>
    5. HTTPStreamers 属性设置为你希望提供的流传输协议。例如:
      Code:
      <HTTPStreamers>cupertinostreaming,smoothstreaming,sanjosestreaming</HTTPStreamers>


发布直播流


  1. 用文本编辑器编辑[install-dir]/conf/admin.password 文件,添加一个用于开始和停止发布直播流的用户名和密码(下面是一个例子文件,用户名为myuser,密码为mypassword):
    Code:
    # Admin password file (format [username][space][password])
    # username password
    myuser mypassword
  2. 启动Wowza Media Server。

  3. 发布直播流(例如,从编码器)到服务器的dvr应用上。

  4. 使用Stream Manager 开始接收流:

    1. 在Web浏览器中访问下面的URL:
      URL: http://[wowza-ip-address]:8086/streammanager

    2. Security对话框中,输入你在上面设置的管理用户名和密码。

    3. Stream Manager页面中,点击dvr应用下的[start-receiving-stream]连接。

    4. Start Receiving Stream对话框中,选择MediaCaster Typertp-record

    5. Stream Name 字段,输入流的名字(stream name)。

    6. 点击OK

当直播流启动后,它将同时被录制到DVR存储空间中。

播放


注意: 在下面的例子中,[wowza-ip-address]是运行Wowza Media Server的服务器IP地址或域名。

Adobe Flash 播放器 (San Jose/Adobe HDS)


这个例子采用Strobe player播放直播流, 它基于OSMF。

在Wowza Media Server 3.5.0及更高版本,双击[install-dir]/examples/LiveDVRStreaming/FlashHTTPPlayer/player.html,输入下面的直播或DVR流的U stream URL below, and then click the Connect button.

直播流: http://[wowza-ip-address]:1935/dvr/myStream/manifest.f4m
-或-
dvr流: http://[wowza-ip-address]:1935/dvr/myStream/manifest.f4m?DVR

从远端的电脑上播放流时,将FlashHTTPPlayer 文件夹拷贝到一个Web服务器上即可,然后访问:http://<webserver>/FlashHTTPPlayer/player.html.

Apple iOS 设备 (Cupertino/Apple HLS)


在设备的Safari web浏览器上访问下面的URL:

URL: http://[wowza-ip-address]:1935/dvr/myStream/playlist.m3u8?DVR

注意:

  • Apple iPhone 3GS (及更早的设备) 以及iPod touch 设备需要视频编码格式为H.264(Baseline profile level 3 或更低) 以及AAC 或 MP3 立体省的音频。

  • 你也可以在运行Mac OS X Snow Leopard 10.6及以上版本操作系统的电脑上用Safari web 浏览器或QuickTime 10.x播放这个流。
Apple iOS device (嵌入到HTML中)

在WEB页面中播放视频最好的方式是采用<video> 标签。然而, 当你将一个Apple HLS流从之前的一个播放位置移动到当前直播位置时会导致播放被暂停。我们已经向Apple提交了这个问题。替代的方案是采用<embed>标签。
Code:
<!-- Comment-out
<video src="[wowza-ip-address]:1935/dvr/myStream/playlist.m3u8?DVR" controls>
-->
<embed width="320" height="240" 
             src="[wowza-ip-address]:1935/dvr/myStream/playlist.m3u8?DVR"
             type="application/vnd.apple.mpegurl" postdomevents="true" id="movie1" />

Microsoft Silverlight (Smooth Streaming)


在Wowza Media Server 3.5.0及更高版本,双击[install-dir]/examples/LiveDVRStreaming/SilverlightPlayer/player.html, 输入下面的信息,然后点击Connect 按钮。

Stream: http://[wowza-ip-address]:1935/dvr/myStream/Manifest?DVR

从远端的电脑上播放这个流时,将SilverlightPlayer文件夹拷贝到一个web服务器上,然后访问: http://<webserver>/SilverlightPlayer/player.html.

注意:

  • 在Wowza Media Server 3.1.2 及更早的版本, 双击[install-dir]/examples/LiveDvrStreaming/clientSilverlight/LiveDvrSmoothStreaming.html, 输入上面的信息,然后点击Play 按钮。

  • Microsoft Silverlight 播放器要求播放流同时具备音频和视频才能播放。对于直播流, 关键帧的频率(在一些编码器中可以直接设置)必须在1秒到4秒之间(推荐采用2秒)。只要大于4秒就会引起播放暂停。

故障排查



日志


Wowza nDVR 产生的日志在Wowza Media Server在[install-dir]/logs目录下的日志文件中。要获得更多的关于日志功能的信息,请阅读Wowza相关文档中的用户使用指南.

以独立(standalone)模式运行Wowza Media Server可以让你在控制台窗口中看看实时的日志信息。这些信息的列表、产生的原因以及建议的解决方案, 请阅读如何利用日志中的错误信息进行故障排查?.

wowzamediaserver_access.log中的信息暗示了Wowza Media Server以及Wowza nDVR是否配置争取。如果是, 日志中将会输出DVR初始化完成并从Application.xml文件中读取配置信息。所有这些信息,包括警告和错误都记录在wowzamediaserver_access.log 文件中。

故障排查测试


测试#1: 播放基本的直播流(没有配置nDVR功能的场景)

使用下面的指南配合并验证基本的直播流可以正常工作,这是没有配置nDVR功能的场景,因此Application.xml文件的DVR/Recorders属性应该是没有开启的状态。

element('livestream');?>

测试#2: 播放一个录制流

当你验证了Wowza Media Server可以正常播出直播流后,你可以再将dvr功能激活,然后测试录制的流是否可以播出。 你首先要确认可以在一个服务器环境下正常进行录制和播放,然后再试着配置源/边缘(origin/edge)架构或者播放recorded groups (由Wowza Transcoder创建的StreamNameGroups 或SMIL 文件)。

  1. 要激活dvr功能,请在Application.xml文件中将DVR/Recorders 属性设置为:
    Code:
    <Recorders>dvrrecorder</Recorders>
  2. 使用上面的直播流配置指南测试单个录制流的播放。

如果你不能播放较新的录制流,按下面排查:

  1. 直播流被发布后,检查系统在DVR的存储路径下是否创建了一个录制流的存放目录。默认的配置情况下,在[install-dir]/dvr目录下会创建一个dvr目录。

  2. 检查Application.xml文件中的DVR/Recorders属性是否被设置为:
    Code:
    <Recorders>dvrrecorder</Recorders>
    这个设置将激活Wowza nDVR功能。

  3. 检查Application.xml文件中的Streams/LiveStreamPacketizers属性是否被设置为:
    Code:
    <LiveStreamPacketizers>dvrstreamingpacketizer</LiveStreamPacketizers>
    如果设置的属性不是这个, dvr目录是不会被创建的。

    注意:如果编码器在向Wowza Media Server输出输入流时,中间出现暂停或连接断开,它会让Wowza nDVR停止对直播流的录制。
  4. 检查Application.xml文件中的DVR/Store属性是否设置正确。如果配置不当,会有一条日志信息暗示DVR不能录制及原因。要或的更多关于错误消息及其产生原因的信息,请阅读如何利用日志中的错误信息进行故障排查?

    注意: 如果你在一个更复杂的源/边缘(origin/edge)架构下使用Wowza nDVR功能,那么你不要将这些属性设置在边缘服务器上。 请一定要仔细依据如何在源/边缘(origin/edge)架构下使用Wowza nDVR 功能的指导进行配置以避免错误。
  5. 检查你的archive strategy配置正确。如果对应的DVR录制流存储目录下没有包含录制文件,请检查Application.xml文件中DVR/ArchiveStrategy属性的设置。 默认配置下,这个目录是[install-dir]/dvr。如果配置正确,日志消息将暗示DVR不能录制及其原因。

  6. 检查wowzamedia_access.log文件,暗示Wowza nDVR 已经初始化完成 以及它需要的配置信息。下面是成功运行时的日志消息,其中应用名为live,流的名字(stream name)是myStream
    Code:
    comment    server INFO    200   LiveStreamDvrRecorderBase.initProperties[live/_definst_/myStream] : properties: 
    comment    server INFO    200    DvrStreamManagerBase.initProperties properties: {Properties: }    
    comment    server INFO    200    DvrStreamManagerBase.initProperties chunkCacheClass=com.wowza.wms.dvr.impl.DvrDefaultChunkMemoryCache
    comment    server INFO    200   DvrStreamManagerBase.initStorage[live/_definst_/myStream] : storeName:dvrfilestorage isRecorder:true hasStorage:true        
    comment    server INFO    200    MediaStreamMap.getLiveStreamPacketizer: Create live stream packetizer: dvrstreamingpacketizer:myStream
    comment    server INFO    200    MediaStreamMap.getDvrRecorder: Create DVR Recorder: dvrrecorder:myStream
    comment    server    INFO    200    -DvrStreamManagerBase.internalStartStream[live/_definst_/myStream_delete] :
    上面的问题#1, #2, #3 在wowzamediaserver_access.log 文件有报告。可能是错误的xml文件或在Application.xml中有非法或缺少某个属性导致的失败。 如果你没有看到成功的消息,请阅读如何利用日志中的错误信息进行故障排查? 以获得更多关于Wowza nDVR 启动时错误消息的信息。

  7. 检查Wowza nDVR是否正在录制。如果Wowza nDVR正在录制,在dvr的录制文件存放目录下会有新创建的文件夹,里面有.m4fa 和 .m4fv 文件。

    注意:从Wowza Media Server 3.0.4版本开始,Wowza nDVR 将录制文件的扩展名从.isma 和 .ismv 变为 .m4fa 和 .m4fv.
  8. 检查直播流使用系统所支持的音视频编码格式。
    Code:
    Comment server        INFO 200 DvrPacketHandler.handlePacket[live/_definst_/myStream]: Video codec:H264 isCompatible:true    
    comment    server    INFO    200 DvrStreamStoreBase.initProperties[live/_definst_/myStream/myStream.0] : ChunkOriginURL=null 
    comment    server    INFO    200 DvrStreamStoreBase.initProperties[live/_definst_/myStream /myStream.0] : properties:[dvrChunkGroupingSeconds=600, dvrAllowableAVPacketDelta=2000, dvrResetTimePacketDelta=200, dvrPacketDeltaToNotify=200]    
    comment    server    INFO    200 DvrPacketHandler.handlePacket[live/_definst_/myStream]: Audio codec:AAC isCompatible:true
  9. 检查Application.xml文件中Streams/StreamType的属性是否被设置为:
    Code:
    <StreamType>live</StreamType>
    Application.xml文件中, 默认StreamTypedefault。这是针对VOD点播的设置,并配置Wowza Media Server到[install-dir]\content目录下查找视频文件。如果这个属性被设置为default 而不是 live, 日志中不会有任何DVR相关的错误消息,也不会有任何DVR相关的目录被创建。


测试#3: 在源/边缘(origin/edge)架构下播放直播流的录制文件

仔细依据如何在直播流中继架构(origin/edge)中使用Wowza nDVR AddOn 中的指南进行配置

  1. 检查源(origin)服务器上的Application.xml文件是否配置正确。要获得更多信息,请阅读配置源(origin)服务器

  2. 检查边缘(edge)服务器上的Application.xml文件是否配置正确。要或的更多信息,请阅读配置边缘(edge)服务器

    • 在源(origin)服务器上, HTTPStreamers属性必须被设置为:
      Code:
      <HTTPStreamers>dvrchunkstreaming</HTTPStreamers>
      这使得源(origin)服务器可以将DVR音频流和视频流传送给边缘(edge)服务器。

      在边缘(edge)服务器上,这个属性必须被设置为你希望为DVR流使用流协议。例如:
      Code:
      <HTTPStreamers>cupertinostreaming,smoothstreaming,sanjosestreaming</HTTPStreamers>
    • 边缘(edge)服务器上的DVR/Store属性必须空着,因为只在源(origin)服务器上保存录制的文件。
      Code:
      <Store></Store>
    • 在源(origin)和边缘(edge)服务器上同时将Streams/LiveStreamPacketizers 属性设置为 dvrstreamingrepeater 将导致错误。仅需要在边缘(edge)服务器上这样配置。

  3. 从源(origin)服务器上测试直播流播放。需要配置LiveStreamPacketizers。

  4. 从边缘(edge)服务器上测试直播流播放。需要配置HTTPStreamers。

  5. 从源(origin)服务器上测试DVR播放。

  6. 从边缘(edge)服务器上测试DVR播放。


检查流录制文件的归档策略


如果你将Application.xml文件中的DVR/ArchiveStrategy属性设置为version, 当已经有一个myStream.0目录时,在下面的情况下,一个新的目录会被创建(例如myStream.1)

  • 直播流被断开连接然后重新连接。

  • 直播流超时然后重新连接。

如果你希望将所有录制的流文件放在一个目录下,请将DVR/ArchiveStrategy 属性设置为 append (这是默认的设置)。

如果你希望用现在录制的文件替换之前的相同stream name的录制文件,请将DVR/ArchiveStrategy 属性设置为 delete.

管理编码器的连接断开与重连


Wowza nDVR 功能依赖连续的输入流。编码器可能意外的断开连接然后自动重连。你可以设置一个Wowza nDVR在停止录制前的等待时间(默认是5分钟)。 这个timeout意味着它会等待编码器在断开连接后的重新连接。请阅读如何对Wowza nDVR进行一些高级配置?中的streamTimeout

音频和视频的同步问题


Wowza nDVR 功能希望输入流的音频和视频是同步的。如果输入流有着较短的关键帧间隔并且音频和视频是同步的就能取得最好的效果。

下面日志中的错误消息暗示了一个音频/视频对齐的问题:
Code:
ERROR	server	comment	DvrStreamStoreBase.storeChunks[DVR/_definst_/myCamera.stream/myStream.0] : Skipping chunk. A/V packet times differ by 3025 ms, more than allowed 2000 ms.   aTime=3749903889 vTime=3749906914
音视频同步问题将导致有些数据流片段被丢弃,这样会减少录制的文件。解决这个问题最好的办法是从Wowza nDVR 的上游(通常在编码环节)来解决。因此,我们还是强烈建议你在录制之前解决音视频的同步问题。 你可以在Application.xml文件中设置Wowza nDVR 的属性进行一些补偿来解决这个问题。 了解更多Wowza的产品细节 设置这些属性并没有真正解决同步的问题,但是它可以帮助你更好的工作。请看如何对Wowza nDVR进行一些高级配置?中的dvrPacketSortTimedvrAllowableAVPacketDelta 属性。

录制时缺少音频或视频


如果在录制时发现输入流缺少音频或视频,那么在确定一段数据包的编码后就可能会遇到音频或视频没有出现的情况。 例如,如果只检测到视频,那么只有视频会被录制下来而没有音频。你可以增加Wowza nDVR等待接收音视频编码信息的时间。了解更多Wowza产品细节 请看如何对Wowza nDVR进行一些高级配置?中的dvrWaitForCodecTime属性。

多码率流媒体的对齐


从Wowza Media Server 3.1.2 (patch 15)开始,nDVR会默认在日志中记录关于nDVR片段的信息,它不需要你设置额外的调试参数。 这些信息可以让你检查在一组多码率流媒体中一个流的数据包是否是对齐的。

下面展示了一段日志内容,显示出应用名为liveDVR,直播流的名子(stream name)为livestream1。 其中的数值是音频和视频开始的时间,以及nDVR数据段的时间和包数据段的时间。
LiveStreamDvrRecorder.endChunk[liveDVR/_definst_/livestream1]: Add chunk: ind:0 a/v/k: packets: 84/30/0 durations: 1950/1983/-1 dvrTimes:3/0/-1 pTimes:680182/680179/0
LiveStreamDvrRecorder.endChunk[liveDVR/_definst_/livestream1]: Add chunk: ind:1 a/v/k: packets: 87/30/0 durations: 2020/2000/-1 dvrTimes:1953/1983/-1 pTimes:682132/682162/-1