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

Posted

技术标签:

【中文标题】通过 RTP 流式传输,RTMP 播放质量问题【英文标题】:Streaming via RTP, RTMP playback quality issue 【发布时间】:2016-02-29 15:26:31 【问题描述】:

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

Wowza,如果你曾经试图从他们那里获得支持,那是完全没用的。

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

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

【问题讨论】:

【参考方案1】:

编码设置在很大程度上影响像素化和伪影。您应该尝试尽可能低的编码设置,然后在确认播放质量后从那里开始。例如,首先测试一个 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>

您可以在访问日志中看到额外的调试行。

【讨论】:

你的回答是迄今为止我所读过的关于这个问题的最全面的回答。我非常感谢你花时间彻底解释这一点。今晚我将有机会实施和测试它,我一定会在此处更新状态,以防其他人遇到此问题。再次,非常感谢。 你有丢包和不完整视频帧日志消息的例子吗? 在您的日志/wowzastreamingengine_access.log 中,查找类似以下内容的消息:RTPDePacketizerMPEGTS.flushVideoBuffer: Video frame incomplete, drops[33048:0:false]

以上是关于通过 RTP 流式传输,RTMP 播放质量问题的主要内容,如果未能解决你的问题,请参考以下文章

RTP/RTCP协议介绍

ffmpeg - 通过 RTMP 连续文件流式传输

如何在 kurento 媒体服务器中进行 rtmp 流式传输?

ExoPlayer 无法播放 Adob​​e 实时流编码器流式传输的音频/视频 (RTMP)

重新流式传输实时 rtmp 流

我们可以在 ios 应用程序中进行 RTMP 流式传输吗?