通过 RTP 流式传输,RTMP 播放质量问题
Streaming via RTP, RTMP playback quality issue
我正在对 H264 进行编码,并使用 RTP 从我的 Android 设备以实时流的形式发送到 Wowza 服务器。编码器的输出在设备上看起来很好。但是,在流式传输到 Wowza 服务器并通过 RTMP 以实时流的形式查看输出视频后,我在视频中有大量 movement/change 的帧部分获得了相当数量的 artifacts/pixelation。我只能猜测这与视频帧的时间有关,但我没有很好的方法来确定这是在我的应用程序的发送端还是在 Wowza 端。
Wowza,如果你曾经试图从他们那里获得支持,那是完全没有用的。
我还遇到了 RTMP/Flash 播放器在从 Wowza 播放时冻结的问题。我很确定这不是带宽问题,因为这发生在 Amazon EC2 服务器以及我的本地 PC 实例(即同一网络)上。我试过多个播放器,它们都出现了相同的问题(VLC、JWPlayer、MX Player 等)。我必须假设问题是 Wowza 服务器或我的编码。但是,由于某些帧存在像素化问题,我开始怀疑两者是否相关。
我很好奇是否有人在使用 Wowza 或任何其他流服务器时遇到过像这样的像素化问题。我尝试使用 RTMPDump 但没有用,它永远不会从 Wowza 中提取完整的数据包。
编码设置在很大程度上影响像素化和伪像。您应该尝试尽可能低的编码设置,然后在确认播放质量后从那里开始。例如,首先测试 188p 流(512x188,基线,256Kbps 比特率),然后升至 288p 等。对于直播流,使用 2 秒的关键帧间隔也是最佳做法;如果你的帧率是30fps,那么你的关键帧频率应该是每60帧。
用于检查关键帧间隔的好工具是 ffprobe:
ffprobe -select_streams v:0 -show_frames -pretty rtmp://yourserver/app/name | grep 'key_frame\|coded_picture_number'
有时流式数据包会突发地到达Wowza 服务器,或者流式数据包流并不顺畅。启用 RTP 抖动缓冲区(在以固定间隔发送到解包器之前收集和存储数据包)可能有助于更均匀的播放。
为此,从您的 Wowza 服务器编辑 conf/[appName]/Application.xml 文件(将 [appName] 替换为您的实时应用程序的名称),并将这些属性添加到 RTP/Properties 容器(有几个,您需要确保将它们添加到正确的容器中)。
<Property>
<Name>rtpDePacketizerWrapper</Name>
<Value>com.wowza.wms.rtp.depacketizer.RTPDePacketizerWrapperPacketSorter</Value>
</Property>
<Property>
<Name>rtpDePacketizerPacketSorterBufferTime</Name>
<Value>500</Value>
<Type>Integer</Type>
</Property>
<Property>
<Name>rtpDePacketizerPacketSorterFlushTime</Name>
<Value>10</Value>
<Type>Integer</Type>
</Property>
完成更改后,确保重新启动 Wowza 服务。
检查您的 Wowza 访问日志 (logs/wowzastreamingengine_access.log) 是否有任何超时或重置消息,因为这些会告诉您软件是否检测到传入流中的任何问题。一个好的做法是跟踪这个日志文件(baretail 是 Windows 上的一个很好的工具),发送你的流,并监控消息。
您还可以为传入的 RTP 流启用额外的调试日志记录以检查数据包丢失。按照 RTP 抖动缓冲区的相同过程,将这些属性添加到应用程序配置文件的 RTP/Properties 容器中。
<Property>
<Name>rtpDePacketizerPacketSorterLogPacketLoss</Name>
<Value>true</Value>
<Type>Boolean</Type>
</Property>
<Property>
<Name>logIncompleteMPEGTSVideoFrames</Name>
<Value>true</Value>
<Type>Boolean</Type>
</Property>
您可以在访问日志中看到额外的调试行。
我正在对 H264 进行编码,并使用 RTP 从我的 Android 设备以实时流的形式发送到 Wowza 服务器。编码器的输出在设备上看起来很好。但是,在流式传输到 Wowza 服务器并通过 RTMP 以实时流的形式查看输出视频后,我在视频中有大量 movement/change 的帧部分获得了相当数量的 artifacts/pixelation。我只能猜测这与视频帧的时间有关,但我没有很好的方法来确定这是在我的应用程序的发送端还是在 Wowza 端。
Wowza,如果你曾经试图从他们那里获得支持,那是完全没有用的。
我还遇到了 RTMP/Flash 播放器在从 Wowza 播放时冻结的问题。我很确定这不是带宽问题,因为这发生在 Amazon EC2 服务器以及我的本地 PC 实例(即同一网络)上。我试过多个播放器,它们都出现了相同的问题(VLC、JWPlayer、MX Player 等)。我必须假设问题是 Wowza 服务器或我的编码。但是,由于某些帧存在像素化问题,我开始怀疑两者是否相关。
我很好奇是否有人在使用 Wowza 或任何其他流服务器时遇到过像这样的像素化问题。我尝试使用 RTMPDump 但没有用,它永远不会从 Wowza 中提取完整的数据包。
编码设置在很大程度上影响像素化和伪像。您应该尝试尽可能低的编码设置,然后在确认播放质量后从那里开始。例如,首先测试 188p 流(512x188,基线,256Kbps 比特率),然后升至 288p 等。对于直播流,使用 2 秒的关键帧间隔也是最佳做法;如果你的帧率是30fps,那么你的关键帧频率应该是每60帧。
用于检查关键帧间隔的好工具是 ffprobe:
ffprobe -select_streams v:0 -show_frames -pretty rtmp://yourserver/app/name | grep 'key_frame\|coded_picture_number'
有时流式数据包会突发地到达Wowza 服务器,或者流式数据包流并不顺畅。启用 RTP 抖动缓冲区(在以固定间隔发送到解包器之前收集和存储数据包)可能有助于更均匀的播放。
为此,从您的 Wowza 服务器编辑 conf/[appName]/Application.xml 文件(将 [appName] 替换为您的实时应用程序的名称),并将这些属性添加到 RTP/Properties 容器(有几个,您需要确保将它们添加到正确的容器中)。
<Property>
<Name>rtpDePacketizerWrapper</Name>
<Value>com.wowza.wms.rtp.depacketizer.RTPDePacketizerWrapperPacketSorter</Value>
</Property>
<Property>
<Name>rtpDePacketizerPacketSorterBufferTime</Name>
<Value>500</Value>
<Type>Integer</Type>
</Property>
<Property>
<Name>rtpDePacketizerPacketSorterFlushTime</Name>
<Value>10</Value>
<Type>Integer</Type>
</Property>
完成更改后,确保重新启动 Wowza 服务。
检查您的 Wowza 访问日志 (logs/wowzastreamingengine_access.log) 是否有任何超时或重置消息,因为这些会告诉您软件是否检测到传入流中的任何问题。一个好的做法是跟踪这个日志文件(baretail 是 Windows 上的一个很好的工具),发送你的流,并监控消息。
您还可以为传入的 RTP 流启用额外的调试日志记录以检查数据包丢失。按照 RTP 抖动缓冲区的相同过程,将这些属性添加到应用程序配置文件的 RTP/Properties 容器中。
<Property>
<Name>rtpDePacketizerPacketSorterLogPacketLoss</Name>
<Value>true</Value>
<Type>Boolean</Type>
</Property>
<Property>
<Name>logIncompleteMPEGTSVideoFrames</Name>
<Value>true</Value>
<Type>Boolean</Type>
</Property>
您可以在访问日志中看到额外的调试行。