/webcop

Primary LanguageShell

WEBCam OPerations and more!

Функции скрипта

  • Фото
  • Видео
  • Стрим рабочего стола, как отдельного устройства
  • Испльзование конфига

Установка

Автоматическая установка

bash -c "$(wget -qO- https://raw.githubusercontent.com/spl3g/webcop/master/install.sh)"

Зависимости

  • ffmpeg
  • v4l-utils

Если хотите использовать режим стрима:

  • v4l2loopback-dkms
  • linux-headers

Опциональные для wayland:

  • wf-recorder

Debian-based

sudo apt-get install ffmpeg v4l-utils v4l2loopback-dkms

Arch-based

sudo pacman -Sy ffmpeg v4l-utils v4l2loopback-dkms

Загрузка скрипта

git clone https://github.com/spl3g/webcop.git
cd webcop
chmod +x webcop
# Profit ;)

Стрим

Если вы хотите использовать возможности стриминга экрана, то после каждой перезагрузки нужно выполнять

sudo modprobe v4l2loopback

Ключи

КлючиОпции конфигаЗначение
-hвывод помощи по ключам
-cпринять на вход конфиг
-ddevice=<путь до устройства>устройство ввода
-pphoto=<true/false>режим фотографирования
-sstream=<true/false>режим стрима
-vvideo=<true/false>режим видеосъемки
-ooutput=<имя файла>файл

Строение скрипта

./webcop <ключи>

Функции

#!/bin/bash
source config.shlib
helptxt() {
    echo -e ' -h | вывод помощи по ключам \n -c | принять на вход конфиг \n -p | режим фотографирования \n -v | режим видеосъемки \n -s | режим стрима \n -o | файл \n'
    echo 'Возможные устройства:'
    v4l2-ctl --list-devices
}
getsdevice() {
    sdevice=$(v4l2-ctl --list-devices 2> /dev/null | awk '/v4l2/ { getline; print $1}')
    if [[ -z $sdevice ]]; then
        echo "У вас не включен v4l2loopback:"
        echo -e "\t sudo modprobe v4l2loopback"
        exit 1
    fi
}

Изучение конфига (если есть)

for i in $(seq 1 9); do
    if [[ "${!i}" = "-c" ]]; then
        i=$(( i + 1 ))
        photo="$(config_get ${!i} photo)"
        video="$(config_get ${!i} video)"
        stream="$(config_get ${!i} stream)"
        device="$(config_get ${!i} device)"
        output="$(config_get ${!i} output)"
    fi
done

Сбор переменных

if [[ -z $1 ]]; then
    helptxt
    exit 1
fi

while [[ -n "$1" ]]; do
    case "$1" in
    -p) photo=true ;;
    -v) video=true ;;
    -o) output=$2
        shift ;;
    -d) device=$2
        shift ;;
    -c) config=$2
        shift ;;
    -s) stream=true ;;
    --) shift
        break ;;
    *) helptxt ;;
    esac
    shift
done

if [[ -z "${device}" ]] && [[ -z "${stream}" ]]; then
    device=$(v4l2-ctl --list-devices | awk '/usb/ { getline; print $1}')
    echo "Используется устройство по умолчанию - $device"
    echo "Другие варианты:"
    v4l2-ctl --list-devices
fi

Фото

if [[ $photo ]] && [[ $output ]]; then
    ffmpeg -hide_banner -loglevel error -f v4l2 \
        -i $device -vframes 1 $output
    echo "Фото снято"
elif [[ $photo ]]; then
    ffmpeg -hide_banner -loglevel error -f v4l2 \
        -i $device -vframes 1 photo.png
    echo "Фото снято"

Видео

elif [[ $video ]] && [[ $output ]]; then
    echo 'Нажмите q, чтобы завершить'
    ffmpeg -hide_banner -loglevel error \
        -f v4l2 -r 30 -s 1920x1080 \
        -i $device $output
    echo "Видео снято"
elif [[ $video ]]; then
    echo 'Нажмите q, чтобы завершить'
    ffmpeg -hide_banner -loglevel error \
        -f v4l2 -framerate 30 -video_size 1920x1080 \
        -i $device video.mp4
    echo "Видео снято"

Стрим

elif [[ $stream ]]; then
    getsdevice
    if [[ $XDG_BACKEND = "wayland" ]]; then
        echo "Нажмите Ctrl+C, чтобы завершить"
        wf-recorder --muxer=v4l2 --codec=rawvideo \
            -t --file=$sdevice yuv420pq
    else
        echo "Нажмите q, чтобы завершить"
        ffmpeg -hide_banner -loglevel error \
            -f x11grab -show_region 1 -framerate 25 \
            -i $DISPLAY -vf format=yuv420p -f v4l2 $sdevice
    fi
fi