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


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.