内容
开始
对软件环境上的要求
关于硬件加速编码
支持的音视频编码格式
应用和直播流的配置
用Wowza Streaming Engine Manager管理界面配置转码
控制转码流程
用Stream Name Groups实现自适应码流
用XML文件配置
关于硬件加速编码
支持的音视频编码格式
应用和直播流的配置
用Wowza Streaming Engine Manager管理界面配置转码
控制转码流程
用Stream Name Groups实现自适应码流
用XML文件配置
故障排查
开始
对软件环境上的要求
Wowza Transcoder 只能在64位的Windows和Linux系统上运行。此外也不支持Mac OS X 系统。
Wowza Transcoder在64位的Windows Server 上运行时, 系统必须先具备以下功能:
- .NET Framework 3.5.1
- Desktop Experience
关于硬件加速编码
Wowza Transcoder支持Windows和Linux系统下的硬件加速编码功能,我们推荐利用硬件加速编码功能,但这不是必须的。如果你的服务器硬件不支持硬件加速编码,则Wowza Transcoder会用默认的软件编码。
下面的文章介绍了关于这些技术的更多硬件要求:
注意:
- 重要: NVIDIA最新的显卡驱动(340及以上版本)已经不支持NVIDIA CUDA 编码加速功能了。从Wowza Streaming Engine 4.1.2开始不再支持基于CUDA的加速编码.
- 你应该在尝试硬件加速转码技术之前,先使用默认的MainConcept软件转码技术。MainConcept软件不会使用任何硬件加速功能。关于如何调试硬件编码的更多信息,请阅读如何验证Wowza Transcoder正在使用哪一种编码技术。
- 在较新版本的Windows系统上,当Wowza Media Server作为系统服务运行时,由于Session 0 Isolation的安全原因,Intel Quick Sync 和 NVIDIA CUDA 硬件加速功能可能无法使用。要了解更多关于如何解决这个问题,请阅读作为Windows系统服务运行时,Transcoder如何使用硬件加速功能。
- 当使用Windows远程桌面时, Quick Sync 加速可能无法使用。
支持的音视频编码格式
为了将输入流(被称作"channels")进行转码或转换为多个不同输出码率的输出流,Wowza Transcoder 提供了很多功能,它支持以下音视频编码格式:
|
|
* 代表Wowza Transcoder技术预览性支持
这种技术预览性支持意味着这项功能刚刚发布出来用于测试,在Wowza Streaming Engine的后续版中会逐步完善. 因此,目前在使用这些功能时,可能会有一些未知的异常,为了更好的利用这些功能,你需要仔细阅读以下资料:
- 使用H.265视频编码,请阅读如何用Wowza Transcoder配置H.265转码并对外提供直播服务?.
- 使用VP8 和 VP9 视频编码,以及Vorbis 和 Opus 音频编码,请阅读如何用Wowza Transcoder件直播流转码为WebM格式?.
- 目前Wowza Streaming Engine Manager管理界面上还不能对这些编码任务做参数编辑,你只能要XML文件来编辑,请参考用XML文件配置
- 对于mp3格式的音频,系统支持以下采样率: 48000, 44100, 32000
- 当使用硬件加速特性时,不支持H.263 视频输出。
- Instream CEA-608 隐藏字幕(closed caption)可以通过Wowza Transcoder 采用Apple HLS 流媒体被传送给基于iOS的终端设备。要了解更多信息,请阅读如何为HLS流媒体配置隐藏字幕(closed captioning)。
wowza应用和直播流的配置
在开始转码前,你首先需要从编码器推送一个直播流进入Wowza Streaming Engine的直播应用。
用Wowza Streaming Engine Manager管理界面来配置转码
Wowza Transcoder 用一个转码模板文件来定义如何对一个直播流进行转码,Wowza Streaming Engine提供了一些基本的转码模板,可以用于大部分常见需求,包括: Transcode, Transrate和Audio Only。
你可以在Wowza安装目录下的transcoder/templates目录下找到它们,在开始配置转码前,建议你仔细阅读一遍这些转码模板文件,它为你理解转码的配置非常重要。
你可以在Wowza Streaming Engine Manager管理界面中对这些转码模板的参数进行修改。 下面以Transrate转码([install-dir]/transcoder/templates/transrate.xml)为例,在开始前,请先备份这个文件。
启用Transcoder
-
在Applications 面板,点击live, 在点击Transcoder. 在详情页,点击Enable Transcoder.
- 重启application.
编码的参数配置
- 在Setup tab页,在Transcoder Templates下面点击Transrate (Default)选择.
- 在Presets列表中,点击240p的Edit图标
-
将码率设置为240000bps。要了解更多其他参数,请阅读转码模板的细节- 编码参数.
- 在Video Settings部分,在Video Bitrate, 输入240000. 其它参数按默认的就好了。
- 在Frame Size部分,采取默认设置。
- 在Audio Settings 部分,采取默认设置 (Passthrough).
- 在Overlay Images 部分,采取默认设置.
关于在转码时叠加图片,请阅读添加叠加图片.
- 在Video Settings部分,在Video Bitrate, 输入240000. 其它参数按默认的就好了。
- 点击Save以保存设置。
- 在预设的编码输出列表中,点击240p, 然后点击Enable Preset来启用240p。
解码的参数配置
- 点击 Return to Transcoder Template.
-
点击Decoding PresetTab页,再点击Edit对解码参数做修改。
- Description - 这就是一个描述,没啥用
- Decoder Implementation - 解码的实现。请参考转码模板细节 - Decode中关于Video/Implementation的介绍。
- Deinterlace source stream - 如果源流需要,就选择这个Deinterlace,好像是去隔行的意思。
- Overlay Images - 请参考Add graphic overlay了解更多细节。
- Description - 这就是一个描述,没啥用
- 点击Save以保存修改。
叠加图片
你可以在视频上叠加一个静态图片,支持的图片格式包括GIF、JPEG、PNG以及BMP,这样就可以实现类似增加台标这样的需求。你可以自定义图片的位置、对齐方式、透明度。你可以在Encoding Presets中为每一个输出流中定义不同的图片。 如果你要在每一个输出流中叠加同样的图片,那么你可以在Decoding Preset参数中设置。
在编码环节或这是解码环节,都可以在视频上叠加图片,点击Edit, 点击Add Overlay Image按钮
Add Overlay Image对话框出现后,根据你的需求做设置,然后点击Add.
叠加图片的设置
- Image Name - 图片名,用于区分其它图片。
- Image Path - 图片的路径.
- Update overlay image when source image updates -是否定期(750毫秒)对图片文件做检查,当图片被修改时,可以自动生效.
- Width and Height - 图片的宽和高。如果就用原始图片的大小,请选择Same as source image选项。另外,宽和高的最小值是4个像素,也必须是偶数。
- Opacity - 图片的透明度,有效值是从0 (完全透明) 到 100 (完全不透明).
叠加图片的位置设定
- Location - 这个图里模拟了图片在视频界面中的位置,你根据你的需求选择其中一个
-
Horizontal Offset 和 Vertical Offset - 设置一个横向和纵向的偏移量(单位:像素),这是相对于你在Location中选择的基准位置的偏移量。数值最小为0(最好是偶数).
举个例子,相对视频窗口右小角10个像素,你先在Location中选择右小角的位置,然后在Vertical Offset中输入10。
要启用这个图片,选中Enabled复选框,然后点击Save.
你可以为一个输出流,设置多个叠加图片,只要用Move Up 和 Move Down 图标来让它们以正确的顺序呈现即可。 在视频中,排在上面的图片会显示在排在下面的图片的上面.
控制转码流程
一个直播应用中的所有输入流,都可以用一个相同的转码模板,这也是默认的配置。按如下操作:
- 在live菜单中,点击Transcoder, 然后再点击Edit.
- 在Transcoder Options, 去掉Match incoming stream name to template name复选框,再点击Save.
去掉这个复选框是为了让所有输入流都用一个相同的转码模板。
当然,你也可以为每一个输入流配置一个转码模板。按如下操作:
- 在Transcoder Options, 选择Match incoming stream name to template name 复选框,点击Save, 然后重启应用。
- 在Transcoder Templates, 点击Copy Template.
- 在Copy Transcoder Template 对话框中,选择Transcode (Default). 输入新的模板名字(例如myStream),然后点击OK.
-
在这个新的转码模板中,根据需求对编码参数做修改。
这个模板用于名字为myStream的输入流。 只要流的名字和模板名字匹配,就会用相应的模板来转码,如果没有匹配的模板,则会使用Fallback中的模板。
用StreamName逻辑组实现多码率自适应
转码后的多个输出流之间是关键帧对齐的,用以实现码率自适应。Stream Name 逻辑组的作用和用同步多媒体集成语言Synchronized Multimedia Integration Language (SMIL)描述的播放列表文件的作用是一样。
为了播放码率自适应流媒体,各种播放技术采用的播放URL如下所示:
Apple iOS device (Apple HLS/Cupertino)
http://[wowza-ip-address]:1935/live/ngrp:myStream_all/playlist.m3u8Adobe Flash Player (Adobe HDS/San Jose)
http://[wowza-ip-address]:1935/live/ngrp:myStream_all/manifest.f4m注意:
- 要在逻辑组中包含原始的输入流,最好的办法是将输入流加入到一个<Encode> 中,然后将Video/Codec 和 Audio/Codec 都设置为PassThru。同时<StreamName> 必须唯一。
- 你可以为Apple HLS streaming 创建一个逻辑组,其中包含一个只有音频的输出流,类似在How to create Apple App Store compliant streams中的介绍。如果你要这么做, 你需要在逻辑组中添加一个 <MediaListRendition>元素,并且在它的里面设置一个 <WowzaAudioOnly>为 true的元素。下面是一个例子:
<StreamNameGroup> <Name>all</Name> <StreamName>${SourceStreamName}_all</StreamName> <Members> <Member> <EncodeName>source</EncodeName> </Member> <Member> <EncodeName>360p</EncodeName> </Member> <Member> <EncodeName>160p</EncodeName> </Member> <Member> <EncodeName>160p</EncodeName> <MediaListRendition> <WowzaAudioOnly>true</WowzaAudioOnly> </MediaListRendition> </Member> </Members> </StreamNameGroup>
用xml文件来配置
建立一个直播应用,然后对Application.xml文件进行一些配置以使用Wowza Transcoder,请按下面进行:
- 创建一个应用的目录[install-dir]/applications/live.
- 创建一个配置目录[install-dir]/conf/live ,将[install-dir]/conf/Application.xml 文件拷贝到这个新目录下
- 用文本编辑器打开这个新拷贝的Application.xml 文件,然后做如下改动(有些设置可能已经配好了):
- 将Streams/StreamType 设置为:
<StreamType>live</StreamType>
- 将HTTPStreamers 设置为:
<HTTPStreamers>cupertinostreaming,smoothstreaming,sanjosestreaming</HTTPStreamers>
- 将Streams/LiveStreamPacketizers 设置为:
<LiveStreamPacketizers>cupertinostreamingpacketizer,smoothstreamingpacketizer,sanjosestreamingpacketizer</LiveStreamPacketizers>
- 将RTP/Authentication/PlayMethod 设置为:
<PlayMethod>none</PlayMethod>
- 将Transcoder/LiveStreamTranscoder 设置为:
<LiveStreamTranscoder>transcoder</LiveStreamTranscoder>
- 如果输入流是H.264视频编码AAC 或 MP3 音频编码,你希望创建多个不同码率的输出流,以实现码率自适应,请将Transcoder/Templates 设置为:
<Templates>${SourceStreamName}.xml,transrate.xml</Templates>
如果输入流是MPEG-2 或 MPEG-4 Part 2 视频编码,你希望转码为H.264 和 AAC,以面向Wowza支持的例如Adobe Flash播放器、Apple iOS 设备和Microsoft Silverlight的播放器技术, 请将Transcoder/Templates 设置为:
<Templates>${SourceStreamName}.xml,transcode.xml</Templates>
注意: 当使用transcode.xml时,同样也支持多码率自适应。
- 将Streams/StreamType 设置为:
-
(只针对基于RTSP/RTP的编码器),用文本编辑器打开[install-dir]/conf/publish.password文件,添加一个用户名和密码来控制对RTSP/RTP 推流的访问。
下面是一个例子,用户名为myuser,密码为mypassword)。
# Publish password file (format [username][space][password]) # username password myuser mypassword
- 启动 Wowza Media Server.
转码模版的细节
如果你使用系统自带的transrate.xml 或 transcode.xml 模版文件, 转码后的输出流将使用下面的stream names:
- [stream-name]_360p: Main Profile stream
- [stream-name]_160p: Baseline Profile stream
- ngrp:[stream-name]_all: 面向Apple HTTP Live Streaming (cupertino)、 Microsoft Smooth Streaming以及 Adobe HTTP Dynamic Streaming (sanjose)的码率自适应
[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模版文件:
<!-- 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>