¿Algo mejor que Cheese para capturar videos?

56

Necesito grabar algunos videos de mi cámara web, y aunque Cheese funciona, carece de configuración y solo genera el formato webm que está lleno de tartamudeos, etc.

Parece que no puedo encontrar ninguna alternativa ...

HDave
fuente

Respuestas:

57

Guvcview tiene como objetivo proporcionar una interfaz GTK simple para capturar y ver videos de dispositivos compatibles con el controlador UVC de Linux, aunque también debería funcionar con cualquier dispositivo compatible con v4l2.

El proyecto se basa en luvcview para la representación de video, pero todos los controles se crean utilizando una interfaz GTK2.

Guvcview (desde la versión 0.9.9) tiene una ventana de solo control, (desde la consola guvcview --control_only:), esto permite el control de imágenes en otras aplicaciones, como ekiga, cheese, mplayer, skype ...

Audio.

El soporte de audio Guvcview se basa en la biblioteca de portaudio, hasta la versión 0.9.3 se utilizó la API de bloqueo para la captura de audio, ya que en la versión 0.9.4 se utiliza el método de devolución de llamada, esto proporciona un mejor rendimiento, también es el método preferido para Portaudio API.

Todas las interfaces (ALSA, OSD, JACK, ...) compatibles con portaudio deben estar disponibles en guvcview. Solo asegúrese de que el portaudio se haya compilado con las interfaces deseadas habilitadas.

Controles dinámicos UVC.

El controlador UVC de Linux tiene una implementación para controles de extensión (estos son controles específicos del proveedor y se admiten en la especificación UVC), se denominan controles dinámicos ya que deben cargarse dinámicamente en el controlador.

Hasta hoy, solo logitech ha suministrado especificaciones para sus controles de extensión de cámara web UVC, estos son compatibles con guvcview.

En las nuevas revisiones de controladores, se necesitan derechos de administrador para agregar estos controles al controlador, por lo que básicamente hay dos soluciones:

  1. inicie guvcview como root (usando sudo) al menos una vez por sesión, desde la versión 1.2.0 puede hacerlo con la opción --add_ctrlsevitando la necesidad de iniciar guvcview por completo

  2. instale libwebcam, este software tiene un script udev que debe agregar los controles necesarios a su cámara logitech.

Instale Guvcview a Ubuntu 12.04 a través de ppa

sudo add-apt-repository ppa:pj-assis/ppa
sudo apt-get update
sudo apt-get install guvcview
ptheo
fuente
1
Esta aplicación es asombrosa. Por cierto, la mayoría de los controles funcionaron bien sin tener que hacer nada.
HDave
El queso simplemente no funcionó para mí, Guvcview funcionó perfectamente. Lo único fue encontrar la fuente de entrada de audo correcta, tomó un minuto de reproducción, pero aún no necesitaba leer el manual o hacer algo de magia para que funcionara.
Jdarling
2
Para todos los grandes looks de guvcview, actualmente está arruinado (al menos en 16.04) por bugs.launchpad.net/ubuntu/+source/guvcview/+bug/1558060 (video congelado). En cambio, estoy usando la línea mencoder de commandlinefu.com/commands/view/3498/… (ajustando el ancho y la altura) y funciona perfectamente.
miguev
@miguev Esta versión parece solucionar el problema.
Skippy le Grand Gourou
"El error de Guvcview no pudo iniciar una transmisión de video en el dispositivo" GUVCVIEW (1): error de Guvcview índice de resolución no válido GUVCVIEW: índice de resolución no válido Fallo de segmentación (núcleo volcado)
Aaron Franke
14

Si necesita una nueva aplicación, guvcviewInstalar guvcview es bueno.

https://launchpad.net/guvcview

JoeSteiger
fuente
+1, acabo de probar esta aplicación debido a un problema con la grabación de audio en queso. Trabajó un placer!
Ash
11

Parte de esta pregunta proviene de la respuesta en esta pregunta: Grabar de cintas VHS .

Necesitamos asegurarnos de que el software esté recopilando los datos adecuados del dispositivo correcto. Dejemos una consulta en el terminal que nos permitirá ver cuántos dispositivos están conectados a su computadora, que se pueden usar para recopilar imágenes, use este comando en un terminal:

ls -l /dev/video*

Los resultados deberían ser así:

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:~$ 

En mi caso, tengo 3 dispositivos de video, de los cuales uno es el sintonizador de TV USB que uso para ver / grabar programas de TV en vivo / VTR / VCR / RF-DVD / Video Converter y otras señales de RF.

Los otros dispositivos son una cámara web USB conectada a las ranuras USB de la computadora.

Si su cámara web tiene un micrófono, tanto el audio como el video pueden grabarse usando el script tvcap de Andreas Schalk , cuyo código coloco aquí para su conveniencia:

#!/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: [email protected]
#-----------------------------------------------------------------------------
#
#  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

Simplemente copie / pegue todo este código en un archivo llamado tvcap-script.sh, otorgue los permisos de ejecución y ejecútelo en un terminal. El proceso es bastante fácil y voy a explicar lo siguiente:

1.- Después de presionar Enter, se le pedirá la fuente de captura, y dependiendo de la ubicación del dispositivo (probado anteriormente), puede tener, como en mi caso, varias fuentes de video, estoy usando / dev / video2 para esto ejemplo, que se refiere a mi sintonizador de TV USB. Tenga en cuenta que esta captura de pantalla no obtuvo el decorador de ventanas, pero las opciones y el botón "Aceptar" se pueden ver allí mismo.

ingrese la descripción de la imagen aquí

2.- Ahora necesitamos definir la norma, en México usamos NTSC, y a menos que desee capturar su video usando una norma diferente con una relación de aspecto cuadrada, no debe usar PAL, lo que de hecho puede dañar un poco la calidad de su video. También depende de dónde vivas y la norma de tu país.

ingrese la descripción de la imagen aquí

3.- Mi sintonizador de TV tiene varias entradas, la suya puede tener una cantidad diferente de entradas, verifíquela y ejecute todas las pruebas que necesite para determinar cuál es la mejor para su captura. Voy a usar el que se refiere a la televisión. (Entrada 1 (TV))

ingrese la descripción de la imagen aquí

4.- Luego, puede (o no) ser advertido y ofrecido una solución si algo sale mal durante la captura de sonido (tanto el audio como el video se capturarán de una vez, pero si su módulo snd_usb_audio ya se ha cargado, puede fallar la captura de audio y, por lo tanto, la captura de video en sí)

ingrese la descripción de la imagen aquí

5.- Mi sintonizador de TV ofrece soporte para varias entradas de audio, lo que incluye la integración con el dispositivo de sonido incorporado en mi placa base (mediante la conexión de un cable a la línea auxiliar y controlado por un mezclador de sonido), verifica cuál es el mejor para usted y recuerde que los valores predeterminados generalmente están marcados como "lo mejor para usted".

ingrese la descripción de la imagen aquí

6.- Si todo va bien, verá una pequeña ventana con un mensaje que dice algo como esto:

"¡ÉXITO! / Dev / video2 es de lectura y escritura!"

haga clic en "Aceptar" para continuar.

ingrese la descripción de la imagen aquí

7.- Después de eso, puede elegir de la lista de opciones de grabación disponibles en su sistema. He instalado lo que puedes ver en la siguiente captura de pantalla. Cualquiera es válido y la calidad no refleja cambios importantes, pero personalmente prefiero mencoder . Si no tiene ninguno de estos instalados, debe instalarlo para ejecutar sus pruebas.

ingrese la descripción de la imagen aquí

8.- Después de haber elegido su preferencia de software de codificación (en el paso anterior), se le pedirá la relación de aspecto. Si no tienes experiencia en esto, déjalo como está. Normalmente, el valor predeterminado es el que mejor se adapta a la señal del sintonizador de TV.

ingrese la descripción de la imagen aquí

9.- Según su elección relacionada con la relación de aspecto, tendrá varias opciones para la calidad del video, también en función de la tasa de bits, la descripción en la siguiente ventana es muy específica. Recuerde que: a mayor velocidad de bits (mejor calidad), el tamaño del archivo de video puede llegar a ser enorme.

ingrese la descripción de la imagen aquí

10.- Después de eso, solo tenemos que elegir cuánto tiempo durará nuestra captura de video. Hay varios ajustes preestablecidos, he elegido "30 segundos para probar" en este ejemplo, pero puede elegir cualquiera o incluso elegir "ilimitado" para decidir cuándo detener la grabación.

ingrese la descripción de la imagen aquí

11.- A continuación, se le pedirá un nombre de archivo, que le dará uno por defecto, que puede cambiar en esta pantalla.

ingrese la descripción de la imagen aquí

12.- Se le pedirá que verifique sus "Opciones de grabación" en la siguiente pantalla, simplemente haga clic en "Aceptar".

ingrese la descripción de la imagen aquí

13.- Solo un clic más para comenzar.

ingrese la descripción de la imagen aquí

14.- Al grabar, el terminal puede mostrar alguna actividad, y una pequeña ventana como esta:

ingrese la descripción de la imagen aquí

15.- Al final del proceso, recibirás una ventana de confirmación.

ingrese la descripción de la imagen aquí

Y eso es...

Puede cancelar la grabación o el proceso en sí presionando ESC en cualquier momento, no habrá cambios en absoluto.

Al final de la grabación, tendrá el video en el lugar que elija en el paso 11, junto con un archivo de registro con un nombre como: "testvideo0.log" o algo así.

Esta es la forma más fácil de codificar desde sintonizadores de TV de señal de RF, reuniendo tanto audio como video en el mismo archivo.

Tengo otro proceso que se logra utilizando un proceso de Python que cuenta con una GUI en la que puede manejar varias cosas útiles, como cambiar el canal, ejecutar pruebas de pregrabación e incluso grabar, pero a veces me deja fallas. Si lo desea, hágamelo saber cómo puedo comunicarme con usted. No quiero escribir pergaminos o una biblia ... LOL!

Si este procedimiento no funciona para su caso, avíseme incluyendo sus resultados para brindarle algún apoyo antes de eliminar esta respuesta. Gracias y...

¡Buena suerte!

Geppettvs D'Constanzo
fuente
¿Qué tarjeta sintonizadora de TV USB recomienda, y la solución anterior funciona para más de 2-3 alimentaciones de video en una sola máquina Linux? Quiero intentar grabar de 4 a 8 videos en una sola máquina. ¿Es eso factible en tu opinión?
CP3O
Cualquier tarjeta sintonizadora de TV analógica, tanto PCI como USB, debería funcionar si y solo si el dispositivo se detecta e instala correctamente. Para lo que se refiere a la grabación de alimentación múltiple, esta solución debería funcionar perfectamente si ejecuta varias instancias y elige la alimentación de medios correcta. Desafortunadamente, en algunos casos, la secuencia de audio es administrada por su mezclador de audio favorito (digamos alsa o pulseaudio, jack, etc.), esto puede necesitar ajustar el código para decir qué secuencia de audio vamos a usar para la captura en cierto dispositivo de video. Además, cuantas más transmisiones capture, más recursos necesitará.
Geppettvs D'Constanzo
0

Este es el comando más simple:

ffmpeg -i /dev/video0 output.mp4
Ivan Malyshev
fuente
¡Hola, bienvenido a Ask Ubuntu! ¿Podrías dedicar un momento a editar tu respuesta para explicar cómo funciona el comentario y cómo resolverá mejor el problema de OP? Gracias :)
grooveplex