在H.264 MPEG-TS流上使用Microsoft MPEG-TS解复用器和H.264解码器时,为什么会出现这些伪影?

时间:2013-05-03 15:09:01

标签: directshow h.264 gstreamer live-streaming mpeg2-ts

我已经编写了一个实时推送过滤器,它可以获得包含h.264视频和aac音频的mpeg-ts流。我设置了一个directshow管道并配置输出引脚。我可以渲染h.264流但是我在渲染中得到了工件,从使用videotestsrc和“ball”模式从gstreamer流式传输时可以看到这个截图。the "ball" pattern这个截图应该只包含一个白点黑色背景。另外两个是动画播放时出现的“残羹剩饭”。

如果我流式传输MPEG-2并相应地更改管道,则模式呈现时没有错误。我尝试使用on msdn描述的设置配置引脚,使用H264和AVC1明确提供序列标题等。我仍然得到同样的文物。

一个有趣的事情是,工件主要出现在与I帧相同的频率上,如果我们只发送I帧(key-int-max = 1),则工件完全消失。

此外,当I帧间隔为60时,即每2秒,错误似乎出现在图像的上半部分。当我们每隔一帧(key-int-max = 2)更改为一个I帧时,伪像仅出现在图像顶部的窄条中。

以下gstreamer管道产生了视频流:

videotestsrc live-source=true pattern=ball ! video/x-raw-yuv,format=(fourcc)I420,width=1366,height=768,framerate=30/1 ! timeoverlay halign=left valign=bottom shaded-background=true ! x264enc bitrate=4096 tune=zerolatency ! h264parse ! queue ! mux. audiotestsrc wave=ticks volume=0.2 ! voaacenc ! mux. mpegtsmux name=mux ! udpsink host=<ip> port=<port>

这就是管道的样子: Pipeline

此示例中的配置是majortype = MEDIATYPE_Video,subtype = MEDIASUBTYPE_H264,formattype = FORMAT_MPEG2Video。没有专门提供的序列标题等。

所以问题是,这些工件是一些常见配置问题的症状吗?

2 个答案:

答案 0 :(得分:1)

您正在丢失传输中的数据,可能会导致错误。问题是我的图片比P图片的比特率更高。如果你有cbr n / w,那么你可能会看到这个问题。

为什么工件以这种方式出现:

现在,如果你的视频中只有一个白球,其余背景为黑色,当你丢失帧时,参考图片会丢失并且会出现乱码,因为解码器可能只是尝试使用上一个有效帧中的帧显示。由于你的最后一个有效帧是全部黑色的屏幕看起来没问题,所以while球的部分仍然显示错误。

用另一种模式替换这种模式,你会更清楚地看到我的意思。

只有I图片,不存在任何参考图片的问题,因此您将获得干净的输出。

检查传输是否正常的一种方法是将输出转储到文件中,并在另一端用文件读取。如果工作正常,你就知道你的传输正在丢失数据。

此外,由于您的时钟位于底部,因此如果帧丢失,您应该看到时钟也会跳跃。

答案 1 :(得分:0)

事实证明,MPEG-2多路分解器并非设计用于处理H.264内容。这就是出现这些影响的原因。