如何正确使用GStreamer的interlace元素实现逐行转隔行?
GStreamer interlace元素未生成预期隔行场的问题解决
你遇到的问题根源在于interlace元素的默认行为不是拆分场为独立缓冲区,而是将逐行帧打包为交织式隔行帧(interleaved)——两个场合并在同一个缓冲区里,保持原分辨率和缓冲区数量,所以两条管道输出结果一致。
正确的解决方案
要实现将一帧逐行帧拆分为两个独立的场缓冲区,需要明确指定interlace元素的输出格式为场模式(field),并通过caps过滤器强制GStreamer生成独立的场缓冲区:
gst-launch-1.0 -v videotestsrc pattern=ball num-buffers=10 ! video/x-raw,format=YUY2,width=640,height=480,framerate=30/1 ! interlace ! video/x-raw,interlace-mode=field,framerate=60/1,width=640,height=240 ! multifilesink location=c:\x_%d.raw
关键说明
- 原输入
videotestsrc默认帧率为30/1,10帧逐行帧拆分为20个场后,帧率需对应翻倍为60/1,确保caps协商成功。 - 通过
video/x-raw,interlace-mode=field,height=240强制输出独立场缓冲区,每个缓冲区仅包含奇数行或偶数行,高度为原帧的一半(240),文件大小变为6402402=307200字节。 - 未指定输出caps时,interlace默认输出
interleaved模式的隔行帧,缓冲区仍保持原分辨率和数量,因此无法得到预期的20个小文件。
内容的提问来源于stack exchange,提问作者Vincentz
相关产品推荐
相关产品推荐

