多协议、性能稳定、丰富API的流媒体服务器软件
Wowza nDVR快速上手指南
这篇文章可以帮助你快速了解如何使用Wowza nDVR。

内容



介绍

Wowza nDVR传输流的基本概念

安装和配置

最佳实践

常见问题


介绍



总览


Wowza Streaming Engine提供了在对直播流录制的同时,允许用户播放、暂停、倒回到之前的一个录制点,或者回到当前直播点的能力。
此外,还有一些个性化的配置让你可以控制录制流的归档策略,以及它是否可用于对外提供流传输服务。此外,Wowza nDVR 需要输入流的音频和视频是同步的。

在Wowza Streaming Engine中配置Ndvr功能和配置基础的直播流应用基本类似,可以很容易被添加到现有的Wowza Streaming Engine的配置中。

Wowza Ndvr传输流的基本概念




传输流的类型


Wowza nDVR 支持live类型的传输流以及在直播流中继(origin/edge)架构中使用的liverepeater-edge传输流类型:

  • live: 发布和播放直播内容(特别是针对1对多的直播节目)。

  • liverepeater-edge: 边缘(edge)传输流类型,用于在直播流中继(origin/edge)架构中传输单个流。

要配置Wowza nDVR 直播流中继,请参考如何在直播流中继架构中配置Wowza nDVR功能?

支持的媒体格式


Wowza nDVR 支持下面的视频和音频编码格式:

视频

  • H.264
  • 纯视频流

音频

  • AAC
  • MP3
  • 纯音频流

Wowza nDVR 很灵活,它可以通过配置支持多种业务流程。输入流可以是H.264视频以及AAC或MP3音频。当然也支持纯音频或纯视频的输入流。了解关于Wowza的产品细节

支持的传输协议和播放器


Wowza Media Server 可以使用下面的HTTP协议传输H.264编码的流:

  • Apple HTTP Live Streaming (Apple HLS)
  • MPEG-DASH

使用HLS播放
http://[wowza-ip-address]:1935/dvr/myStream/playlist.m3u8?DVR
			


码率自适应流传输


当Wowza nDVR 功能被添加到你的直播业务流程中,你可以为直播流使用Synchronized Multimedia Integration Language (SMIL) 文件。 SMIL的工作机制需要你的编码器能够从一个输入源生成不同码率的、关键帧对齐的多个输出流。

码率自适应的播放URL

smil:前缀被用于播放用SMIL文件定义的一个输出流的组合。要看SMIL文件的例子,请阅读在如何实现多码率自适应中的"Adaptive bitrate streaming"主题。


使用Apple iOS 设备(Cupertino/Apple HLS):

在设备的Safari Web浏览器上输入下面的URL:
http://[wowza-ip-address]:1935/live/smil:myStream.smil/playlist.m3u8?DVR
		

注意: 播放URL可以包含大写的"DVR" 或小写的"dvr"。


安装和配置




应用配置


要为直播流配置Wowza nDVR功能,请阅读如何为直播业务配置和运行Wowza nDVR功能?

录制内容的存储


当Wowza nDVR开始对直播流进行录制时,将会创建一个内容存储目录。这个内容存储目录定义在Application.xml文件的DVR/StorageDir属性中。 默认的位置为[install-dir]/dvr/[app-name]/_definst_/[streamName].[n]

如果应用名([app-name]) 是 live,流的名字([streamName]myStream,在Application.xml的默认设置下,存储目录将会位于[install-dir]/dvr/live/_definst_/myStream.0

如果你将DVR/StorageDir属性设置为E:/myStorage ,你的流的名字为myStream, 存储目录将位于E:/myStorage/live/_definst_/myStream.0

目录结构

当Wowza nDVR 录制直播流时,它会默认在存储目录下每隔600秒(10分钟)创建一个新的文件夹。这个文件夹的的命名规则为HHHH_MM_SS 其中 H = hours, M = minutes, S = seconds. 举个例子,如果Wowza nDVR 录制直播流1小时10分钟,那么内容存储目录下将包含下面的文件夹:

0000_00_00
0000_10_00
0000_20_00
0000_30_00
0000_40_00
0000_50_00
0001_00_00
0001_10_00
manifest.txt

每一个用时间戳表示的文件夹下都包含一些.m4fa (音频数据) 和 .m4fv (视频数据) 文件以及一个.txt (manifest) 文件。
如果输入流包含metadata数据,则还会创建一个.m4fm (metadata)文件。 这些文件采用MPEG-4格式编码,它们一起表示一段音频和视频的切片数据,它将被用于DVR播放。 以0000_00_00文件夹为例,第一个切片的相关文件如下:

A-0000_00_00_000.m4fa
dvrManifest_0000_00_00.txt
M-0000_00_00_000.m4fm
V-0000_00_00_000.m4fv

在时间戳表示的文件夹下的这些文件的名字规则是在其所属文件夹的名字前加上一个A (audio)、V(video) 或 M(metadata) 在加上一个毫秒为单位的时间戳(A-HHHH_MM_SS_mmm)。

重要: 不要删除或移动任何这些文件,否则将会出现播放错误。

录制内容的归档策略


你可以配置一个归档策略,用于告诉nDVR插件:如果已经有了一个同名的流存储目录,当有一个新的采用同样的应用名和同样的流名的流到来时该如何处理。(例如,当编码器断开又重新连接后)。 这个策略由Application.xml文件中的DVR/ArchiveStrategy属性控制。 你可以将这个属性设置为以下类型:

  • append: 让Wowza nDVR 将录制的数据追加到已有的存储目录下。这是默认的设置。

  • delete: 让Wowza nDVR 将已有的录制存储删除掉,用新的代替。

  • version: 让Wowza nDVR 创建一个新的录制存储目录。假设流名为myStream,第一次的录制数据将被存储在[install-dir]/dvr/[application-name]/myStream.0目录下,第二次的录制数据将被存储myStream.1目录下,以此类推。无论之前是否有同名的录制数据,之前的都会不会被删除或覆盖。


DVR 平移窗口时长


你可以设置一个时长(单位秒),用来约定在DVR存储的录制数据中,哪些时间范围之内的数据是可以播放的。这个时长是一个平移窗口,它从当前直播点开始,然后向后倒推。在这个时间窗口之外的旧数据将被文件系统清除掉。 这个时长的值由Application.xml文件中的DVR/WindowDuration属性控制。默认的WindowDuration0 ,意味着所有录制的数据都是可以用于DVR播放的。


最佳实践



音频和视频的同步


Wowza nDVR 希望输入流的音频和视频是同步的。因此,输入流有较短的关键帧间隔,并且音频和视频同步,可以实现最好的时移效果。 了解Wowza产品的细节 当音频和视频不同步过了容忍的限度,你将会在[install-dir]/logs中看到下面的警告信息:
WARN  DvrPacketHandler.handlePacket[live/_definst_/myStream]: Tossing packet with excessive duration: {DvrAMFPacket: size:6785, type:9, src:32185, seq:126, absTimecode: 35557077, timecode:131362, utcTc:1337890914597}
如果遇到不同步问题,你可以在Application.xml文件中设置参数来做一些补偿。然而,Wowza nDVR不能彻底解决这个问题。请看Wowza Ndvr插件的一些高级配置中关于dvrAllowableAVPacketDelta参数的介绍。 注意,这个属性对音频和视频不同步的情形有一定帮助。如果你已经有不同步的问题,简单地将这个参数的默认值增大可能会导致更多的问题,比如可能会导致部分视频或音频被丢弃(没有相应的录制切片),这将导致整体的播放质量变得更加不可接受。

关键帧间隔大小


一般来说,HTTP切片流传输至少有三个切片的延时,这就是为什么Wowza推荐使用更小的关键帧间隔。更小的关键帧间隔会让播放列表中有更多的数据。 因此,当确定你的编码器设置时,请考虑到播放列表的大小以及从服务器发送出来的频率。

稳定的直播流


Wowza nDVR需要你的直播流是稳定的。当对Wowza nDVR做故障排查时,首先要测试的是在没有使用nDVR功能时,你的直播流是可以正常稳定地播放。

录制长度


对于一个不间断的直播输入流来说,Wowza nDVR 录制的最大时长为30小时。在实际部署环境下,处理这么大的播放列表数据是无法工作的(假设一个切片10秒,如果你要提供30小时的播放列表,这个列表中就得有30*60*60/10 = 10800个切片的描述信息,预计光这个播放清单就得500多KByte大小,相当于4Mbps的码率啊!并且直播还没有结束,还在继续,你总得每隔几秒更新一次这个列表,你想想这可以接受吗?)。同时,如果在录制过程中发生问题(磁盘满了、网络故障、内存不够等) 会影响整个录制数据。超大的manifest文件也可能会引起性能问题,因为整个manifest文件必须被加载到内存中。 因此要选择一个策略,将数据录制到一个合理的长度,这样小一点的manifest文件可以被快速加载到内存也可以快速从内存中丢弃。 如果录制的数据中只有一小部分会被用来对外提供流播放服务,那么稍长一些的录制数据也是可以的。 例如,一个24小时的录制数据但只有1或2个小时播放窗口对比一个涵盖整个24小时录制数据的播放列表而言有较小的播放列表。 因为你每隔几秒(基于关键帧大小)就要重复请求播放列表(以获取最新的直播内容); 因此,一个超大的播放列表会导致播放故障,应该避免这种情况的发生。 要了解更多关于如何请求录制数据的一部分来播放,请阅读如何使用Wowza nDVR的 playlist request API


推荐的基于OSMF的播放器


我们推荐使用OSMF2.0版本,OSMF的用户报告说当用更早的版本时会遇到缓存上的一些问题。随Wowza Media Server 3.5.0 (或更高版本)一同安装的Strobe播放器位于[install-dir]/examples/LiveDVRStreaming/FlashHTTPPlayer/player.html,它使用默认的缓存参数。

内建的兼容机制


Wowza nDVR 有一些内建的兼容机制,而不需要任何附加的配置。

如果Wowza nDVR 检测到一个无效的数据段,如果时钟重置后,它将会通过重新计算尝试对错误进行修复。如果它不能修复这个问题,这个数据段将被抛弃。例如,视频数据远远超前于音频数据的一个有问题的输入流可能会导致一段无效的数据段。如果遇到这种问题,在日志中将会出现类似下面的警告信息:
WARN LiveStreamDvrRecorder.endChunk[live/_definst_/myStream]: Recalculating duration by estimating.  Was -601.  Is now 811.
WARN  DvrPacketHandler.handleHolder(): Skipping holder that cannot be re-aligned. Holder: {DvrPacketHolder: type:V pt:3332574 utc:1335872445912 dur:1230 (KEY, ) codec:7 numPackets:0 dataLen:18513 enc.n:0 pkt:{{DvrAMFPacket: size:18513, type:9, src:1, seq:0, absTimecode: 3332574, timecode:1230, utcTc:1335872445912}}}


一些常见问题



请举个例子,介绍一下什么是灵活地从某个时间点开始观看直播内容?


Wowza nDVR 适用于哪些希望对直播流进行录制并可以灵活播放的应用场景。如果你在某个时间点有一个临时的直播活动,比如产品发布会、演讲会、音乐会、体育赛事等,你可以将这个活动直播出来提供给实时用户,但有的用户可能迟到了10来分钟,这时候你可以为这些用户提供以下灵活的观看体验:

  1. 对于在直播活动一开始就观看的用户,他/她在观看时可以倒回到之前的某一个视频片段上观看,之后又可以回到当前直播点继续观看。

  2. 如果用户迟到了,他们可以从直播开始后的时间观看,直到直播活动结束。在这个场景下,用户可以从直播开始后的任意时间起观看--1 分钟后或1 小时后。

  3. 用户可以在直播活动结束后观看。在这个场景下,播放时是将已经录制的内容当作VOD播放的。

我在什么时候需要用Wowza nDVR来实现录制功能?


Wowza nDVR 适用于当你在录制直播流时希望可以进行暂停、回退、重新回到当前直播点等操作的应用场景。其它Wowza Media Server支持的录制方法,比如直播流的录制live-record stream type, 适用于当你希望将录制的数据封装到MP4或FLV文件中用于日后的VOD播放的应用场景。

如果我已经有了一个配置好的Wowza直播应用,为实现nDVR功能,我是否需要另外再创建一个Wowza应用?


不需要,你可以很容易的将nDVR功能加入到已有的直播应用中。详细步骤,请阅读如何为直播业务配置和运行Wowza nDVR功能?。 如果你有多种应用流程,例如有一些直播流是不需要录制的或者你希望为不同的输入流应用不同的DVR录制参数,那么你可以为每一个应用流程配置一个应用。

当直播活动和录制都已经结束后,我如何播放录制的内容?


请保持当前Wowza直播应用的配置,哪怕是直播流已经停止发布了。播放的URL和你观看直播流的URL是一样的。 请看如何为直播业务配置和运行Wowza nDVR功能?中的"Playback"部分,以了解播放的URL。

在播放时,我如何设定一个开始时间和结束时间?


要了解更多关于如何控制播放请求(它可以带有一个开始时间和可选的结束时间),请阅读如何使用Wowza nDVR Playlist Request API?.

当我的输入流中断时,nDVR录制会发生什么?


当输入重新连接时,Wowza nDVR 会重新开始录制。streamTimeout参数设置了Wowza Media Server在停止录制前等待数据包到来的时间。 默认的参数值被设置为从编码器断开连接到重新连接的时间。要了解更多,请阅读Wowza Ndvr插件的一些高级配置中关于streamTimeout的介绍。

我是否可以用RTSP、RTP、RTMP协议来播放Wowza nDVR的录制流?


目前Wowza nDVR录制流的播放仅支持HTTP协议:

  • Apple HTTP Live Streaming (Apple HLS)
  • MPEG-DASH

同样一个流的名字,我怎么才能播放之前一个流的内容?


如果ArchiveStrategy属性的值被设置为version,那么你在播放的URL中设置要播放哪一个录制流版本。例如,下面的URL:

http://localhost:1935/live/myStream.3/playlist.m3u8?dvr

上面的URL表示通过HLS协议播放Wowza Server上的应用live上的录制流myStream的"版本3"的内容。

要了解更多如何控制你的nDVR录制工作,请阅读如何使用Wowza Ndvr插件的录制API

如何解决Strobe播放器的#2032错误?


这个错误表示没有找到对应的流。它可能是由于错误的URL或直播流不可用。

dvrstreamingpacketizer 做了什么?


这个封包器获得一个输入流,并通过Wowza nDVR录制功能将数据保存下来。作为Wowza nDVR功能的一部分配置。你需要在Application.xml中的Streams/LiveStreamPacketizers部分添加dvrstreamingpacketizer参数。 此外,你还要在这个配置中添加其它直播流封包器参数(cupertinostreamingpacketizer, smoothstreamingpacketizer, sanjosestreamingpacketizer),以使用支持这些协议的播放器和设备。

如果我没有设置存储位置将会发生什么?


Wowza nDVR 将使用默认设置:
<Store>dvrfilestorage</Store>
		
在直播中继(origin/edge)架构下,这个属性必须空着。要了解更多,请阅读 如何在直播流中继架构(origin/edge)下使用Wowza nDVR 插件