Что-нибудь лучше, чем сыр для захвата видео?


56

Мне нужно записать видео с моей веб-камеры, и хотя Cheese работает, ему не хватает настроек, и выводится только тот веб-формат, который полон заиканий и т. Д.

Не могу найти никакой альтернативы ...

Ответы:


57

Guvcview стремится предоставить простой интерфейс GTK для захвата и просмотра видео с устройств, поддерживаемых драйвером Linux UVC, хотя он также должен работать с любым v4l2-совместимым устройством.

Проект основан на luvcview для рендеринга видео, но все элементы управления построены с использованием интерфейса GTK2.

Guvcview (начиная с версии 0.9.9) имеет окно только для управления (из консоли guvcview --control_only:), это позволяет управлять изображениями в других приложениях, таких как ekiga, cheese, mplayer, skype ...

Аудио.

Поддержка звука Guvcview основана на библиотеке portaudio, вплоть до версии 0.9.3 для захвата звука использовался API блокировки, поскольку вместо версии 0.9.4 используется метод обратного вызова, это обеспечивает лучшую производительность, это также предпочтительный метод для Portaudio API.

Все интерфейсы (ALSA, OSD, JACK, ...), поддерживаемые portaudio, должны быть доступны в guvcview. Просто убедитесь, что portaudio был скомпилирован с включенными желаемыми интерфейсами.

UVC Динамическое управление.

Драйвер Linux UVC имеет реализацию для элементов управления расширениями (это специфичные для поставщика элементы управления и поддерживаются в спецификации UVC), они называются динамическими элементами управления, поскольку их необходимо динамически загружать в драйвер.

До сегодняшнего дня только Logitech предоставлял спецификации для своих контролов расширения веб-камеры UVC, они поддерживаются guvcview.

В новых версиях драйверов необходимы права администратора для добавления этих элементов управления в драйвер, поэтому в основном есть два решения:

  1. запускать guvcview от имени пользователя root (используя sudo) хотя бы один раз за сеанс, начиная с версии 1.2.0 вы можете сделать это с помощью опции, --add_ctrlsпозволяющей избежать необходимости полного запуска guvcview

  2. Установите libwebcam. Это программное обеспечение имеет скрипт udev, который должен добавить необходимые элементы управления на вашу камеру Logitech.

Установите Guvcview для Ubuntu 12.04 через ppa

sudo add-apt-repository ppa:pj-assis/ppa
sudo apt-get update
sudo apt-get install guvcview

1
Это приложение потрясающе. Кстати - большинство элементов управления работали хорошо, не делая ничего.
HDave

Сыр просто не работал для меня, Guvcview работал отлично. Единственное, что нужно было, чтобы найти правильный источник для входа в аудиторию, потребовалась минута игры, но все равно не нужно было читать руководство или выполнять какие-то действия, чтобы заставить его работать.
jdarling

2
Несмотря на великолепный внешний вид guvcview, он в настоящее время разрушен (по крайней мере, в 16.04) bugs.launchpad.net/ubuntu/+source/guvcview/+bug/1558060 (замороженное видео). Вместо этого я использую устройство MEncoder линии от commandlinefu.com/commands/view/3498/... (регулировка ширины и высоты) , и она работает безупречно.
Мигуев

@miguev Эта версия, кажется, решает проблему.
Скиппи ле Гран Гуру

«Ошибка Guvcview не может запустить видеопоток на устройстве» GUVCVIEW (1): ошибка Guvcview неверный индекс разрешения GUVCVIEW: неверный индекс разрешения Ошибка сегментации (ядро сброшено)
Аарон Франке


11

Части этого вопроса происходят от ответа на этот вопрос: запись с VHS-кассет .

Мы должны убедиться, что программное обеспечение собирает правильные данные с нужного устройства. Давайте отбросим запрос в терминале, который позволит нам увидеть, сколько устройств подключено к вашему компьютеру, и которые можно использовать для сбора изображений, используя эту команду в терминале:

ls -l /dev/video*

Результаты должны быть такими:

geppettvs@DYLAN:~$ ls -l /dev/video*
crw-rw----+ 1 root video 81, 0 2012-04-17 19:53 /dev/video0
crw-rw----+ 1 root video 81, 1 2012-04-17 19:53 /dev/video1
crw-rw----+ 1 root video 81, 2 2012-04-18 17:54 /dev/video2
geppettvs@DYLAN:~$ 

В моем случае у меня есть 3 видеоустройства, одним из которых является ТВ-тюнер USB, который я использую для просмотра / записи ТВ-шоу в прямом эфире / видеомагнитофона / видеомагнитофона / RF-DVD / видеоконвертера и других радиосигналов.

Другими устройствами являются веб-камера USB, подключенная к USB-слотам на компьютере.

Если ваша веб-камера оснащена микрофоном, аудио и видео можно записать с помощью сценария tvcap от Andreas Schalk , код которого я приведу здесь для вашего удобства:

#!/bin/bash
#
#  tvcap-script by Andreas Schalk, easycap.blogspot.com (Dec. 2011)
#  This script is based an a template TV-script from Jose Catre-Vandis (Jan 2006).
#  The ascii artwork is based on a template i found here: http://www.retrojunkie.com/asciiart/electron/tv.txt
#  Contact: easycapdc60-blogspot@yahoo.de
#-----------------------------------------------------------------------------
#
#  FUNCTION: This script provides Zenity menues for viewing an capturing video with a tv-card on Linux.
#
#  Supported programs: MPlayer, MEncoder, VLC, Tvtime, Cheese und Sox
# 
#-----------------------------------------------------------------------------
#  
#  Basic options:
#
#  Change the following parameters for viewing/ capturing according to your needs
#
#-----------------------------------------------------------------------------
VERBOSE=1   # if '0', this script does not show messages window and does not ask for norm and input number anymore
NORM="PAL"  # preselect tv norm 'PAL' or 'NTSC'
INPUT_NR=0      # preselect input number of your easycap where video source is plugged in
input_width=720     # preselect width an height of video source (mplayer, vlc, mencoder)
input_height=576    # other possible combinations: 640/480; 320/240 
ASPECT=169          # '169' (16:9) or '43' (4:3); this value affects video playback with mplayer or vlc only!
FREQ="48000"        # on soundproblems reduce audio frequency (44100 oder 32000 oder 8000)
TV_INPUT="no"       # if 'yes' the analogue antenna input of the tv-card will be used (mplayer only)
CHAN="chanlist=europe-west:channel=60"      # channel setting (nur mplayer/ mencoder) the analogue antenna input of the tv-card is used
NORM="PAL"          # preselect TV-norm 'PAL' oder 'NTSC'
INPUT_NR=1          # preselct the Input on the TV-card, where the videosource is plugged in ('0' normally is the antenna, '1' the first CVBS ...
#-----------------------------------------------------------------------------

MESSAGE=()
R_MESSAGE=()
EXITCODE=0

#-----------------------------------------------------------------------------

#-----------------------------------------------------------------------------
#   test videodevices
##-----------------------------------------------------------------------------

declare -a VIDEO_DEV

VIDEO_DEV=( TRUE    none
            FALSE   none
            FALSE   none
            FALSE   none
            ) 
i1=0;
i2=0;
while `test -e "/dev/video${i1}"`; do
  VIDEO_DEV[$i2+1]="/dev/video${i1}"; 
  i1=$[$i1+1];
  i2=$[$i2+2];
done
if [ "xnone" = "x${VIDEO_DEV[1]}" ]; then 
  zenity  --error --timeout=5 --text "Cannot find /dev/video0!\n Script ends in 5 seconds" --title "No videodevice!";
  exit 1;
fi

if [ "x${VIDEO_DEV[$i2+1]}" = "xnone" ];  then
    VIDEO_DEV[$i2]="" && VIDEO_DEV[$i2+1]="" && VIDEO_DEV[$i2+2]="" && VIDEO_DEV[$i2+3]="" && VIDEO_DEV[$i2+4]="" && VIDEO_DEV[$i2+5]="";
fi

DEV_VIDEO=$(zenity --list --text "Select videodevice" --radiolist --column "Choice" --column "Device" ${VIDEO_DEV[@]}) || exit 0 

if [ ${VERBOSE} = 1 ]; then
#-----------------------------------------------------------------------------
#  select TV norm
#-----------------------------------------------------------------------------
title="Select tv norm"
NORM=`zenity --title="$title" --list --radiolist --column="Choice" \
    --column="Norm" --column="Description" \
    TRUE "PAL" "PAL Norm" \
    FALSE "NTSC" "NTSC Norm" \
    ` || exit 0 
fi
#-----------------------------------------------------------------------------
#  select Input number
#-----------------------------------------------------------------------------
title="Select Input NR"
INPUT_NR=`zenity --title="$title" --list --radiolist --column="Choice" \
    --column="Input NR" --column="Description" \
    TRUE "0" "Input 1 (TV)" \
    FALSE "1" "Input 2" \
    FALSE "2" "Input 3" \
    FALSE "3" "Input 4" \
    FALSE "4" "Input 5" \
    FALSE "5" "Input 6"
    ` || exit 0 
#-----------------------------------------------------------------------------


#-----------------------------------------------------------------------------
#  Check if snd_usb_audio module is loaded
#-----------------------------------------------------------------------------
SND_USB=`lsmod | grep snd_usb_audio | wc -l`
if  [ "${SND_USB}" -ge "1" ]; then
#  MESSAGE=("${MESSAGE[@]}" "\nNOTE: snd_usb_audio module was loaded and may conflict with your USB capture device")
   zenity  --info --text "NOTE: The snd_usb_audio module was loaded\nand may conflict with your USB capture device.\n \nIf sound problems appear,\nplug out your USB capturedevice and run\n rmmod snd_usb_audio \nas root in the terminal!" --title "Snd_usb_audio module loaded!"
fi

#-----------------------------------------------------------------------------
# test and select soundcard
#-----------------------------------------------------------------------------

if `test ! -e /dev/dsp` && [ -z "`ls -1 /proc/asound`" ]; then
    if_audio="no";
    echo "No soundcard detected";
    MESSAGE=("${MESSAGE[@]}" "Note: No soundcard can be found!\nSound is not supported.\n");
else
if_audio="yes"
declare -a SOUND_DEV

SOUND_DEV=( FALSE   /dev/dsp    OSS
            FALSE   card1   ALSA    
            TRUE    card2   ALSA
            FALSE   card3   ALSA
            ) 

test ! -e /dev/dsp && echo "No dsp" && SOUND_DEV[0]="" && SOUND_DEV[1]="" && SOUND_DEV[2]=""

ALSA_CARD=$(cat /proc/asound/cards | cut -d":" -f1 -s)
declare -a ALSA_CARDS
ALSA_CARDS=(${ALSA_CARD})

i5=1
for P in ${ALSA_CARDS[@]}; do
    ALSA_NAME=$(echo ${ALSA_CARDS[$i5]} | tr -d [=[=] );
    SOUND_DEV[$i5+3]=$ALSA_NAME
    if [ "x${ALSA_NAME}" = "x" ];  then
    SOUND_DEV[$i5+2]="" && SOUND_DEV[$i5+3]="" && SOUND_DEV[$i5+4]=""
    fi
    i5=$[$i5+3];
done
fi

DEV_AUDIO=$(zenity --list --text "Select soundcard" --radiolist --column "Choice" --column "Device" --column "Type" ${SOUND_DEV[@]}) || exit 0 

if [ $DEV_AUDIO = "/dev/dsp" ]; then 
    AUDIO_TYPE="oss"
    else
    AUDIO_TYPE="alsa"
fi
#-----------------------------------------------------------------------------

#-----------------------------------------------------------------------------
#   test, if devicenodes are read- and writable for unprivileged users
#-----------------------------------------------------------------------------

if [ -r ${DEV_VIDEO} ] && [ -w ${DEV_VIDEO} ]; then
MESSAGE=("${MESSAGE[@]}" "\nSUCCESS! ${DEV_VIDEO} is read- and writable!\n")
elif [ -e ${DEV_VIDEO} ]; then
zenity --info --text "Cannot access ${DEV_VIDEO}!\nRun 'sudo chmod a+rw ${DEV_VIDEO}'\nin the terminal!" --title "Message"
EXITCODE=1
fi

    if [ -r ${DEV_AUDIO} ] && [ -w ${DEV_AUDIO} ]; then
    MESSAGE=("${MESSAGE[@]}" "\nSUCCESS! ${DEV_AUDIO} is read- and writable!")
    elif [ -e ${DEV_AUDIO} ]; then
    zenity --info --text "\nCannot access ${DEV_AUDIO}!\nRun 'sudo chmod a+rw ${DEV_AUDIO}'\nin the terminal!" --title "Message"
    MESSAGE=("${MESSAGE[@]}" "\n\nCannot access ${DEV_AUDIO}!\nRun 'sudo chmod a+rw ${DEV_AUDIO}'\nin the terminal!!")
    if_audio="no"
    fi
#-----------------------------------------------------------------------------

#-----------------------------------------------------------------------------
#  find executable programs
#-----------------------------------------------------------------------------
PROG_LIST=( TRUE    vlc     #
            FALSE   mplayer     #
            FALSE   cheese      #
            FALSE   tvtime      #
            FALSE   mencoder    #
            FALSE   sox         #
            ) 

PROGS=(vlc mplayer cheese tvtime mencoder sox)
i4=0
for P in ${PROGS[@]}; do
            PROG=`which $P`
            if [ "x" = "x${PROG}" ] || [ ! -x ${PROG} ]; then
            echo "Cannot find or execute $P. Is t installed?"
            MESSAGE=("${MESSAGE[@]}" "\nCannot find or execute $P. Is it installed?")
            PROG_LIST[$i4]=""
            PROG_LIST[$i4+1]=""
                if [ "${PROG_LIST[11]}" = "" ]; then
                echo "Sox is needed for sound with tvtime!"
                MESSAGE=("${MESSAGE[@]}" "\nSox is needed for sound with tvtime!")
                fi          
            fi
            i4=$i4+2
done
PROG_LIST[10]=""        # Sox does not show up on list
PROG_LIST[11]=""        #
#-----------------------------------------------------------------------------

#-----------------------------------------------------------------------------
#  messages are displayed and script ends
#-----------------------------------------------------------------------------
if [ ${EXITCODE} = 1 ]; then
    MESSAGE=("${MESSAGE[@]}" "\nScript ends")
fi
echo ${MESSAGE[*]}
#########################
if [ ${VERBOSE} = 1 ]; then
zenity --height="50" --info --text "${MESSAGE[*]}" --title "Messages"
fi

if [ ${EXITCODE} = 1 ]; then
    exit 1
fi
#-----------------------------------------------------------------------------

#-----------------------------------------------------------------------------
#  create logfile
#-----------------------------------------------------------------------------
LOGFILE="./test`echo "${DEV_VIDEO}" | sed -e "s,/dev/,," - `.log"

# echo "Log file is:  ${LOGFILE}"
#-----------------------------------------------------------------------------

#-----------------------------------------------------------------------------
#  zenity list - program choice
#-----------------------------------------------------------------------------

view_cap=$(zenity --list --width=250 --height=400 --text "  ___________\n |  .----------.  o|\n | |   Easy  | o|\n | |   CAP_  | o|\n |_\`-----------´ _|\n   ´\`          ´\`\\nTv-norm: $NORM  Input-Nr:$INPUT_NR\nVideodevice: $DEV_VIDEO $input_width x $input_height \nAudiodevice: $AUDIO_TYPE $DEV_AUDIO $FREQ Hz\nIs audio on? $if_audio\nLogfile: $LOGFILE " --radiolist --column "Choice" --column "program" ${PROG_LIST[@]}) || exit 0

#-----------------------------------------------------------------------------

#-----------------------------------------------------------------------------
#  mplayer command
#-----------------------------------------------------------------------------
if [ "alsa" = "${AUDIO_TYPE}" ]; then
M_AUDIO="buffersize=16:alsa:amode=1:forcechan=2:audiorate=${FREQ}:adevice=plughw.${DEV_AUDIO}"
elif [ "oss" = "${AUDIO_TYPE}" ]; then
M_AUDIO="adevice=${DEV_AUDIO}"
fi

if [ "$NORM" = "PAL" ]; then
    fps_count=25
else 
    fps_count=30
fi

if [ "$ASPECT" = 169 ]; then
    M_ASPECT="-aspect 1.78"
#   elif [ "$ASPECT" = 43 ]; then
#   M_ASPECT="-aspect 1"
    else
    M_ASPECT=""
    fi

if [ "yes" = "${TV_INPUT}" ]; then
M_VIDEO="${CHAN}"
elif [ "no" = "${TV_INPUT}" ]; then
M_VIDEO="norm=${NORM}:width=${input_width}:height=${input_height}:outfmt=uyvy:device=${DEV_VIDEO}:input=${INPUT_NR}:fps=${fps_count}"
fi

#echo $M_VIDEO
#echo $M_AUDIO
#echo $view_cap

if [ "mplayer" = "${view_cap}" ]; then


if [ "$if_audio" = "yes" ]; then    
1>${LOGFILE} 2>&1 \
mplayer tv:// -tv driver=v4l2:${M_VIDEO}:${M_AUDIO}:forceaudio:immediatemode=0 -hardframedrop ${M_ASPECT} -ao sdl, ${AUDIO_TYPE} -msglevel all=9

elif [ "$if_audio" = "no" ]; then
1>${LOGFILE} 2>&1 \
mplayer tv:// -tv driver=v4l2:${M_VIDEO} -hardframedrop ${M_ASPECT} -msglevel all=9 -nosound
fi
fi
#-----------------------------------------------------------------------------

#-----------------------------------------------------------------------------
#  vlc command
#-----------------------------------------------------------------------------
if [ "vlc" = "${view_cap}" ]; then

    if [ "alsa" = "${AUDIO_TYPE}" ]; then
    V_AUDIO="//plughw:${DEV_AUDIO}"
    elif [ "oss" = "${AUDIO_TYPE}" ]; then
    V_AUDIO="//${DEV_AUDIO}"
    fi

    if [ "$NORM" = "PAL" ]; then
    V_NORM="pal"
    elif [ "$NORM" = "NTSC" ]; then
    V_NORM="ntsc"
    fi

    if [ "$ASPECT" = 169 ]; then
    V_ASPECT="--aspect-ratio=16:9"
    elif [ "$ASPECT" = 43 ]; then
    V_ASPECT="--aspect-ratio=4:3"
    else
    V_ASPECT=""
    fi

1>${LOGFILE} 2>&1 \
vlc -vvv v4l2://${DEV_VIDEO}:input=${INPUT_NR}:width=$input_width:height=$input_height:norm=${V_NORM} ${V_ASPECT} :input-slave=${AUDIO_TYPE}:${V_AUDIO} --demux rawvideo 
fi
#-----------------------------------------------------------------------------

#-----------------------------------------------------------------------------
#  tvtime command
#-----------------------------------------------------------------------------
if [ "tvtime" = "${view_cap}" ]; then
    if [ "alsa" = "${AUDIO_TYPE}" ]; then
    T_AUDIO="-t alsa plughw:${DEV_AUDIO} -s2 -c 2 -r ${FREQ} -s2 -t alsa default"
    elif [ "oss" = "${AUDIO_TYPE}" ]; then
    T_AUDIO="-t raw -s2 ${DEV_AUDIO} -c 2 -r ${FREQ} -s2 -t ossdsp /dev/dsp"
    fi
echo $T_AUDIO
1>${LOGFILE} 2>&1 \
>./tvtime.err
(tvtime -d ${DEV_VIDEO} -i 0 -n "${NORM}" 1>/dev/null 2>>./tvtime.err) &
rc=1
while [ 0 -ne ${rc} ];
do
  tvtime-command run_command "(sox -c 2 -r ${FREQ} ${T_AUDIO} 1>/dev/null 2>>./tvtime.err)" 1>/dev/null 2>>./tvtime.err
  rc=$?
  if [ 0 -eq ${rc} ]; then break; fi
  sleep 0.5
done
fi
#-----------------------------------------------------------------------------

#-----------------------------------------------------------------------------
#  cheese command
#-----------------------------------------------------------------------------
if [ "cheese" = "${view_cap}" ]; then
1>${LOGFILE} 2>&1 \
cheese
fi
#-----------------------------------------------------------------------------

#-----------------------------------------------------------------------------
#  mencoder command - recording section
#-----------------------------------------------------------------------------

if [ "mencoder" = "${view_cap}" ]; then

#Auswahl des Seitenverhältnisses der Aufnahme?
title="Chose aspect of your target file!"
aspect_type=`zenity  --width="400" --height="220" --title="$title" --list --radiolist --column="Click Here" \
    --column="choice" --column="source >> target" \
    TRUE "1" "4:3 > 4:3"\
    FALSE "2" "4:3 > scale=16:9" \
    FALSE "3" "4:3 > crop borders=16:9" \
    ` || exit 0 

if [ "$aspect_type" = "1" ]; then
    crop_scale="scale=640:480"
elif [ "$aspect_type" = "2" ]; then
    crop_scale="scale=720:406"
elif [ "$aspect_type" = "3" ]; then
    crop_scale="crop=720:406:0:72"
fi  

#################################################################################
#Quality?
title="What quality do you want to record at ?"
qual_type=`zenity  --width="380" --height="380" --title="$title" --list --radiolist --column="Click Here" \
    --column="Record Time" --column="Description" \
    FALSE "500" "Passable Quality"\
    FALSE "900" "OK Quality"\
    FALSE "1100" "VHS Quality"\
    TRUE "1300" "SVHS Quality"\
    FALSE "1500" "VCD Quality"\
    FALSE "1800" "SVCD Quality" \
    FALSE "2000" "Very Good Quality"\
    FALSE "2500" "High Quality" \
    FALSE "3000" "Excellent Quality"\
    ` || exit 0

##################################################################################
#How Long?
title="How long do you want to record for ?"
time_type=`zenity  --width="380" --height="500" --title="$title" --list --radiolist --column="Click Here" \
    --column="Record Time" --column="Description" \
    FALSE "00:00:00" "unlimited"\
    TRUE "00:00:30" "30 seconds for testing"\
    FALSE "00:10:00" "0.2 hours"\
    FALSE "00:30:00" "0.5 hours"\
    FALSE "00:45:00" "0.75 hours"\
    FALSE "01:00:00" "1 hour"\
    FALSE "01:15:00" "1.25 hours"\
    FALSE "01:30:00" "1.5 hours" \
    FALSE "01:45:00" "1.75 hours"\
    FALSE "02:00:00" "2 hours" \
    FALSE "02:15:00" "2.25 hours"\
    FALSE "02:30:00" "2.5 hours" \
    FALSE "02:45:00" "2.75 hours"\
    FALSE "03:00:00" "3 hours" \
    FALSE "03:15:00" "3.25 hours" \
    FALSE "03:30:00" "3.5 hours" \
    ` || exit 0

#M_TIME="-endpos $time_type"

#################################################################################
#user must enter a filename
filedate=$(date +%F_%H:%M-%S)
title="Please enter a filename for your recording, no spaces"
file_name=`zenity  --width="480" --height="150" --title="$title" --file-selection --save --confirm-overwrite --filename="tvcap_$filedate"` || exit 0

###########################################################################################
# summary
R_MESSAGE=("${R_MESSAGE[@]}" "\nRecording options:")
R_MESSAGE=("${R_MESSAGE[@]}" "\nRecording audio: $if_audio")
R_MESSAGE=("${R_MESSAGE[@]}" "\nRecording from Input $INPUT_NR - Norm: $NORM $fps_count fps")
R_MESSAGE=("${R_MESSAGE[@]}" "\nCrop and scale options: $crop_scale")
R_MESSAGE=("${R_MESSAGE[@]}" "\nEncoding quality: $qual_type kb/s")
R_MESSAGE=("${R_MESSAGE[@]}" "\nRecording time:$time_type hours")
R_MESSAGE=("${R_MESSAGE[@]}" "\nFile name: $file_name.avi ")

echo ${R_MESSAGE[*]}

if [ ${VERBOSE} = 1 ]; then
zenity --info --text "${R_MESSAGE[*]}" --title "Recording options"
fi
#-----------------------------------------------------------------------------

#-----------------------------------------------------------------------------
#  mencoder line
#-----------------------------------------------------------------------------
if [ "$if_audio" = "yes" ]; then

zenity --info --title="Start recording with audio" --text="Press OK to start."

mencoder tv:// -tv driver=v4l2:norm=$NORM:width=$input_width:height=$input_height:outfmt=uyvy:device=${DEV_VIDEO}:input=${INPUT_NR}:fps=$fps_count:${M_AUDIO}:forceaudio:immediatemode=0 -msglevel all=9 -ovc lavc -ffourcc DX50 -lavcopts vcodec=mpeg4:mbd=2:turbo:vbitrate=$qual_type:keyint=15 -vf pp=lb,$crop_scale -oac mp3lame -endpos $time_type -o $file_name.avi | tee ${LOGFILE} | zenity --progress --pulsate --auto-close --auto-kill --text="Processing Video - length: $time_type H:M:S" 

zenity --info --title="Job complete" --text="The recording is now complete."


elif [ "$if_audio" = "no" ]; then

zenity --info --title="Start recording without audio" --text="Press ok to start recording"
1>${LOGFILE} 2>&1 \
mencoder tv:// -tv driver=v4l2:norm=$NORM:width=$input_width:height=$input_height:outfmt=uyvy:device=${DEV_VIDEO}:input=${INPUT_NR}:fps=$fps_count -msglevel all=9 -nosound -ovc lavc -ffourcc DX50 -lavcopts vcodec=mpeg4:mbd=2:turbo:vbitrate=$qual_type:keyint=15 -vf pp=lb,$crop_scale -endpos $time_type -o $file_name.avi | tee ${LOGFILE} | zenity --progress --pulsate --auto-close --auto-kill --text="Processing Video - length: $time_type H:M:S" 

zenity --info --title="Job complete" --text="The recording is now complete."

fi

fi
exit 1

Просто скопируйте / вставьте весь этот код в файл с именем tvcap-script.sh, дайте разрешения на выполнение и запустите его в терминале. Процесс довольно прост, и я собираюсь объяснить следующее:

1.- После нажатия клавиши Enter у вас спросят источник захвата и, в зависимости от местоположения устройства (тестировалось ранее), вы можете иметь - как в моем случае - несколько видеоисточников, для этого я использую / dev / video2 Пример, который относится к моему USB TV Tuner. Обратите внимание, что на этом снимке экрана не было оформителя окна, но параметры и кнопка «ОК» можно увидеть прямо здесь.

введите описание изображения здесь

2. Теперь нам нужно определить норму, в Мексике мы используем NTSC, и если вы не хотите снимать видео с использованием другой нормы с квадратным соотношением сторон, вы не должны использовать PAL, который действительно может немного повредить вашему качеству видео. Это также зависит от того, где вы живете и нормы вашей страны.

введите описание изображения здесь

3. Мой ТВ-тюнер имеет несколько входов, ваш может иметь различное количество входов, проверить его и запустить столько тестов, сколько вам нужно, чтобы определить, какой из них лучше для вашего захвата. Я собираюсь использовать тот, который относится к телевидению. (Вход 1 (ТВ))

введите описание изображения здесь

4.- Далее, вы можете (или нет) быть предупреждены и предложены решение, если во время захвата звука что-то пойдет не так (аудио и видео будут захвачены одновременно, но если ваш модуль snd_usb_audio уже был загружен, это может привести к сбою захват аудио и, следовательно, сам захват видео)

введите описание изображения здесь

5.- Мой ТВ-тюнер поддерживает несколько аудиовходов, включая интеграцию со встроенным звуковым устройством на моей материнской плате (через подключение к aux-линии и управление звуковым микшером), вы выбираете, какой из них лучше для Вы и помните, что значения по умолчанию обычно помечаются как «лучшие для вас».

введите описание изображения здесь

6.- Если все идет хорошо, вы увидите небольшое окно с сообщением, которое выглядит примерно так:

"УСПЕХ! / Dev / video2 доступен для чтения и записи!"

нажмите «ОК», чтобы продолжить.

введите описание изображения здесь

7.- После этого вы можете выбрать из списка параметров записи, доступных в вашей системе. Я установил то, что вы можете увидеть на следующем скриншоте. Все действительны, и качество не отражает серьезных изменений, но я лично предпочитаю mencoder . Если у вас нет ни одного из них, вы должны установить его для запуска ваших тестов.

введите описание изображения здесь

8.- После того, как вы выбрали настройку программного обеспечения для кодирования (на предыдущем шаге), вас спросят о соотношении сторон. Если у вас нет опыта в этом, просто оставьте все как есть. Обычно по умолчанию лучше подходит сигнал ТВ-тюнера.

введите описание изображения здесь

9.- На основе вашего выбора, связанного с соотношением сторон, у вас будет несколько вариантов качества видео, также основанных на битрейте, описание в следующем окне очень специфично. Помните, что: чем выше битрейт (лучшее качество), тем больше размер видеофайла.

введите описание изображения здесь

10.- После этого нам нужно просто выбрать, как долго будет продолжаться наш захват видео. Есть несколько предустановок, в этом примере я выбрал «30 секунд для тестирования», но вы можете выбрать любой или даже «неограниченный», чтобы решить, когда прекратить запись.

введите описание изображения здесь

11.- Затем вам будет предложено указать имя файла, по умолчанию оно будет указано на этом экране.

введите описание изображения здесь

12.- На следующем экране вам будет предложено проверить «Параметры записи», просто нажмите «ОК».

введите описание изображения здесь

13.- Просто еще один клик, чтобы начать.

введите описание изображения здесь

14.- Во время записи терминал может показывать некоторую активность и небольшое окно, подобное этому:

введите описание изображения здесь

15.- В конце процесса вы получите окно подтверждения.

введите описание изображения здесь

Вот и все...

Вы можете отменить запись или сам процесс, нажав ESC в любой момент, никаких изменений не будет.

В конце записи у вас будет видео в том месте, которое вы выбрали на шаге 11, в дополнение к файлу журнала с именем вроде: «testvideo0.log» или что-то в этом роде.

Это самый простой способ кодирования с ТВ-тюнеров радиосигналов, объединяющий аудио и видео в один файл.

У меня есть еще один процесс, который достигается с помощью процесса Python, который имеет графический интерфейс, в котором вы можете обрабатывать несколько полезных вещей, таких как смена канала, запуск тестов предварительной записи и даже запись, но иногда это отбрасывает меня неудачи. Если вы хотите, пожалуйста, дайте мне знать, как я могу связаться с вами. Я не хочу писать пергаменты или библию ... LOL!

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

Удачи!


Какую карту USB TV Tuner вы рекомендуете, и работает ли указанное выше решение для более чем 2-3 видеопотоков на одном компьютере с Linux? Я хочу попробовать записать 4-8 видео на одной машине. Это возможно по вашему мнению?
CP3O

Любая плата аналогового ТВ-тюнера, как PCI, так и / или USB, должна работать, если и только если устройство правильно обнаружено и установлено. Что касается записи с несколькими подачами, это решение должно работать идеально, если вы запускаете несколько экземпляров и выбираете правильный поток носителей. К сожалению, в некоторых случаях аудиопоток управляется вашим любимым аудиомикшером (скажем, alsa или pulseaudio, jack и т. Д.), Возможно, потребуется точная настройка кода, чтобы сказать, какой аудиопоток мы собираемся использовать для захват на определенном видео устройстве. Кроме того, чем больше потоков вы захватываете, тем больше ресурсов ему нужно.
Geppettvs D'Constanzo


1

Это самая простая команда:

ffmpeg -i /dev/video0 output.mp4

Эй, добро пожаловать, чтобы спросить Ubuntu! Не могли бы вы уделить время, чтобы отредактировать свой ответ, чтобы объяснить, как работает комментарий и как он лучше всего решит проблему ОП? Спасибо :)
grooveplex

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.