通过RTP流式传输,RTMP回放质量问题

时间:2016-02-29 15:26:31

标签: android video-streaming rtmp rtp wowza

我正在编码H264并使用RTP从我的Android设备作为直播流发送到Wowza服务器。编码器的输出在设备上看起来很好。然而,在流式传输到Wowza服务器并将输出视频作为RTMP上的实时流观看之后,我在帧中显着移动/改变的部分中获得了相当数量的伪像/像素化。我只能猜测这与视频帧的时间有关,但我没有很好的方法来确定这是在我的应用程序的发送端还是在Wowza端。

Wowza,如果你曾试图得到他们的支持,那就完全没用了。

从Wowza播放时,我也遇到了RTMP / Flash播放器冻结的问题。我很确定这不是带宽问题,因为这发生在Amazon EC2服务器以及我的本地PC实例(即同一网络)上。我尝试了多个玩家,他们都表现出同样的问题(VLC,JWPlayer,MX Player等)。我必须假设问题是Wowza服务器或我的编码。但是,由于某些帧存在像素化问题,我开始怀疑这两个帧是否相关。

我很好奇是否有人使用Wowza或任何其他流服务器出现像这样的像素化问题。我尝试使用RTMPDump但是没有用,它永远不会从Wowza中提取完整的数据包。

1 个答案:

答案 0 :(得分:4)

编码设置很大程度上会影响像素化和伪像。您应尝试尽可能低的编码设置,然后在确认播放质量后再从那里开始。例如,首先测试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)是否有任何超时或重置消息,因为这些将告诉您软件是否检测到传入流中的任何问题。一个好的做法是将这个日志文件(在Windows上使用baretail是一个很棒的工具),发送你的流并监视消息。

您还可以为传入的RTP流启用其他调试日志记录,以检查数据包丢失。按照RTP Jitter缓冲区的相同过程,将这些属性添加到应用程序配置文件的RTP / Properties容器中。

<Property>
    <Name>rtpDePacketizerPacketSorterLogPacketLoss</Name>
    <Value>true</Value>
    <Type>Boolean</Type>
</Property>
<Property>
    <Name>logIncompleteMPEGTSVideoFrames</Name>
    <Value>true</Value>
    <Type>Boolean</Type>
</Property>

您可以在访问日志中看到其他调试行。