在图像上叠加(或播放)视频作为背景 - 使用 gstreamer
overlay (or play an )video over an image as background - using gstreamer
我正在做一个项目,我需要显示一个视频 "alpha keying" 一个基于颜色的感兴趣区域,并 运行 它在图像上,所以感兴趣区域下面的图像是在视频中可见。
$ gst-launch-0.10 -e \
videomixer name=mix\
! ffmpegcolorspace \
! xvimagesink \
videotestsrc pattern=0 \
! video/x-raw-yuv, framerate=1/1, width=350, height=250 \
! textoverlay font-desc="Sans 24" text="CAM1" valign=top halign=left shaded-background=true \
! videobox border-alpha=0 top=-200 left=-50 \
! mix.
multifilesrc location="drawing_total_mask_1.jpg" caps="image/jpeg,framerate=1/1"
! jpegdec \
! textoverlay font-desc="Sans 26" text="Live from Pl" halign=left shaded-background=true auto-resize=false \
! ffmpegcolorspace \
! video/x-raw-yuv,format=\(fourcc\)AYUV \
! mix.
搜索它时我发现了类似这样的东西,它允许我在图像上显示测试视频 (videotestsrc
),但是当我提供备用视频源时它不会这样做。
我用来给出自己来源的代码以及随之而来的错误。
$ gst-launch-0.10 -e videomixer name=mix ! ffmpegcolorspace ! xvimagesink filesrc location = "asd.mp4" ! video/x-raw-yuv, framerate=1/1, width=350, height=250 ! textoverlay font-desc="Sans 24" text="CAM1" valign=top halign=left shaded-background=true ! videobox border-alpha=0 top=-200 left=-50 ! mix. multifilesrc location=drawing_total_mask_1.jpg" caps="image/jpeg,framerate=1/1" ! jpegdec ! textoverlay font-desc="Sans 26" text="Live from Pl" halign=left shaded-background=true auto-resize=false ! ffmpegcolorspace ! video/x-raw-yuv,format=\(fourcc\)AYUV ! mix.
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
WARNING: from element /GstPipeline:pipeline0/GstTextOverlay:textoverlay0: Could not multiplex stream.
Additional debug info:
gsttextoverlay.c(1848): gst_text_overlay_video_event (): /GstPipeline:pipeline0/GstTextOverlay:textoverlay0:
received non-TIME newsegment event on video input
WARNING: from element /GstPipeline:pipeline0/GstTextOverlay:textoverlay1: Could not multiplex stream.
Additional debug info:
gsttextoverlay.c(1848): gst_text_overlay_video_event (): /GstPipeline:pipeline0/GstTextOverlay:textoverlay1:
received non-TIME newsegment event on video input
ERROR: from element /GstPipeline:pipeline0/GstCapsFilter:capsfilter1: Filter caps do not completely specify the output format
Additional debug info:
gstcapsfilter.c(393): gst_capsfilter_prepare_buf (): /GstPipeline:pipeline0/GstCapsFilter:capsfilter1:
Output caps are unfixed: video/x-raw-yuv, framerate=(fraction)1/1, width=(int)350, height=(int)250, format=(fourcc){ AYUV, YUY2, Y444, UYVY, Y42B, YV12, I420, Y41B }
ERROR: pipeline doesn't want to preroll.
Setting pipeline to NULL ...
我无法找到我没有做的正确的事情。
总结一下
我想要一个由我提供的具有透明 alpha 区域的视频,当图像上 运行 时,该图像将在视频中感兴趣的 alpha 区域上显示图像。
任何帮助将不胜感激。
提前致谢。
您需要对视频文件进行多路分解和解码才能使用它。仅使用 filesrc ! video/x-raw-yuv
不会神奇地从 mp4 中提取视频数据。尝试像 h264parse ! ffdec_h264
这样的东西(如果你的 mp4 包含 h.264
编码数据)
我找到了一种方法来完成我在问题中提出的问题。我将它张贴在这里,以供那些它会有所帮助的人使用。
这会将 运行 视频置于图像之上。
注意:如果视频有任何 "orange" 彩色区域,它将应用 alpha 键控透明度,下面的图像将显示在透明 region.cheers
上
gst-launch videomixer name=mix sink_0::alpha=1.0 sink_0::zorder=1 sink_1::zorder=2
! ffmpegcolorspace ! xvimagesink filesrc location =vidoe.avi ! decodebin
! alpha method=custom target-r=245 target-g=161 target-b=11 angle=10
! ffmpegcolorspace ! mix.sink_1 multifilesrc location="image.jpg"
caps="image/jpeg,framerate=1/1"
! jpegdec
! textoverlay font-desc="Sans 26" text="Live from Pl" halign=left
shaded-background=true auto-resize=false
! ffmpegcolorspace ! video/x-raw-yuv,format=\(fourcc\)AYUV ! mix.sink_0
我正在做一个项目,我需要显示一个视频 "alpha keying" 一个基于颜色的感兴趣区域,并 运行 它在图像上,所以感兴趣区域下面的图像是在视频中可见。
$ gst-launch-0.10 -e \
videomixer name=mix\
! ffmpegcolorspace \
! xvimagesink \
videotestsrc pattern=0 \
! video/x-raw-yuv, framerate=1/1, width=350, height=250 \
! textoverlay font-desc="Sans 24" text="CAM1" valign=top halign=left shaded-background=true \
! videobox border-alpha=0 top=-200 left=-50 \
! mix.
multifilesrc location="drawing_total_mask_1.jpg" caps="image/jpeg,framerate=1/1"
! jpegdec \
! textoverlay font-desc="Sans 26" text="Live from Pl" halign=left shaded-background=true auto-resize=false \
! ffmpegcolorspace \
! video/x-raw-yuv,format=\(fourcc\)AYUV \
! mix.
搜索它时我发现了类似这样的东西,它允许我在图像上显示测试视频 (videotestsrc
),但是当我提供备用视频源时它不会这样做。
我用来给出自己来源的代码以及随之而来的错误。
$ gst-launch-0.10 -e videomixer name=mix ! ffmpegcolorspace ! xvimagesink filesrc location = "asd.mp4" ! video/x-raw-yuv, framerate=1/1, width=350, height=250 ! textoverlay font-desc="Sans 24" text="CAM1" valign=top halign=left shaded-background=true ! videobox border-alpha=0 top=-200 left=-50 ! mix. multifilesrc location=drawing_total_mask_1.jpg" caps="image/jpeg,framerate=1/1" ! jpegdec ! textoverlay font-desc="Sans 26" text="Live from Pl" halign=left shaded-background=true auto-resize=false ! ffmpegcolorspace ! video/x-raw-yuv,format=\(fourcc\)AYUV ! mix.
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
WARNING: from element /GstPipeline:pipeline0/GstTextOverlay:textoverlay0: Could not multiplex stream.
Additional debug info:
gsttextoverlay.c(1848): gst_text_overlay_video_event (): /GstPipeline:pipeline0/GstTextOverlay:textoverlay0:
received non-TIME newsegment event on video input
WARNING: from element /GstPipeline:pipeline0/GstTextOverlay:textoverlay1: Could not multiplex stream.
Additional debug info:
gsttextoverlay.c(1848): gst_text_overlay_video_event (): /GstPipeline:pipeline0/GstTextOverlay:textoverlay1:
received non-TIME newsegment event on video input
ERROR: from element /GstPipeline:pipeline0/GstCapsFilter:capsfilter1: Filter caps do not completely specify the output format
Additional debug info:
gstcapsfilter.c(393): gst_capsfilter_prepare_buf (): /GstPipeline:pipeline0/GstCapsFilter:capsfilter1:
Output caps are unfixed: video/x-raw-yuv, framerate=(fraction)1/1, width=(int)350, height=(int)250, format=(fourcc){ AYUV, YUY2, Y444, UYVY, Y42B, YV12, I420, Y41B }
ERROR: pipeline doesn't want to preroll.
Setting pipeline to NULL ...
我无法找到我没有做的正确的事情。
总结一下
我想要一个由我提供的具有透明 alpha 区域的视频,当图像上 运行 时,该图像将在视频中感兴趣的 alpha 区域上显示图像。
任何帮助将不胜感激。
提前致谢。
您需要对视频文件进行多路分解和解码才能使用它。仅使用 filesrc ! video/x-raw-yuv
不会神奇地从 mp4 中提取视频数据。尝试像 h264parse ! ffdec_h264
这样的东西(如果你的 mp4 包含 h.264
编码数据)
我找到了一种方法来完成我在问题中提出的问题。我将它张贴在这里,以供那些它会有所帮助的人使用。
这会将 运行 视频置于图像之上。 注意:如果视频有任何 "orange" 彩色区域,它将应用 alpha 键控透明度,下面的图像将显示在透明 region.cheers
上gst-launch videomixer name=mix sink_0::alpha=1.0 sink_0::zorder=1 sink_1::zorder=2
! ffmpegcolorspace ! xvimagesink filesrc location =vidoe.avi ! decodebin
! alpha method=custom target-r=245 target-g=161 target-b=11 angle=10
! ffmpegcolorspace ! mix.sink_1 multifilesrc location="image.jpg"
caps="image/jpeg,framerate=1/1"
! jpegdec
! textoverlay font-desc="Sans 26" text="Live from Pl" halign=left
shaded-background=true auto-resize=false
! ffmpegcolorspace ! video/x-raw-yuv,format=\(fourcc\)AYUV ! mix.sink_0