Giả mạo một webcam sử dụng một thiết bị loopback video?


16

Tôi muốn sử dụng một video clip được lặp như nguồn webcam của mình trong Google+ Hangout. Tôi đã cài đặt v4l2loopback và tạo một thiết bị quay vòng video . Nhưng tôi chưa tìm ra cách ghi các khung hình video vào thiết bị. Ví dụ đã cho là:

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

Vì vậy, sau khi đọc trang hướng dẫn cho gst-launch và cố gắng hiểu những gì đang diễn ra, tôi đã thực hiện nỗ lực yếu ớt của mình:

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

Kết quả là:

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.

Đoạn clip tôi đang cố gắng sử dụng video h264 ở 29,97 khung hình / giây, 320x240 và trong một thùng chứa mp4 (từ Youtube).

Câu trả lời:


12

Các gst-launchtrang này cho chúng ta biết rằng chúng ta cần giải mã video trước và cách dễ nhất để làm như vậy là như sau:

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

gst-launchkhông cần phải được chạy dưới quyền root và [location]cũng có thể tương đối!


11

Chỉ cần sử dụng v4l2loopback với mplayer .

  1. Tải về nó
  2. biên dịch nó ( makesu -c 'make install'),
  3. tải mô-đun với su -c 'modprobe v4l2loopback',
  4. sau đó thay đổi một dòng trong tệp examples/yuv4mpeg_to_v4l2.ccủa thư mục nguồn v4l2loopback từ

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;
    

    đến

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YVU420;
    
  5. và làm maketrong thư mục này.

  6. Sau đó chạy nó từ examplesthư mục như thế này:

    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
    

    nơi bạn thay thế movie.mp4bằng tên của tệp video của bạn. Và thay thế /dev/video0bằng thiết bị loopback của bạn.

MPlayer có thể phát bất kỳ luồng web nào, tất cả các loại tệp video, v.v. Tôi vừa thử nó với một tập tin từ http://www.tagesschau.de là một trang web tin tức của Đức.

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

Câu trả lời này nói rằng hãy thay đổi v.fmt.pix.pixelformat = V4L2_PIX_FMT_YVU420; điều tương tự chính xác như vậy có nghĩa là không cần thay đổi?
kkron

2
@kkron: so sánh hai dòng (trước và sau) theo từng ký tự và bạn sẽ nhận thấy sự khác biệt. ;-) Gợi ý: YUV và YVU.
erik
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.