Back
Featured image of post Создаём виртуальную камеру для конференций

Создаём виртуальную камеру для конференций

Вместо себя в конференции крутим видео или показываем статическую фотографию

Не всегда хочется включать камеру во время конференции, придумалось поискать как можно показывать видео или статическую картинку. Средствами ОС или браузера из коробки это не делается. Нашёл статью и, собственно, модуль ядра для создания виртуальной камеры, которая браузером определяется как обычная камера 😄
Ниже представлен скрипт с подробными комментариями. Единственным аргументом к нему служит путь к файлу или изображению, которое должно транслироваться в потоке.

#!/usr/bin/env sh
set -e

# label for the new webcam as it will be seen in browser
LABEL="VirtualCam #0"

# module insertion in case if it was not inserted during this boot
if ! lsmod | grep -qE '^v4l2loopback'; then
  # camera is being created during the module loading
  sudo modprobe v4l2loopback devices=1 exclusive_caps=1 max_buffers=2 card_label="$LABEL"
  # wait for a while to finish module initialization
  sleep 1
fi

# path to media file
F="${1:?File is not passed}"
# getting path to newly created camera device
DEV="$(v4l2-ctl --list-devices 2>/dev/null | grep -A1 "$LABEL" | grep -oE '/dev/video[0-9]+')"

if [ ! -f "$F" ]; then
  # check in case if media file path does not exists
  echo "error: file $F does not exists" >&2
  exit 1
fi

# get file type and use proper streaming command
case "$(file --mime-type --brief "$F" | cut -d/ -f1)" in
  video)
    # in case if file is video
    ffmpeg -re -i "$F" -f v4l2 -vcodec rawvideo -pix_fmt yuv420p "$DEV"
    ;;
  image)
    # in case if file is picture
    ffmpeg -loop 1 -re -i "$F" -f v4l2 -vcodec rawvideo -pix_fmt yuv420p "$DEV"
    ;;
  *)
    # in case if file is something else
    echo 'error: unknown mime type' >&2
    exit 2
    ;;
esac

Как итог, получилось стримить Rick Ashley - Never Gonna Give You Up.

Из недостатков стоит упомянуть потребление почти целого ядра ffmpeg-ом. Также, мы, понятное дело, передаём только картинку, без звука.

Licensed under Apache License, Version 2.0
Обновлено Jul 22, 2021 14:06 +0300
comments powered by Disqus
All rights reserved
Создано при помощи Hugo
Тема Stack, дизайн Jimmy