简体   繁体   English

gstreamer无法将UYVY编码为h264

[英]gstreamer unalble to encode UYVY as h264

I am trying to encode a RAW stream in UYVY colorspace to H264 using gstreamer vaapi encoder. 我正在尝试使用gstreamer vaapi编码器将UYVY色彩空间中的RAW流编码为H264。

Source Pipeline: 源管道:

gst-launch-1.0 -e videotestsrc ! video/x-raw, format=UYVY , framerate=60/1, width=1920, height=1080 ! filesink location=raw.yuv

Encoder pipeline: 编码器管道:

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

If I try to encode it as I420 the pipepline works fine: 如果我尝试将其编码为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

On inspection: gst-inspect-1.0 vaapiencode_h264 检查中: gst-inspect-1.0 vaapiencode_h264

I realized UYVY is not listed in under video/x-raw(memory:VASurface) capabilities, but it is listed in under video/x-raw. 我意识到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 }

I also tried to convert from UYVY colorspace to I420, using videoconvert but to no avail. 我也尝试使用videoconvert从UYVY色彩空间转换为I420,但无济于事。

Is it possible to encode UYVY to h264 using gstreamer? 是否可以使用gstreamer将UYVY编码为h264?

After much hit and trail I finally figured out the problem with videoconvert, turns out one needs a blocksize for it. 经过一番摸索,我终于弄清了视频转换的问题,结果证明需要对其进行块化处理。 The following pipeline worked for me: 以下管道对我有用:

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

Running your pipeline with GST_DEBUG=2 shows a warning: 使用GST_DEBUG = 2运行管道会显示警告:

vaapi gstvaapiencoder.c:591:set_context_info: We are only supporting YUV:4:2:0 for encoding,please try to use vaapipostproc to convert the input format! vaapi gstvaapiencoder.c:591:set_context_info:我们仅支持YUV:4:2:0进行编码,请尝试使用vaapipostproc转换输入格式!

So it suggests using vaapipostproc to convert formats before the encoder and it worked for me: 因此,它建议使用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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM