skypeforlinux 识别外部网络摄像头,但显示黑屏

Xav*_*uvw 5 webcam skype drivers 16.04

情况

Ubuntu 16.04、skypeforlinux 8.53.0.85 和 8.58.0.93(来自Skype 网站的最新版本)

  • 外部网络摄像头适用于 Cheese
  • Skype识别外部网络摄像头,如下面的屏幕截图所示

    • lsusb显示在 Skype 对话窗口中的供应商和产品 ID (十六进制)
    • 网络摄像头打开但屏幕未激活:黑屏

      在此处输入图片说明

研究

这不在Skype for Linux的官方已知问题列表中https : //support.skype.com/en/faq/FA34713/faq-and-known-issues-with-skype

一些旧帖子建议检查v4l 和 gstreamer 是否已安装。他们是:

ii  libv4l-0:amd64  1.10.0-1  amd64  Collection of video4linux support libraries  
ii  libv4l-dev:amd64  1.10.0-1  amd64  Collection of video4linux support libraries (development files)
ii  libv4l2rds0:amd64  1.10.0-1  amd64  Video4Linux Radio Data System (RDS) decoding library
ii  libv4lconvert0:amd64  1.10.0-1  amd64 Video4linux frame format conversion library
ii  gir1.2-gst-plugins-base-1.0  1.8.3-1ubuntu0.3  amd64  GObject introspection data for the GStreamer Plugins Base library
ii  gir1.2-gstreamer-1.0  1.8.3-1~ubuntu0.1  amd64  GObject introspection data for the GStreamer library
ii  gnome-video-effects  0.4.1-3ubuntu1  all  Collection of GStreamer effects
ii  gstreamer1.0-alsa:amd64  1.8.3-1ubuntu0.3  amd64  GStreamer plugin for ALSA
ii  gstreamer1.0-clutter-3.0  3.0.18-1  amd64  Clutter PLugin for GStreamer 1.0
ii  gstreamer1.0-libav:amd64  1.8.3-1ubuntu0.2  amd64  libav plugin for GStreamer
ii  gstreamer1.0-plugins-base:amd64  1.8.3-1ubuntu0.3  amd64  GStreamer plugins from the "base" set
ii  gstreamer1.0-plugins-base-apps  1.8.3-1ubuntu0.3  amd64  GStreamer helper programs from the "base" set
ii  gstreamer1.0-plugins-good:amd64  1.8.3-1ubuntu0.4  amd64  GStreamer plugins from the "good" set
ii  gstreamer1.0-plugins-ugly:amd64  1.8.3-1ubuntu0.1  amd64  GStreamer plugins from the "ugly" set
ii  gstreamer1.0-plugins-ugly-amr:amd64  1.8.3-1ubuntu0.1  amd64  GStreamer plugins from the "ugly" set
ii  gstreamer1.0-pulseaudio:amd64  1.8.3-1ubuntu0.4  amd64  GStreamer plugin for PulseAudio
ii  gstreamer1.0-tools  1.8.3-1~ubuntu0.1  amd64  Tools for use with GStreamer
ii  gstreamer1.0-x:amd64  1.8.3-1ubuntu0.3  amd64  GStreamer plugins for X11 and Pango
ii  libclutter-gst-3.0-0:amd64  3.0.18-1  amd64  Open GL based interactive canvas library GStreamer elements
ii  libgstreamer-plugins-base1.0-0:amd64  1.8.3-1ubuntu0.3  amd64  GStreamer libraries from the "base" set
ii  libgstreamer-plugins-good1.0-0:amd64  1.8.3-1ubuntu0.4  amd64  GStreamer development files for libraries from the "good" set
ii  libgstreamer1.0-0:amd64  1.8.3-1~ubuntu0.1  amd64  Core GStreamer libraries and elements
ii  libreoffice-avmedia-backend-gstreamer  1:5.1.6~rc2-0ubuntu1~xenial10  amd64  GStreamer backend for LibreOffice
ii  phonon-backend-gstreamer:amd64  4:4.8.2-0ubuntu2  amd64  Phonon GStreamer 1.0 backend
ii  phonon-backend-gstreamer-common:amd64  4:4.8.2-0ubuntu2  amd64  Phonon GStreamer 1.0.x backend icons
ii  totem  3.18.1-1ubuntu4  amd64  Simple media player for the GNOME desktop based on GStreamer
Run Code Online (Sandbox Code Playgroud)

将启动定向到兼容性或转换库

LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libv4l/v4l2convert.so /usr/share/skypeforlinux/skypeforlinux

或者

LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libv4l/v4l1compat.so /usr/share/skypeforlinux/skypeforlinux

启动 Skype 但没有解决问题。请注意,这/usr/bin/skype是一个 bash 脚本启动/usr/share/skypeforlinux/skypeforlinux,我在上面用作测试。

关于如何让 Skype 通过网络摄像头实际发送信号的任何建议?

db-*_*inf 3

我知道有两种方法可以让您的网络摄像头正常工作skypeforlinux

  1. 预加载 Video For Linux 兼容性库之一。

    加利珀金提到了其中之一,v4l2convert.so;如果这不起作用,您可以搜索另一个,v4l1compat.so并将其预加载到启动 Skype 的命令中。例如,如果您在 中找到该库/usr/lib/x86_64-linux-gnu/libv4l/,请关闭 Skype 并尝试使用以下命令重新启动它:

    LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libv4l/v4l1compat.so skypeforlinux
    
    Run Code Online (Sandbox Code Playgroud)

    如果它向您提供有关不兼容 ELF 版本的消息,则您可能正在加载 32 位 Skype 的 64 位库,或者类似的操作:搜索其他版本。

  2. 将异国情调的网络摄像头输出转换为可接受的格式。

    如果 Skype 检测到您的网络摄像头,但在您打开它时仅显示黑色矩形,则很可能它无法理解网络摄像头的输出。我自己的网络摄像头以 Motion jpeg 格式进行流传输,采用的是我以前从未听说过的像素格式“yuvj422p”。尝试一下是否ffplay可以处理;如果可以的话,ffmpeg也可以,那可能会拯救你。

    首先列出可用的输入

     $ v4l2-ctl --list-devices
    
    Run Code Online (Sandbox Code Playgroud)

    我的输出如下:

     BT878 video (Hauppauge (bt878)) (PCI:0000:05:01.0):
         /dev/video0
         /dev/vbi0
     USB Camera (041e:401f) (usb-0000:00:14.0-11.2):
         /dev/video1
    
    Run Code Online (Sandbox Code Playgroud)

    所以我选择第二个来测试:

     $ ffplay -hide_banner -f v4l2 -i /dev/video1
    
    Run Code Online (Sandbox Code Playgroud)

    -hide_banner是一个方便的参数,-f v4l2选择解复用器格式,-i /dev/video1我的网络摄像头。

    如果ffplay您的网络摄像头处理得很好,您可以通过在视频窗口中键入“q”来停止它,然后继续。安装Video For Linux的环回驱动;您只需执行一次此操作,但您需要 sudo 权限:

     $ sudo apt-get update
     $ sudo apt-get install v4l2loopback-dkms
    
    Run Code Online (Sandbox Code Playgroud)

    这会在您的磁盘上放置略多于 100kB 的额外内容:内核模块v4l2loopback。您必须将其加载到内核中,这是另一个 sudo 活动:

     $ sudo modprobe v4l2loopback
    
    Run Code Online (Sandbox Code Playgroud)

    之后您可以立即检测到额外的视频输入:

     $ v4l2-ctl --list-devices
    
    Run Code Online (Sandbox Code Playgroud)

    现在应该显示如下内容:

     BT878 video (Hauppauge (bt878)) (PCI:0000:05:01.0):
         /dev/video0
         /dev/vbi0
     USB Camera (041e:401f) (usb-0000:00:14.0-11.2):
         /dev/video1
     Dummy video device (0x0000) (platform:v4l2loopback-000):
         /dev/video2
    
    Run Code Online (Sandbox Code Playgroud)

    剩下要做的就是ffmpeg从您的异国网络摄像头获取输入,将其转换为通用格式,例如yuv420p,并通过环回模块将其输出到虚拟视频设备。听起来很复杂,其实无非就是这个命令:输入格式-输入-过滤器-输出格式-输出

     $ ffmpeg -hide_banner -f v4l2 -i /dev/video1 -vf format=yuv420p -f v4l2 /dev/video2
    
    Run Code Online (Sandbox Code Playgroud)

    您可以再次测试其工作ffplay

     $ ffplay -hide_banner -f v4l2 -i /dev/video2
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,我正在从新的视频设备(虚拟设备)获取输入;ffmpegvideo1在读取时将被占用。

    我想指出的是,对于我 5 岁的孩子来说,ff-combo 消耗的 CPU 容量还不到 1%。如果一切顺利,ffplay请在视频窗口中输入“q”停止,但继续ffmpeg

    现在转到您的 Skype,然后在音频和视频设置中选择上面命名的环回设备:Dummy video device。如果效果良好,剩下要做的就是微调并清理。如果没有,我和你一样感到抱歉。

    ffmpeg准备好后,通过在正在运行的终端中输入内容来关闭q。您可以再尝试一次,并通过向 ffmpeg 添加过滤器来对您的旧网络摄像头进行虚拟更新;这些可以放入其他-vf参数中,或者您可以将它们添加在 , 之前或之后format=yuv420p,并用逗号分隔。我的需要相当大的提升:

     -vf format=yuv420p,spp=quality=3:mode=hard:qp=5,unsharp=3:3:0.7:5:5:-0.5,hqdn3d,eq=saturation=1.8:gamma=1.4
    
    Run Code Online (Sandbox Code Playgroud)

    但我相信您可以找到自己的 ffmpeg 过滤器以及如何使用它们。ffplay您可以在将它们添加到ffmpeg命令行之前尝试它们

    现在,您不想在每次接听或拨打 Skype 电话时阅读此文本并键入其命令。我已将其放入~/.bash_aliases别名下,如下所示videoskype

     alias videoskype="xterm -e /bin/bash -ic 'sudo modprobe v4l2loopback;echo Ready for video call, press q to stop;ffmpeg -hide_banner -f v4l2 -i /dev/video1 -vf format=yuv420p -f v4l2 /dev/video2;sudo modprobe --remove v4l2loopback'&"
    
    Run Code Online (Sandbox Code Playgroud)

    从现在开始,videoforskype在交互式 shell(普通终端或类似的启动器bash -ic videoskype)中给出的单个命令将打开一个终端,要求您输入 sudo 密码来加载环回模块,继续ffmpeg运行直到您停止它并卸载环回模块。

    请注意,内核模块加载器非常强大:它会尝试优雅地加载已加载的模块。但是,如果您videoskype在另一个终端中运行另一个实例时再次启动,则ffmpeg新终端中的实例将无法从其输入中读取数据并停止,从而导致环回模块被卸载并且第一个模块也ffmpeg停止。

成功!!


gal*_*kin 2

我有同样的问题并尝试了很多东西。我使用的是 Ubuntu 19.10(eoan),Skype 版本为 8.59.76.73,libv4l 版本为 1.16.7-1。我对这个问题的解决方案是基于这个 Ubuntuforums 链接

  1. 从您的系统中完全删除 Skype

    sudo apt-get purge skype*
    
    Run Code Online (Sandbox Code Playgroud)

    或者

    snap remove skype
    
    Run Code Online (Sandbox Code Playgroud)
  2. 安装 libv4l-dev 软件包

    sudo apt install libv4l-dev
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用以下命令查找 lib4l 软件包的下载位置,

    find / -iname "*libv4l*" 2>/dev/null
    
    Run Code Online (Sandbox Code Playgroud)
  4. 从此Skype 存储库重新安装最新版本的 skypeforlinux 预览版。

  5. 重新启动您的系统。

  6. 使用找到的 libv4l 路径,使用以下命令运行 skypeforlinux

    LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libv4l/v4l2convert.so skypeforlinux
    
    Run Code Online (Sandbox Code Playgroud)

我希望这有帮助,我通过这些步骤解决了我的问题。