这篇文章详细介绍了Wowza Transcoder 插件如何将一个输入流进行实时解码再重新编码以输出播放终端所需要的格式,并且输出的多个不同码率的流是关键帧对齐的,以实现码率自适应。
注意: 本文只针对Wowza Media Server? 3.0.0 及以上版本。
内容开始
故障排查 开始对硬件和驱动的要求Wowza Transcoder 只能在64位的Windows和Linux系统上运行。此外也不支持Mac OS X 系统。 Wowza Transcoder在64位的Windows Server 上运行时, 系统必须先具备以下功能:
硬件加速 Wowza Transcoder 支持Windows 和 LinuxIntel系统上的Quick Sync 和 NVIDIA NVENC 加速编码以及Windows系统上的NVIDIA CUDA 加速编码。 下面的文章介绍了关于这些技术的更多硬件要求:
注意:
支持的音视频编码格式为了将输入流(被称作"channels")进行转码或转换为多个不同输出码率的输出流,Wowza Transcoder 插件提供了很多功能,它支持以下音视品编码格式: 输入流:
输出流:
注意:
关于Transcoder模版Wowza Transcoder 使用一个模版系统来为输出流创建转码后的输出流,这个模版可以控制各种编码参数。在[install-dir]/transcoder/templates目录下有三个默认的模版文件,基本满足了常规的转码要求: transrate.xml, transcode.xml, 以及 audioonly.xml。 要了解更多关于个性化的的转码模版,请阅读模版的配置. Wowza Transcoder 模版系统提供一个将多个输出流组合在一个逻辑组的方法(被称作 Stream Name Groups)。可以用ngrp:前缀来引用这个逻辑组以实现码率自适应。 Server.license 的配置(Wowza Media Server Perpetual Edition)Wowza Media Server和增值插件的授权码(license key) (包括Wowza Transcoder 插件)被存储在[install-dir]/conf/Server.license。
试用、日租、月租模式的授权只需要一个license key,但是永久授权模式需要多个license key。 使用增值插件时,用文本编辑器打开Server.license文件,在每一个新行输入一个新的license key。当服务被重启后,新的license将会生效。 由于多个授权码是叠加的,因此在添加一个新的授权码时,去保留文件中原有的授权码,然后在新的一行填写新的授权码。多个授权码在文件中的前后顺序是无关紧要的。 授权码的前5位和后5位字符将显示在控制台的输出中信息。 下面是一个Server.license 文件的示例,包括一个永久授权的Wowza Media Server 授权码、两个Wowza Transcoder 插件授权码以及一个Wowza nDVR 插件授权码:
SVRP3-LaGpC-ZrTD9-F4Y3S-a9bR2-h5t3C
TRN23-Ry6qe-4mT8J-yKj2W-4N5sH-2Td3a TRN13-y9Gj2-kneqT-2zjHp-GadzB-N6fwa DVRA3-k3r3R-nzxCB-ypjs5-Sk3y9-ahFdF Application.xml的配置建立一个直播应用,然后对Application.xml文件进行一些配置以使用Wowza Transcoder插件,请按下面进行:
模版的配置如果你使用系统自带的transrate.xml 或 transcode.xml 模版文件, 转码后的输出流将使用下面的stream names:
[stream-name] 是输入到Wowza Media Server的输入流。例如,一个输入是myStream, 那么转码后的输出流就是myStream_360p、myStream_160p以及 ngrp:myStream_all。 转码的工作机制很简单。推送到live应用的所有输入流将被采用在[install-dir]/conf/[application]/Application.xml文件Transcoder/Templates中设置的转码模版文件中的参数来转码。 你可以根据需要配置多个转码后的输出流。 让我们仔细看以下转码模版中的配置。下面是随Wowza Media Server安装后自带的transrate.xml模版文件: Code:
<!-- Example template for transrate, producing four new streams at different bitrates. Resultant streams can be played back individually or as a group. source, 360p and 160p encode blocks are enabled through the Enable property, other examples are not enabled. Add additional encode blocks to your template as needed. --> <Root> <Transcode> <Encodes> <!-- Example Encode block for source, not required unless Member of StreamNameGroup. --> <Encode> <Enable>true</Enable> <Name>source</Name> <StreamName>mp4:${SourceStreamName}_source</StreamName> <Video> <!-- H.264, H.263, PassThru, Disable --> <Codec>PassThru</Codec> <Bitrate>${SourceVideoBitrate}</Bitrate> <Parameters> </Parameters> </Video> <Audio> <!-- AAC, PassThru, Disable --> <Codec>PassThru</Codec> <Bitrate>${SourceAudioBitrate}</Bitrate> <Parameters> </Parameters> </Audio> <Properties> </Properties> </Encode> <!-- Setup for 720p, high bandwith, main profile for desktop or set-top box --> <Encode> <Enable>false</Enable> <Name>720p</Name> <StreamName>mp4:${SourceStreamName}_720p</StreamName> <Video> <!-- H.264, H.263, PassThru, Disable --> <Codec>H.264</Codec> <!-- default, CUDA, QuickSync, NVENC --> <Transcoder>default</Transcoder> <GPUID>-1</GPUID> <FrameSize> <!-- letterbox, fit-width, fit-height, crop, stretch, match-source --> <FitMode>fit-height</FitMode> <Width>1280</Width> <Height>720</Height> <!-- <Crop>0,0,0,0</Crop> --> <!-- <SourceRectangle>0,0,320,240</SourceRectangle> --> </FrameSize> <!-- baseline, main, high --> <Profile>main</Profile> <Bitrate>1300000</Bitrate> <KeyFrameInterval> <FollowSource>true</FollowSource> <Interval>60</Interval> </KeyFrameInterval> <Overlays> <Overlay> <Enable>false</Enable> <Index>0</Index> <ImagePath>${com.wowza.wms.context.VHostConfigHome}/content/wowzalogo.png</ImagePath> <CheckForUpdates>false</CheckForUpdates> <Opacity>100</Opacity> <Location> <X>4</X> <Y>4</Y> <Width>${ImageWidth}</Width> <Height>${ImageHeight}</Height> <!-- horiz: left, right, hcenter - vert: top, bottom, vcenter --> <Align>left,top</Align> </Location> </Overlay> </Overlays> <Parameters> </Parameters> </Video> <Audio> <!-- AAC, PassThru, Disable --> <Codec>PassThru</Codec> <Bitrate>${SourceAudioBitrate}</Bitrate> <Parameters> </Parameters> </Audio> <Properties> </Properties> </Encode> <!-- Setup for 360p, high bandwith, main profile for desktop --> <Encode> <Enable>true</Enable> <Name>360p</Name> <StreamName>mp4:${SourceStreamName}_360p</StreamName> <Video> <!-- H.264, H.263, PassThru, Disable --> <Codec>H.264</Codec> <!-- default, CUDA, QuickSync, NVENC --> <Transcoder>default</Transcoder> <GPUID>-1</GPUID> <FrameSize> <!-- letterbox, fit-width, fit-height, crop, stretch, match-source --> <FitMode>fit-height</FitMode> <Width>640</Width> <Height>360</Height> <!-- <Crop>0,0,0,0</Crop> --> <!-- <SourceRectangle>0,0,320,240</SourceRectangle> --> </FrameSize> <!-- baseline, main, high --> <Profile>main</Profile> <Bitrate>850000</Bitrate> <KeyFrameInterval> <FollowSource>true</FollowSource> <Interval>60</Interval> </KeyFrameInterval> <Overlays> <Overlay> <Enable>false</Enable> <Index>0</Index> <ImagePath>${com.wowza.wms.context.VHostConfigHome}/content/wowzalogo.png</ImagePath> <CheckForUpdates>false</CheckForUpdates> <Opacity>100</Opacity> <Location> <X>4</X> <Y>4</Y> <Width>${ImageWidth}</Width> <Height>${ImageHeight}</Height> <!-- horiz: left, right, hcenter - vert: top, bottom, vcenter --> <Align>left,top</Align> </Location> </Overlay> </Overlays> <Parameters> </Parameters> </Video> <Audio> <!-- AAC, PassThru, Disable --> <Codec>PassThru</Codec> <Bitrate>${SourceAudioBitrate}</Bitrate> <Parameters> </Parameters> </Audio> <Properties> </Properties> </Encode> <!-- Setup for 240p, medium bandwidth, baseline profile --> <Encode> <Enable>false</Enable> <Name>240p</Name> <StreamName>mp4:${SourceStreamName}_240p</StreamName> <Video> <!-- H.264, H.263, PassThru, Disable --> <Codec>H.264</Codec> <!-- default, CUDA, QuickSync, NVENC --> <Transcoder>default</Transcoder> <GPUID>-1</GPUID> <FrameSize> <!-- letterbox, fit-width, fit-height, crop, stretch, match-source --> <FitMode>fit-height</FitMode> <Width>360</Width> <Height>240</Height> <!-- <Crop>0,0,0,0</Crop> --> <!-- <SourceRectangle>0,0,320,240</SourceRectangle> --> </FrameSize> <!-- baseline, main, high --> <Profile>baseline</Profile> <Bitrate>350000</Bitrate> <KeyFrameInterval> <FollowSource>true</FollowSource> <Interval>60</Interval> </KeyFrameInterval> <Overlays> <Overlay> <Enable>false</Enable> <Index>0</Index> <ImagePath>${com.wowza.wms.context.VHostConfigHome}/content/wowzalogo.png</ImagePath> <CheckForUpdates>false</CheckForUpdates> <Opacity>100</Opacity> <Location> <X>4</X> <Y>4</Y> <Width>${ImageWidth}</Width> <Height>${ImageHeight}</Height> <!-- horiz: left, right, hcenter - vert: top, bottom, vcenter --> <Align>left,top</Align> </Location> </Overlay> </Overlays> <Parameters> </Parameters> </Video> <Audio> <!-- AAC, PassThru, Disable --> <Codec>PassThru</Codec> <Bitrate>${SourceAudioBitrate}</Bitrate> <Parameters> </Parameters> </Audio> <Properties> </Properties> </Encode> <!-- Setup for 160p, low bandwith, baseline profile for 3G mobile devices such as iOS, Android, Blackberry --> <Encode> <Enable>true</Enable> <Name>160p</Name> <StreamName>mp4:${SourceStreamName}_160p</StreamName> <Video> <!-- H.264, H.263, PassThru, Disable --> <Codec>H.264</Codec> <!-- default, CUDA, QuickSync, NVENC --> <Transcoder>default</Transcoder> <GPUID>-1</GPUID> <FrameSize> <!-- letterbox, fit-width, fit-height, crop, stretch, match-source --> <FitMode>fit-height</FitMode> <Width>284</Width> <Height>160</Height> <!-- <Crop>0,0,0,0</Crop> --> <!-- <SourceRectangle>0,0,320,240</SourceRectangle> --> </FrameSize> <!-- baseline, main, high --> <Profile>baseline</Profile> <Bitrate>200000</Bitrate> <KeyFrameInterval> <FollowSource>true</FollowSource> <Interval>60</Interval> </KeyFrameInterval> <Overlays> <Overlay> <Enable>false</Enable> <Index>0</Index> <ImagePath>${com.wowza.wms.context.VHostConfigHome}/content/wowzalogo.png</ImagePath> <CheckForUpdates>false</CheckForUpdates> <Opacity>100</Opacity> <Location> <X>4</X> <Y>4</Y> <Width>${ImageWidth}</Width> <Height>${ImageHeight}</Height> <!-- horiz: left, right, hcenter - vert: top, bottom, vcenter --> <Align>left,top</Align> </Location> </Overlay> </Overlays> <Parameters> </Parameters> </Video> <Audio> <!-- AAC, PassThru, Disable --> <Codec>PassThru</Codec> <Bitrate>${SourceAudioBitrate}</Bitrate> <Parameters> </Parameters> </Audio> <Properties> </Properties> </Encode> <!-- Setup for H.263, low bandwith, streaming to older mobile devices --> <Encode> <Enable>false</Enable> <Name>h263</Name> <StreamName>mp4:${SourceStreamName}_h263</StreamName> <Video> <!-- H.264, H.263, PassThru, Disable --> <Codec>H.263</Codec> <!-- default, CUDA, QuickSync, NVENC --> <Transcoder>default</Transcoder> <GPUID>-1</GPUID> <FrameSize> <!-- letterbox, fit-width, fit-height, crop, stretch, match-source --> <FitMode>letterbox</FitMode> <Width>176</Width> <Height>144</Height> <!-- <Crop>0,0,0,0</Crop> --> <!-- <SourceRectangle>0,0,320,240</SourceRectangle> --> </FrameSize> <!-- baseline, main, high --> <Profile>baseline</Profile> <Bitrate>150000</Bitrate> <KeyFrameInterval> <FollowSource>false</FollowSource> <Interval>60</Interval> </KeyFrameInterval> <Overlays> <Overlay> <Enable>false</Enable> <Index>0</Index> <ImagePath>${com.wowza.wms.context.VHostConfigHome}/content/wowzalogo.png</ImagePath> <CheckForUpdates>false</CheckForUpdates> <Opacity>100</Opacity> <Location> <X>4</X> <Y>4</Y> <Width>${ImageWidth}</Width> <Height>${ImageHeight}</Height> <!-- horiz: left, right, hcenter - vert: top, bottom, vcenter --> <Align>left,top</Align> </Location> </Overlay> </Overlays> <Parameters> </Parameters> </Video> <Audio> <!-- AAC, PassThru, Disable --> <Codec>AAC</Codec> <Bitrate>64000</Bitrate> <Parameters> </Parameters> </Audio> <Properties> </Properties> </Encode> </Encodes> <Decode> <Video> <Deinterlace>false</Deinterlace> <Overlays> <Overlay> <Enable>false</Enable> <Index>0</Index> <ImagePath>${com.wowza.wms.context.VHostConfigHome}/content/wowzalogo.png</ImagePath> <CheckForUpdates>false</CheckForUpdates> <Opacity>100</Opacity> <Location> <X>4</X> <Y>4</Y> <Width>${ImageWidth}</Width> <Height>${ImageHeight}</Height> <!-- horiz: left, right, hcenter - vert: top, bottom, vcenter --> <Align>left,top</Align> </Location> </Overlay> </Overlays> <Parameters> </Parameters> </Video> <Properties> </Properties> </Decode> <StreamNameGroups> <!-- Note: Play stream using stream name ngrp:[stream-name] --> <StreamNameGroup> <Name>all</Name> <StreamName>${SourceStreamName}_all</StreamName> <Members> <Member> <EncodeName>source</EncodeName> </Member> <Member> <EncodeName>720p</EncodeName> </Member> <Member> <EncodeName>360p</EncodeName> </Member> <Member> <EncodeName>240p</EncodeName> </Member> <Member> <EncodeName>160p</EncodeName> </Member> </Members> </StreamNameGroup> <StreamNameGroup> <Name>mobile</Name> <StreamName>${SourceStreamName}_mobile</StreamName> <Members> <Member> <EncodeName>240p</EncodeName> </Member> <Member> <EncodeName>160p</EncodeName> </Member> </Members> </StreamNameGroup> </StreamNameGroups> <Properties> </Properties> </Transcode> </Root> 这部分是编码的设置。一个包含多个<Encode> 的模版.
模版细节: <Decode>...</Decode> 这个部分是解码时的设置。一个模版只有一个<Decode> 的设置.
模版细节: <StreamNameGroup>...</StreamNameGroup> 这个部分的设置是为了实现多码率自适应而定义的一个输出流的逻辑组。<Name> 是逻辑组的名字。<StreamName> 用于在使用Apple HLS、Adobe HDS或Microsoft Smooth Streaming流媒体技术时,为实现码率自适应而使用的stream name。例如,有一个 stream name为 myStream的输入流,然后将前面的逻辑组的stream name设置为myStream_all。 当对这个部分进行设置之前,你首先要定义每一个编码后的输出流,并确保它们可以正常播放。 用StreamName逻辑组实现多码率自适应转码后的多个输出流之间是关键帧对齐的,用以实现码率自适应。Stream Name 逻辑组的作用和用同步多媒体集成语言Synchronized Multimedia Integration Language (SMIL)描述的播放列表文件的作用是一样。 为了播放码率自适应流媒体,各种播放技术采用的播放URL如下所示: Apple iOS device (Apple HLS/Cupertino) Code:
http://[wowza-ip-address]:1935/live/ngrp:myStream_all/playlist.m3u8 Code:
http://[wowza-ip-address]:1935/live/ngrp:myStream_all/manifest.f4m Code:
http://[wowza-ip-address]:1935/live/ngrp:myStream_all/Manifest
注意:
如何控制转码流程默认配置下,所有的转码会话都使用一个转码模版。 按下面的配置,为每一个应用配置一个模版文件:
注意: 在下面的操作指南中,用你的应用名替换[application]。
转码模版也可以只针对某一个输入流(stream name),请按下面操作进行:
注意: 在下面的操作指南中,将[streamName] 替换为你的输入流的stream name。
|
|