Ama*_*rus 5 video video-editor video-conversion
我最近拿到了一张 USB TV Tuner 卡。我想将旧的家庭 VHS 录像带数字化。但是,TV Tuner 卡驱动程序不处理音频,只处理视频。我从笔记本电脑的视频机插入了一个 3½ 毫米插孔。来自 VHS 的视频显示为 v4l 设备,如网络摄像头。我可以很好地观看视频(带音频)。我尝试编写一些 gstreamer 命令来从视频中录制,它有点工作,但最终音频会不同步。
那么是否有任何适用于 Ubuntu 的应用程序可以轻松地从 VHS 磁带/网络摄像头进行录制?可以正确进行编码的东西。
抱歉,这会很长。
\n\n首先我们需要了解射频电视调谐器本身可以同时解码音频和视频。如果它似乎没有“声音”,可能是因为您的声音设备没有从电视调谐器接收到任何声音信号,在大多数情况下,这是通过将正确的电缆插入正确的位置来实现的,通常是辅助线,这样您就可以控制混音器中电视调谐器的音量。
\n\n我建议你看看这个答案,其中我解释了如何通过在终端中删除下一个来将音频定向到声音设备:
\n\ntvtime | arecord -D hw:1,0 -r 48000 -c 2 -f S16_LE | aplay -\nRun Code Online (Sandbox Code Playgroud)\n\n您需要安装tvtime (sudo apt-get install tvtime ) 才能使测试正常运行。
如果 tvtime 没有从电视调谐器收到任何信号,那么我们需要确保该软件正在从正确的设备收集正确的数据。让我们在终端中添加一个查询,这将让我们看到有多少设备连接到您的计算机,这些设备可用于收集图像,在终端中使用以下命令:
\n\nls -l /dev/video*\nRun Code Online (Sandbox Code Playgroud)\n\n结果应该是这样的:
\n\ngeppettvs@DYLAN:~$ ls -l /dev/video*\ncrw-rw----+ 1 root video 81, 0 2012-04-17 19:53 /dev/video0\ncrw-rw----+ 1 root video 81, 1 2012-04-17 19:53 /dev/video1\ncrw-rw----+ 1 root video 81, 2 2012-04-18 17:54 /dev/video2\ngeppettvs@DYLAN:~$ \nRun Code Online (Sandbox Code Playgroud)\n\n就我而言,我有 3 个视频设备,其中之一是 USB 电视调谐器,我用它来观看/录制直播电视节目/VTR/VCR/RF-DVD/视频转换器和其他 RF 信号。
\n\n您应该检查其中任何一个并记下您的结果才能继续。
\n\n如果您对信号感到满意,可以使用Andreas Schalk 的 tvcap 脚本来录制音频和视频来录制音频和视频,为了方便起见,我将其代码放在这里:
\n\n#!/bin/bash\n#\n# tvcap-script by Andreas Schalk, easycap.blogspot.com (Dec. 2011)\n# This script is based an a template TV-script from Jose Catre-Vandis (Jan 2006).\n# The ascii artwork is based on a template i found here: http://www.retrojunkie.com/asciiart/electron/tv.txt\n# Contact: easycapdc60-blogspot@yahoo.de\n#-----------------------------------------------------------------------------\n#\n# FUNCTION: This script provides Zenity menues for viewing an capturing video with a tv-card on Linux.\n#\n# Supported programs: MPlayer, MEncoder, VLC, Tvtime, Cheese und Sox\n# \n#-----------------------------------------------------------------------------\n# \n# Basic options:\n#\n# Change the following parameters for viewing/ capturing according to your needs\n#\n#-----------------------------------------------------------------------------\nVERBOSE=1 # if \'0\', this script does not show messages window and does not ask for norm and input number anymore\nNORM="PAL" # preselect tv norm \'PAL\' or \'NTSC\'\nINPUT_NR=0 # preselect input number of your easycap where video source is plugged in\ninput_width=720 # preselect width an height of video source (mplayer, vlc, mencoder)\ninput_height=576 # other possible combinations: 640/480; 320/240 \nASPECT=169 # \'169\' (16:9) or \'43\' (4:3); this value affects video playback with mplayer or vlc only!\nFREQ="48000" # on soundproblems reduce audio frequency (44100 oder 32000 oder 8000)\nTV_INPUT="no" # if \'yes\' the analogue antenna input of the tv-card will be used (mplayer only)\nCHAN="chanlist=europe-west:channel=60" # channel setting (nur mplayer/ mencoder) the analogue antenna input of the tv-card is used\nNORM="PAL" # preselect TV-norm \'PAL\' oder \'NTSC\'\nINPUT_NR=1 # preselct the Input on the TV-card, where the videosource is plugged in (\'0\' normally is the antenna, \'1\' the first CVBS ...\n#-----------------------------------------------------------------------------\n\nMESSAGE=()\nR_MESSAGE=()\nEXITCODE=0\n\n#-----------------------------------------------------------------------------\n\n#-----------------------------------------------------------------------------\n# test videodevices\n##-----------------------------------------------------------------------------\n\ndeclare -a VIDEO_DEV\n\nVIDEO_DEV=( TRUE none\n FALSE none\n FALSE none\n FALSE none\n ) \ni1=0;\ni2=0;\nwhile `test -e "/dev/video${i1}"`; do\n VIDEO_DEV[$i2+1]="/dev/video${i1}"; \n i1=$[$i1+1];\n i2=$[$i2+2];\ndone\nif [ "xnone" = "x${VIDEO_DEV[1]}" ]; then \n zenity --error --timeout=5 --text "Cannot find /dev/video0!\\n Script ends in 5 seconds" --title "No videodevice!";\n exit 1;\nfi\n\nif [ "x${VIDEO_DEV[$i2+1]}" = "xnone" ]; then\n VIDEO_DEV[$i2]="" && VIDEO_DEV[$i2+1]="" && VIDEO_DEV[$i2+2]="" && VIDEO_DEV[$i2+3]="" && VIDEO_DEV[$i2+4]="" && VIDEO_DEV[$i2+5]="";\nfi\n\nDEV_VIDEO=$(zenity --list --text "Select videodevice" --radiolist --column "Choice" --column "Device" ${VIDEO_DEV[@]}) || exit 0 \n\nif [ ${VERBOSE} = 1 ]; then\n#-----------------------------------------------------------------------------\n# select TV norm\n#-----------------------------------------------------------------------------\ntitle="Select tv norm"\nNORM=`zenity --title="$title" --list --radiolist --column="Choice" \\\n --column="Norm" --column="Description" \\\n TRUE "PAL" "PAL Norm" \\\n FALSE "NTSC" "NTSC Norm" \\\n ` || exit 0 \nfi\n#-----------------------------------------------------------------------------\n# select Input number\n#-----------------------------------------------------------------------------\ntitle="Select Input NR"\nINPUT_NR=`zenity --title="$title" --list --radiolist --column="Choice" \\\n --column="Input NR" --column="Description" \\\n TRUE "0" "Input 1 (TV)" \\\n FALSE "1" "Input 2" \\\n FALSE "2" "Input 3" \\\n FALSE "3" "Input 4" \\\n FALSE "4" "Input 5" \\\n FALSE "5" "Input 6"\n ` || exit 0 \n#-----------------------------------------------------------------------------\n\n\n#-----------------------------------------------------------------------------\n# Check if snd_usb_audio module is loaded\n#-----------------------------------------------------------------------------\nSND_USB=`lsmod | grep snd_usb_audio | wc -l`\nif [ "${SND_USB}" -ge "1" ]; then\n# MESSAGE=("${MESSAGE[@]}" "\\nNOTE: snd_usb_audio module was loaded and may conflict with your USB capture device")\n 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!"\nfi\n\n#-----------------------------------------------------------------------------\n# test and select soundcard\n#-----------------------------------------------------------------------------\n\nif `test ! -e /dev/dsp` && [ -z "`ls -1 /proc/asound`" ]; then\n if_audio="no";\n echo "No soundcard detected";\n MESSAGE=("${MESSAGE[@]}" "Note: No soundcard can be found!\\nSound is not supported.\\n");\nelse\nif_audio="yes"\ndeclare -a SOUND_DEV\n\nSOUND_DEV=( FALSE /dev/dsp OSS\n FALSE card1 ALSA \n TRUE card2 ALSA\n FALSE card3 ALSA\n ) \n\ntest ! -e /dev/dsp && echo "No dsp" && SOUND_DEV[0]="" && SOUND_DEV[1]="" && SOUND_DEV[2]=""\n\nALSA_CARD=$(cat /proc/asound/cards | cut -d":" -f1 -s)\ndeclare -a ALSA_CARDS\nALSA_CARDS=(${ALSA_CARD})\n\ni5=1\nfor P in ${ALSA_CARDS[@]}; do\n ALSA_NAME=$(echo ${ALSA_CARDS[$i5]} | tr -d [=[=] );\n SOUND_DEV[$i5+3]=$ALSA_NAME\n if [ "x${ALSA_NAME}" = "x" ]; then\n SOUND_DEV[$i5+2]="" && SOUND_DEV[$i5+3]="" && SOUND_DEV[$i5+4]=""\n fi\n i5=$[$i5+3];\ndone\nfi\n\nDEV_AUDIO=$(zenity --list --text "Select soundcard" --radiolist --column "Choice" --column "Device" --column "Type" ${SOUND_DEV[@]}) || exit 0 \n\nif [ $DEV_AUDIO = "/dev/dsp" ]; then \n AUDIO_TYPE="oss"\n else\n AUDIO_TYPE="alsa"\nfi\n#-----------------------------------------------------------------------------\n\n#-----------------------------------------------------------------------------\n# test, if devicenodes are read- and writable for unprivileged users\n#-----------------------------------------------------------------------------\n\nif [ -r ${DEV_VIDEO} ] && [ -w ${DEV_VIDEO} ]; then\nMESSAGE=("${MESSAGE[@]}" "\\nSUCCESS! ${DEV_VIDEO} is read- and writable!\\n")\nelif [ -e ${DEV_VIDEO} ]; then\nzenity --info --text "Cannot access ${DEV_VIDEO}!\\nRun \'sudo chmod a+rw ${DEV_VIDEO}\'\\nin the terminal!" --title "Message"\nEXITCODE=1\nfi\n\n if [ -r ${DEV_AUDIO} ] && [ -w ${DEV_AUDIO} ]; then\n MESSAGE=("${MESSAGE[@]}" "\\nSUCCESS! ${DEV_AUDIO} is read- and writable!")\n elif [ -e ${DEV_AUDIO} ]; then\n zenity --info --text "\\nCannot access ${DEV_AUDIO}!\\nRun \'sudo chmod a+rw ${DEV_AUDIO}\'\\nin the terminal!" --title "Message"\n MESSAGE=("${MESSAGE[@]}" "\\n\\nCannot access ${DEV_AUDIO}!\\nRun \'sudo chmod a+rw ${DEV_AUDIO}\'\\nin the terminal!!")\n if_audio="no"\n fi\n#-----------------------------------------------------------------------------\n\n#-----------------------------------------------------------------------------\n# find executable programs\n#-----------------------------------------------------------------------------\nPROG_LIST=( TRUE vlc #\n FALSE mplayer #\n FALSE cheese #\n FALSE tvtime #\n FALSE mencoder #\n FALSE sox #\n ) \n\nPROGS=(vlc mplayer cheese tvtime mencoder sox)\ni4=0\nfor P in ${PROGS[@]}; do\n PROG=`which $P`\n if [ "x" = "x${PROG}" ] || [ ! -x ${PROG} ]; then\n echo "Cannot find or execute $P. Is t installed?"\n MESSAGE=("${MESSAGE[@]}" "\\nCannot find or execute $P. Is it installed?")\n PROG_LIST[$i4]=""\n PROG_LIST[$i4+1]=""\n if [ "${PROG_LIST[11]}" = "" ]; then\n echo "Sox is needed for sound with tvtime!"\n MESSAGE=("${MESSAGE[@]}" "\\nSox is needed for sound with tvtime!")\n fi \n fi\n i4=$i4+2\ndone\nPROG_LIST[10]="" # Sox does not show up on list\nPROG_LIST[11]="" #\n#-----------------------------------------------------------------------------\n\n#-----------------------------------------------------------------------------\n# messages are displayed and script ends\n#-----------------------------------------------------------------------------\nif [ ${EXITCODE} = 1 ]; then\n MESSAGE=("${MESSAGE[@]}" "\\nScript ends")\nfi\necho ${MESSAGE[*]}\n#########################\nif [ ${VERBOSE} = 1 ]; then\nzenity --height="50" --info --text "${MESSAGE[*]}" --title "Messages"\nfi\n\nif [ ${EXITCODE} = 1 ]; then\n exit 1\nfi\n#-----------------------------------------------------------------------------\n\n#-----------------------------------------------------------------------------\n# create logfile\n#-----------------------------------------------------------------------------\nLOGFILE="./test`echo "${DEV_VIDEO}" | sed -e "s,/dev/,," - `.log"\n\n# echo "Log file is: ${LOGFILE}"\n#-----------------------------------------------------------------------------\n\n#-----------------------------------------------------------------------------\n# zenity list - program choice\n#-----------------------------------------------------------------------------\n\nview_cap=$(zenity --list --width=250 --height=400 --text " ___________\\n | .----------. o|\\n | | Easy | o|\\n | | CAP_ | o|\\n |_\\`-----------\xc2\xb4 _|\\n \xc2\xb4\\` \xc2\xb4\\`\\\\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\n\n#-----------------------------------------------------------------------------\n\n#-----------------------------------------------------------------------------\n# mplayer command\n#-----------------------------------------------------------------------------\nif [ "alsa" = "${AUDIO_TYPE}" ]; then\nM_AUDIO="buffersize=16:alsa:amode=1:forcechan=2:audiorate=${FREQ}:adevice=plughw.${DEV_AUDIO}"\nelif [ "oss" = "${AUDIO_TYPE}" ]; then\nM_AUDIO="adevice=${DEV_AUDIO}"\nfi\n\nif [ "$NORM" = "PAL" ]; then\n fps_count=25\nelse \n fps_count=30\nfi\n\nif [ "$ASPECT" = 169 ]; then\n M_ASPECT="-aspect 1.78"\n# elif [ "$ASPECT" = 43 ]; then\n# M_ASPECT="-aspect 1"\n else\n M_ASPECT=""\n fi\n\nif [ "yes" = "${TV_INPUT}" ]; then\nM_VIDEO="${CHAN}"\nelif [ "no" = "${TV_INPUT}" ]; then\nM_VIDEO="norm=${NORM}:width=${input_width}:height=${input_height}:outfmt=uyvy:device=${DEV_VIDEO}:input=${INPUT_NR}:fps=${fps_count}"\nfi\n\n#echo $M_VIDEO\n#echo $M_AUDIO\n#echo $view_cap\n\nif [ "mplayer" = "${view_cap}" ]; then\n\n\nif [ "$if_audio" = "yes" ]; then \n1>${LOGFILE} 2>&1 \\\nmplayer tv:// -tv driver=v4l2:${M_VIDEO}:${M_AUDIO}:forceaudio:immediatemode=0 -hardframedrop ${M_ASPECT} -ao sdl, ${AUDIO_TYPE} -msglevel all=9\n\nelif [ "$if_audio" = "no" ]; then\n1>${LOGFILE} 2>&1 \\\nmplayer tv:// -tv driver=v4l2:${M_VIDEO} -hardframedrop ${M_ASPECT} -msglevel all=9 -nosound\nfi\nfi\n#-----------------------------------------------------------------------------\n\n#-----------------------------------------------------------------------------\n# vlc command\n#-----------------------------------------------------------------------------\nif [ "vlc" = "${view_cap}" ]; then\n\n if [ "alsa" = "${AUDIO_TYPE}" ]; then\n V_AUDIO="//plughw:${DEV_AUDIO}"\n elif [ "oss" = "${AUDIO_TYPE}" ]; then\n V_AUDIO="//${DEV_AUDIO}"\n fi\n\n if [ "$NORM" = "PAL" ]; then\n V_NORM="pal"\n elif [ "$NORM" = "NTSC" ]; then\n V_NORM="ntsc"\n fi\n\n if [ "$ASPECT" = 169 ]; then\n V_ASPECT="--aspect-ratio=16:9"\n elif [ "$ASPECT" = 43 ]; then\n V_ASPECT="--aspect-ratio=4:3"\n else\n V_ASPECT=""\n fi\n\n1>${LOGFILE} 2>&1 \\\nvlc -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 \nfi\n#-----------------------------------------------------------------------------\n\n#-----------------------------------------------------------------------------\n# tvtime command\n#-----------------------------------------------------------------------------\nif [ "tvtime" = "${view_cap}" ]; then\n if [ "alsa" = "${AUDIO_TYPE}" ]; then\n T_AUDIO="-t alsa plughw:${DEV_AUDIO} -s2 -c 2 -r ${FREQ} -s2 -t alsa default"\n elif [ "oss" = "${AUDIO_TYPE}" ]; then\n T_AUDIO="-t raw -s2 ${DEV_AUDIO} -c 2 -r ${FREQ} -s2 -t ossdsp /dev/dsp"\n fi\necho $T_AUDIO\n1>${LOGFILE} 2>&1 \\\n>./tvtime.err\n(tvtime -d ${DEV_VIDEO} -i 0 -n "${NORM}" 1>/dev/null 2>>./tvtime.err) &\nrc=1\nwhile [ 0 -ne ${rc} ];\ndo\n tvtime-command run_command "(sox -c 2 -r ${FREQ} ${T_AUDIO} 1>/dev/null 2>>./tvtime.err)" 1>/dev/null 2>>./tvtime.err\n rc=$?\n if [ 0 -eq ${rc} ]; then break; fi\n sleep 0.5\ndone\nfi\n#-----------------------------------------------------------------------------\n\n#-----------------------------------------------------------------------------\n# cheese command\n#-----------------------------------------------------------------------------\nif [ "cheese" = "${view_cap}" ]; then\n1>${LOGFILE} 2>&1 \\\ncheese\nfi\n#-----------------------------------------------------------------------------\n\n#-----------------------------------------------------------------------------\n# mencoder command - recording section\n#-----------------------------------------------------------------------------\n\nif [ "mencoder" = "${view_cap}" ]; then\n\n#Auswahl des Seitenverh\xc3\xa4ltnisses der Aufnahme?\ntitle="Chose aspect of your target file!"\naspect_type=`zenity --width="400" --height="220" --title="$title" --list --radiolist --column="Click Here" \\\n --column="choice" --column="source >> target" \\\n TRUE "1" "4:3 > 4:3"\\\n FALSE "2" "4:3 > scale=16:9" \\\n FALSE "3" "4:3 > crop borders=16:9" \\\n ` || exit 0 \n\nif [ "$aspect_type" = "1" ]; then\n crop_scale="scale=640:480"\nelif [ "$aspect_type" = "2" ]; then\n crop_scale="scale=720:406"\nelif [ "$aspect_type" = "3" ]; then\n crop_scale="crop=720:406:0:72"\nfi \n\n#################################################################################\n#Quality?\ntitle="What quality do you want to record at ?"\nqual_type=`zenity --width="380" --height="380" --title="$title" --list --radiolist --column="Click Here" \\\n --column="Record Time" --column="Description" \\\n FALSE "500" "Passable Quality"\\\n FALSE "900" "OK Quality"\\\n FALSE "1100" "VHS Quality"\\\n TRUE "1300" "SVHS Quality"\\\n FALSE "1500" "VCD Quality"\\\n FALSE "1800" "SVCD Quality" \\\n FALSE "2000" "Very Good Quality"\\\n FALSE "2500" "High Quality" \\\n FALSE "3000" "Excellent Quality"\\\n ` || exit 0\n\n##################################################################################\n#How Long?\ntitle="How long do you want to record for ?"\ntime_type=`zenity --width="380" --height="500" --title="$title" --list --radiolist --column="Click Here" \\\n --column="Record Time" --column="Description" \\\n FALSE "00:00:00" "unlimited"\\\n TRUE "00:00:30" "30 seconds for testing"\\\n FALSE "00:10:00" "0.2 hours"\\\n FALSE "00:30:00" "0.5 hours"\\\n FALSE "00:45:00" "0.75 hours"\\\n FALSE "01:00:00" "1 hour"\\\n FALSE "01:15:00" "1.25 hours"\\\n FALSE "01:30:00" "1.5 hours" \\\n FALSE "01:45:00" "1.75 hours"\\\n FALSE "02:00:00" "2 hours" \\\n FALSE "02:15:00" "2.25 hours"\\\n FALSE "02:30:00" "2.5 hours" \\\n FALSE "02:45:00" "2.75 hours"\\\n FALSE "03:00:00" "3 hours" \\\n FALSE "03:15:00" "3.25 hours" \\\n FALSE "03:30:00" "3.5 hours" \\\n ` || exit 0\n\n#M_TIME="-endpos $time_type"\n\n#################################################################################\n#user must enter a filename\nfiledate=$(date +%F_%H:%M-%S)\ntitle="Please enter a filename for your recording, no spaces"\nfile_name=`zenity --width="480" --height="150" --title="$title" --file-selection --save --confirm-overwrite --filename="tvcap_$filedate"` || exit 0\n\n###########################################################################################\n# summary\nR_MESSAGE=("${R_MESSAGE[@]}" "\\nRecording options:")\nR_MESSAGE=("${R_MESSAGE[@]}" "\\nRecording audio: $if_audio")\nR_MESSAGE=("${R_MESSAGE[@]}" "\\nRecording from Input $INPUT_NR - Norm: $NORM $fps_count fps")\nR_MESSAGE=("${R_MESSAGE[@]}" "\\nCrop and scale options: $crop_scale")\nR_MESSAGE=("${R_MESSAGE[@]}" "\\nEncoding quality: $qual_type kb/s")\nR_MESSAGE=("${R_MESSAGE[@]}" "\\nRecording time:$time_type hours")\nR_MESSAGE=("${R_MESSAGE[@]}" "\\nFile name: $file_name.avi ")\n\necho ${R_MESSAGE[*]}\n\nif [ ${VERBOSE} = 1 ]; then\nzenity --info --text "${R_MESSAGE[*]}" --title "Recording options"\nfi\n#-----------------------------------------------------------------------------\n\n#-----------------------------------------------------------------------------\n# mencoder line\n#-----------------------------------------------------------------------------\nif [ "$if_audio" = "yes" ]; then\n\nzenity --info --title="Start recording with audio" --text="Press OK to start."\n\nmencoder 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" \n\nzenity --info --title="Job complete" --text="The recording is now complete."\n\n\nelif [ "$if_audio" = "no" ]; then\n\nzenity --info --title="Start recordin