gstreamer 无法将 UYVY 编码为 h264
gstreamer unalble to encode UYVY as h264
我正在尝试使用 gstreamer vaapi 编码器将 UYVY 色彩空间中的 RAW 流编码为 H264。
源管道:
gst-launch-1.0 -e videotestsrc ! video/x-raw, format=UYVY , framerate=60/1, width=1920, height=1080 ! filesink location=raw.yuv
编码器管道:
gst-launch-1.0 -v filesrc location=raw.yuv ! videoparse format=uyvy width=1920 height=1080 framerate=60 ! vaapiencode_h264 tune=high-compression ! mpegtsmux ! filesink location=final.ts
如果我尝试将其编码为 I420,管道工作正常:
gst-launch-1.0 -v filesrc location=raw.yuv ! videoparse format=i420 width=1920 height=1080 framerate=60 ! vaapiencode_h264 tune=high-compression ! mpegtsmux ! filesink location=final.ts
检查时:
gst-inspect-1.0 vaapiencode_h264
我意识到 UYVY 没有列在 video/x-raw(memory:VASurface) 功能下,但它列在 video/x-raw.
下
video/x-raw(memory:VASurface)
format: { ENCODED, NV12, I420, YV12 }
width: [ 1, 2147483647 ]
height: [ 1, 2147483647 ]
framerate: [ 0/1, 2147483647/1 ]
interlace-mode: progressive
video/x-raw
format: { I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32 }
我也尝试使用 videoconvert 从 UYVY 色彩空间转换为 I420,但无济于事。
是否可以使用 gstreamer 将 UYVY 编码为 h264?
运行 带有 GST_DEBUG=2 的管道显示警告:
vaapi gstvaapiencoder.c:591:set_context_info: 我们只支持YUV:4:2:0编码,请尝试使用vaapipostproc转换输入格式!
所以它建议在编码器之前使用 vaapipostproc 来转换格式,它对我有用:
gst-launch-1.0 -e videotestsrc ! video/x-raw, format=UYVY , framerate=60/1, width=1920, height=1080 ! vaapipostproc ! vaapiencode_h264 tune=high-compression ! mpegtsmux ! filesink location=final.ts
经过多次尝试,我终于弄清楚了 videoconvert 的问题,结果发现它需要一个块大小。
以下管道对我有用:
gst-launch-1.0 -v filesrc location=raw.yuv blocksize=4147200 !
videoparse format=uyvy width=1920 height=1080 framerate=60/1 !
videoconvert ! video/x-raw,format=I420,width=1920,height=1080,framerate=60/1 !
vaapiencode_h264 tune=high-compression ! mpegtsmux ! filesink location=final.ts
我正在尝试使用 gstreamer vaapi 编码器将 UYVY 色彩空间中的 RAW 流编码为 H264。
源管道:
gst-launch-1.0 -e videotestsrc ! video/x-raw, format=UYVY , framerate=60/1, width=1920, height=1080 ! filesink location=raw.yuv
编码器管道:
gst-launch-1.0 -v filesrc location=raw.yuv ! videoparse format=uyvy width=1920 height=1080 framerate=60 ! vaapiencode_h264 tune=high-compression ! mpegtsmux ! filesink location=final.ts
如果我尝试将其编码为 I420,管道工作正常:
gst-launch-1.0 -v filesrc location=raw.yuv ! videoparse format=i420 width=1920 height=1080 framerate=60 ! vaapiencode_h264 tune=high-compression ! mpegtsmux ! filesink location=final.ts
检查时:
gst-inspect-1.0 vaapiencode_h264
我意识到 UYVY 没有列在 video/x-raw(memory:VASurface) 功能下,但它列在 video/x-raw.
下video/x-raw(memory:VASurface)
format: { ENCODED, NV12, I420, YV12 }
width: [ 1, 2147483647 ]
height: [ 1, 2147483647 ]
framerate: [ 0/1, 2147483647/1 ]
interlace-mode: progressive
video/x-raw
format: { I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV16, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10LE, I420_10BE, I422_10LE, I422_10BE, Y444_10LE, Y444_10BE, GBR, GBR_10LE, GBR_10BE, NV12_64Z32 }
我也尝试使用 videoconvert 从 UYVY 色彩空间转换为 I420,但无济于事。
是否可以使用 gstreamer 将 UYVY 编码为 h264?
运行 带有 GST_DEBUG=2 的管道显示警告:
vaapi gstvaapiencoder.c:591:set_context_info: 我们只支持YUV:4:2:0编码,请尝试使用vaapipostproc转换输入格式!
所以它建议在编码器之前使用 vaapipostproc 来转换格式,它对我有用:
gst-launch-1.0 -e videotestsrc ! video/x-raw, format=UYVY , framerate=60/1, width=1920, height=1080 ! vaapipostproc ! vaapiencode_h264 tune=high-compression ! mpegtsmux ! filesink location=final.ts
经过多次尝试,我终于弄清楚了 videoconvert 的问题,结果发现它需要一个块大小。 以下管道对我有用:
gst-launch-1.0 -v filesrc location=raw.yuv blocksize=4147200 !
videoparse format=uyvy width=1920 height=1080 framerate=60/1 !
videoconvert ! video/x-raw,format=I420,width=1920,height=1080,framerate=60/1 !
vaapiencode_h264 tune=high-compression ! mpegtsmux ! filesink location=final.ts