0

I need to horizontally flip my webcam image for a meeting. I tried the instructions in this site https://wiki.archlinux.org/index.php/Webcam_setup#Applications</Webcam setup> which uses v4l2 and v4l2loopback to generate a virtual camera.

# modprobe v4l2loopback

Check the name of the newly created camera:

$ v4l2-ctl --list-devices

Dummy video device (0x0000) (platform:v4l2loopback-000):
       /dev/video1

Then you can run ffmpeg to read from your actual webcam (here /dev/video0) and invert it and feed it to the virtual camera:

$ ffmpeg -f v4l2 -i /dev/video0 -vf "vflip" -f v4l2 /dev/video1

You can use the "Dummy" camera in your applications instead of the "Integrated" camera.

With these settings I was successful in vertically flipping my video. But that is not what I want. I want it to be flipped horizontally.

So I tried this:

$ ffmpeg -f v4l2 -i /dev/video0 -vf **"hflip"** -f v4l2 /dev/video1

But I then I get no image from my cam.

What am I doing wrong?

I'm using Fedora 31 in a desktop.

COMPLETE LOG:

ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developers

  built with gcc 9 (GCC)

  configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --docdir=/usr/share/doc/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --arch=x86_64 --optflags='-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' --extra-ldflags='-Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld ' --extra-cflags=' ' --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-amrwbenc --enable-version3 --enable-bzlib --disable-crystalhd --enable-fontconfig --enable-frei0r --enable-gcrypt --enable-gnutls --enable-ladspa --enable-libaom --enable-libdav1d --enable-libass --enable-libbluray --enable-libcdio --enable-libdrm --enable-libjack --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libmp3lame --enable-nvenc --enable-openal --enable-opencl --enable-opengl --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librsvg --enable-libsrt --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libvorbis --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzimg --enable-libzvbi --enable-avfilter --enable-avresample --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib64 --enable-libmfx --enable-runtime-cpudetect

  libavutil      56. 31.100 / 56. 31.100

  libavcodec     58. 54.100 / 58. 54.100

  libavformat    58. 29.100 / 58. 29.100

  libavdevice    58.  8.100 / 58.  8.100

  libavfilter     7. 57.100 /  7. 57.100

  libavresample   4.  0.  0 /  4.  0.  0

  libswscale      5.  5.100 /  5.  5.100

  libswresample   3.  5.100 /  3.  5.100

  libpostproc    55.  5.100 / 55.  5.100

Input #0, video4linux2,v4l2, from '/dev/video0':

  Duration: N/A, start: 233168.222502, bitrate: 147456 kb/s

    Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 640x480, 147456 kb/s, 30 fps, 30 tbr, 1000k tbn, 1000k tbc

Stream mapping:

  Stream #0:0 -> #0:0 (rawvideo (native) -> rawvideo (native))

Press [q] to stop, [?] for help

Output #0, video4linux2,v4l2, to '/dev/video2':

  Metadata:

    encoder         : Lavf58.29.100

    Stream #0:0: Video: rawvideo (Y42B / 0x42323459), yuv422p, 640x480, q=2-31, 147456 kb/s, 30 fps, 30 tbn, 30 tbc

    Metadata:

    encoder         : Lavc58.54.100 rawvideo

frame=   31 fps=0.0 q=-0.0 size=N/A time=00:00:01.03 bitrate=N/A dup=16 drop=0 sframe=   46 fps= 46 q=-0.0 size=N/A time=00:00:01.53 bitrate=N/A dup=16 drop=0 sframe=   61 fps= 40 q=-0.0 size=N/A time=00:00:02.03 bitrate=N/A .....
Jason Aller
  • 3,391
  • 28
  • 37
  • 36
  • Show the complete log from the command using hflip. – llogan Apr 28 '20 at 17:01
  • ok, added at the end. – Kaiser Schwarcz Apr 28 '20 at 17:28
  • Check if `ffmpeg -f v4l2 -i /dev/video0 -vf "hflip,format=yuv420p" -f v4l2 /dev/video1` allows you to view it. – llogan Apr 28 '20 at 18:04
  • Not realy. But your suggestion was very helpful. I just had to made a little adjustment. [ ffmpeg -f v4l2 -i /dev/video0 -vf "**vflip**,format=yuv420p" -f v4l2 /dev/video1 ] made the trick. – Kaiser Schwarcz Apr 28 '20 at 18:30
  • Where can I get information about those formats confs for ffmpeg? – Kaiser Schwarcz Apr 28 '20 at 18:35
  • So it's working now? I assumed you wanted hflip instead of vflip because you said, "I want it to be fliped horizontally". As for "formats confs" I assumed you mean the [format filter](https://ffmpeg.org/ffmpeg-filters.html#format) and the pixel format (yuv420p). – llogan Apr 28 '20 at 18:38
  • @llogan, it's working now. Indeed, I want a horizontal flip. but the command line you sent (**ffmpeg -f v4l2 -i /dev/video0 -vf "hflip,format=yuv420p" -f v4l2 /dev/video1**) produced a image flipped both horizontally AND vertically (or we 180° spinned). So I had to change **hflip** to **vflip** to have it flipped ONLY horizontally. So it's workink, yes. But I still wonder why the command had to be done this way. – Kaiser Schwarcz Apr 29 '20 at 13:06
  • 1
    A better solution may be to use [`v4l2-ctl` to set the rotation](https://stackoverflow.com/a/61527351/) so it's the correct orientation to start with. – llogan Apr 30 '20 at 17:51
  • 1
    it would be great if the solution could be added as an *answer* and then be accepted, in order to mark the problem as "solved" (and free people's ressources to help other (unsolved) questions) – umläute Jul 01 '20 at 09:03
  • @umläute Done (more than 4 months later). – llogan Sep 17 '20 at 18:00
  • thanks. so now @KaiserSchwarcz only needs to accept the answer ;-) – umläute Sep 21 '20 at 08:51

1 Answers1

0

Fix it before it gets to ffmpeg

You can use v4l2-ctl to flip the video at the driver level so it's the correct orientation to start with.

Or just use ffmpeg

Using the hflip or vflip filters:

ffmpeg -f v4l2 -i /dev/video0 -vf "hflip,format=yuv420p" -f v4l2 /dev/video1

format=yuv420p is required to avoid the Unknown V4L2 pixel format equivalent error.

For more info see How to use ffmpeg to send video to /dev/video*?

llogan
  • 87,794
  • 21
  • 166
  • 190