एक वीडियो लूपबैक डिवाइस का उपयोग करके एक वेब कैमरा नकली करें?


16

मैं एक Google+ Hangout में मेरे वेबकैम स्रोत के रूप में एक लूपेड वीडियो क्लिप का उपयोग करना चाहता हूं। मैंने v4l2loopback स्थापित किया और एक वीडियो लूपबैक डिवाइस बनाया । लेकिन मुझे पता नहीं चला है कि डिवाइस को वीडियो फ्रेम कैसे लिखना है। दिए गए उदाहरण है:

gst-launch videotestsrc ! v4l2sink device=/dev/video1

इसलिए जीएसटी-लॉन्च के लिए मैनुअल पेज को पढ़ने और समझने की कोशिश करने के बाद कि मैं क्या कर रहा था, मैंने अपना कठिन प्रयास किया:

sudo gst-launch-0.10 filesrc location=/home/briankb/Videos/darthvaderdancing.mp4 ! v4l2sink device=/dev/video0

जिसके परिणामस्वरूप:

Setting pipeline to PAUSED ...
libv4l2: error getting pixformat: Invalid argument
Pipeline is PREROLLING ...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...

(gst-launch-0.10:12622): GStreamer-CRITICAL **: gst_caps_get_structure: assertion `GST_IS_CAPS (caps)' failed
New clock: GstSystemClock

(gst-launch-0.10:12622): GStreamer-CRITICAL **: gst_structure_get_name: assertion `structure != NULL' failed
Caught SIGSEGV accessing address (nil)
#0  0x00007fc1890f0b03 in poll () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00007fc18962bff6 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#2  0x00007fc18962c45a in g_main_loop_run ()
#3  0x00007fc189b5c4cb in gst_bus_poll ()
#4  0x0000000000404587 in ?? ()
#5  0x0000000000403c34 in ?? ()
#6  0x00007fc18902b76d in __libc_start_main ()
#7  0x00000000004043bd in ?? ()
#8  0x00007fff88253ed8 in ?? ()
#9  0x000000000000001c in ?? ()
#10 0x0000000000000006 in ?? ()
#11 0x00007fff882548c4 in ?? ()
#12 0x00007fff882548d4 in ?? ()
#13 0x00007fff882548dc in ?? ()
#14 0x00007fff88254904 in ?? ()
#15 0x00007fff88254906 in ?? ()
#16 0x00007fff8825490f in ?? ()
#17 0x0000000000000000 in ?? ()
Spinning.  Please run 'gdb gst-launch 12622' to continue debugging, Ctrl-C to quit, or Ctrl-\ to dump core.

क्लिप मैं एक h264 वीडियो का उपयोग करने की कोशिश कर रहा हूँ 29.97 fps, 320x240, और एक mp4 कंटेनर में (यह Youtube से है)।

जवाबों:


12

gst-launchManpages हमें बताता है कि हम पहले वीडियो को डिकोड करने की जरूरत है, और ऐसा करने के लिए सबसे आसान तरीका है इस तरह है:

gst-launch-0.10 filesrc location=[location] ! decodebin ! v4l2sink device=/dev/video0

gst-launchजड़ के रूप में चलाने की जरूरत नहीं है, और [location]रिश्तेदार भी हो सकते हैं!


11

महज प्रयोग करें mplayer के साथ v4l2loopback का ।

  1. डाउनलोड करो,
  2. इसे संकलित करें (make और su -c 'make install'),
  3. मॉड्यूल के साथ लोड करें su -c 'modprobe v4l2loopback' ,
  4. फिर फ़ाइल में एक पंक्ति बदलें examples/yuv4mpeg_to_v4l2.c v4l2loopback स्रोत फ़ोल्डर

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;
    

    सेवा

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YVU420;
    
  5. और करो make इस फ़ोल्डर में करें।

  6. फिर इसे examplesइस तरह निर्देशिका से चलाएं :

    mkfifo /tmp/pipe  # only needed once, as long as you do not delete the file /tmp/pipe
    ./yuv4mpeg_to_v4l2 < /tmp/pipe &
    mplayer movie.mp4 -vf scale=480:360 -vo yuv4mpeg:file=/tmp/pipe
    

    जहाँ आप movie.mp4अपने वीडियो फ़ाइल के नाम से प्रतिस्थापित करते हैं। और /dev/video0अपने लूपबैक डिवाइस के साथ बदलें ।

MPlayer किसी भी वेबस्ट्रीम, सभी प्रकार की वीडियो फ़ाइलों और इतने पर खेलने में सक्षम है। मैंने इसे http://www.tagesschau.de की एक फ़ाइल के साथ परीक्षण किया, जो एक जर्मन समाचार साइट है।

TS=$(wget 'http://www.tagesschau.de'$(wget http://www.tagesschau.de -q -O - | grep 'Letzte Sendung' | sed -e 's%.*href="%%' -e 's%".*%%') -q -O - | grep '\.webm\.webm' | sed -e 's%.*href="%%' -e 's%\.webm\.webm".*%.webm.webm%')
./yuv4mpeg_to_v4l2 < /tmp/pipe &
mplayer $TS -vf scale=480:360 -vo yuv4mpeg:file=/tmp/pipe

यह उत्तर v.fmt.pix.pixelformat = V4L2_PIX_FMT_YVU420 बदलने के लिए कहता है; ठीक उसी चीज़ के लिए इसका मतलब यह है कि कोई परिवर्तन आवश्यक नहीं है?
— kkron

2
@kkron: चरित्र द्वारा दो लाइनों (पहले और बाद) चरित्र की तुलना करें, और आप अंतर को नोटिस करेंगे। ;-) संकेत: YUV और YVU।
— इरविक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.