我已经编写了一个实时推送过滤器,它可以获得包含h.264视频和aac音频的mpeg-ts流。我设置了一个directshow管道并配置输出引脚。我可以渲染h.264流但是我在渲染中得到了工件,从使用videotestsrc和“ball”模式从gstreamer流式传输时可以看到这个截图。这个截图应该只包含一个白点黑色背景。另外两个是动画播放时出现的“残羹剩饭”。
如果我流式传输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>
这就是管道的样子:
此示例中的配置是majortype = MEDIATYPE_Video,subtype = MEDIASUBTYPE_H264,formattype = FORMAT_MPEG2Video。没有专门提供的序列标题等。
所以问题是,这些工件是一些常见配置问题的症状吗?
答案 0 :(得分:1)
您正在丢失传输中的数据,可能会导致错误。问题是我的图片比P图片的比特率更高。如果你有cbr n / w,那么你可能会看到这个问题。
为什么工件以这种方式出现:
现在,如果你的视频中只有一个白球,其余背景为黑色,当你丢失帧时,参考图片会丢失并且会出现乱码,因为解码器可能只是尝试使用上一个有效帧中的帧显示。由于你的最后一个有效帧是全部黑色的屏幕看起来没问题,所以while球的部分仍然显示错误。
用另一种模式替换这种模式,你会更清楚地看到我的意思。
只有I图片,不存在任何参考图片的问题,因此您将获得干净的输出。
检查传输是否正常的一种方法是将输出转储到文件中,并在另一端用文件读取。如果工作正常,你就知道你的传输正在丢失数据。
此外,由于您的时钟位于底部,因此如果帧丢失,您应该看到时钟也会跳跃。
答案 1 :(得分:0)
事实证明,MPEG-2多路分解器并非设计用于处理H.264内容。这就是出现这些影响的原因。