我编写了一个实时推送过滤器,它获取包含 h.264 视频和 aac 音频的 mpeg-ts 流。我设置了一个 directshow 管道并配置了输出引脚。我可以渲染 h.264 流,但我在渲染中得到了伪像,从这个屏幕截图中可以看出,当使用 videotestsrc 和“ball”模式从 gstreamer 流式传输时。此屏幕截图应仅包含黑色背景上的一个白点。另外两个是动画播放时出现的“剩菜”。
如果我流式传输 MPEG-2 并相应地更改管道,则该模式将无错误地呈现。我尝试使用msdn 上描述的设置来配置 pin,两者都使用 H264 和 AVC1 显式提供序列头等。我仍然得到同样的文物。
一件有趣的事情是,伪影大多以与 I-Frame 到达相同的频率出现,如果我们只发送 I-Frame (key-int-max=1),伪影就会完全消失。
此外,当 I 帧间隔为 60 时,即每 2 秒,错误似乎出现在图像的上半部分。当我们每隔一帧更改为一个 I-Frame (key-int-max=2) 时,伪影仅出现在图像顶部的窄条中。
以下 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。没有专门提供序列头等。
所以问题是,这些类型的工件是一些常见配置问题的症状吗?