如何使用gst-launch播放非4字节对齐的NV12原始视频文件?
问题根因
你的猜测完全正确——画面失真就是NV12格式的行字节对齐要求导致的。
NV12属于平面视频格式,GStreamer里的多数元素默认会强制Y平面的行字节数按4字节对齐。你的视频宽度426不是4的倍数,videoparse默认会把行字节数自动调整到最近的4对齐值(比如428),但原始文件的实际行字节是426,这就导致帧数据解析错位,最终画面乱掉。而428、640这类4字节对齐的宽度,行字节数和元素默认逻辑匹配,所以播放正常。
解决办法
不用修改原始文件,直接在GStreamer管道里调整参数就能解决,给你两个可行方案:
方案1:给videoparse添加alignment=none参数
这个参数会关闭自动行对齐,让videoparse严格按你指定的宽度解析每行数据:
gst-launch-1.0 filesrc location=426x240-nv12-25fps-5s.yuv ! videoparse format=nv12 width=426 height=240 framerate=1/1 alignment=none ! videoconvert ! autovideosink
方案2:用capsfilter明确指定无对齐约束的格式
通过capsfilter强制下游元素接受非对齐的NV12,直接指定Y平面的行字节数等于宽度:
gst-launch-1.0 filesrc location=426x240-nv12-25fps-5s.yuv ! videoparse format=nv12 width=426 height=240 framerate=1/1 ! capsfilter caps="video/x-raw,format=NV12,width=426,height=240,stride=(int)426" ! videoconvert ! autovideosink
额外说明
有些视频输出sink可能仍对对齐有要求,但videoconvert会自动在格式转换过程中处理对齐适配,只要上游解析正确,下游就能正常输出画面。
内容的提问来源于stack exchange,提问作者dave
相关产品推荐
相关产品推荐

