PDA

Ver la Versión Completa : Grabador de TV



Defton
18-jul-2013, 20:07
aqui les dejo este pequeño script para capturar video de nuestra tarjeta de tv. Espero les sea de utilidad.
Saludos.

Dependencias:

Perl-Tk
MPLayer


http://img844.imageshack.us/img844/729/lm1n.png (http://imageshack.us/photo/my-images/844/lm1n.png/)





#!perl

##################
#
# This file was automatically generated by ZooZ.pl v1.2
# on Wed Jul 17 16:49:56 2013.
# Project: VideoGrab
# File: /root/ZooZ-1.2/video.zooz
#
##################

#
# Headers
#
use strict;
use warnings;

use Tk ;
use Tk::ProgressBar;
#
# Global variables
#
my (
# MainWindow
$MW,

# Hash of all widgets
%ZWIDGETS,
);

#
# User-defined variables (if any)
#
my $audio = undef;

my $estado = "Detenido";

my $audios= undef;

my $dispoaudio= undef;



my $desition;
######################
#
# Create the MainWindow
#
######################

$MW = MainWindow->new;

######################
#
# Load any images and fonts
#
######################
ZloadImages();
ZloadFonts ();



# Widget archivoF isa Labelframe
$ZWIDGETS{'archivoF'} = $MW->Labelframe(
-takefocus => 0,
-text => 'Archivo',
)->grid(
-row => 0,
-column => 0,
-sticky => 'ew',
);

# Widget archivoL isa Label
$ZWIDGETS{'archivoL'} = $ZWIDGETS{archivoF}->Label(
-takefocus => 0,
-text => "Nombre del Archivo\n(Sin extencion)",
)->grid(
-row => 0,
-column => 0,
);

# Widget archivoE isa Entry
$ZWIDGETS{'archivoE'} = $ZWIDGETS{archivoF}->Entry(
-exportselection => 1,
)->grid(
-row => 1,
-column => 0,
);

# Widget deviceF isa Labelframe
$ZWIDGETS{'deviceF'} = $MW->Labelframe(
-takefocus => 0,
-text => 'Dispositivo',
)->grid(
-row => 1,
-column => 0,
-sticky => 'ew',
);

# Widget deviceL isa Label
$ZWIDGETS{'deviceL'} = $ZWIDGETS{deviceF}->Label(
-text => 'Seleccione un Dispositivo',
)->grid(
-row => 0,
-column => 0,
);

# Widget dev_list isa Listbox
$ZWIDGETS{'dev_list'} = $ZWIDGETS{deviceF}->Listbox(
-exportselection => 1,
-height => 4,
-setgrid => 0,
)->grid(
-row => 1,
-column => 0,
);

# Widget accionF isa Labelframe
$ZWIDGETS{'accionF'} = $MW->Labelframe(
-takefocus => 0,
-text => 'Acciones',
)->grid(
-row => 2,
-column => 0,
-columnspan => 2,
-sticky => 'ew',
);

# Widget ButtonStart isa Button
$ZWIDGETS{'ButtonStart'} = $ZWIDGETS{accionF}->Button(
-command => 'main::start',
-text => 'Grabar',
)->grid(
-row => 0,
-column => 0,
-padx => 20,
);

# Widget ButtonStop isa Button
$ZWIDGETS{'ButtonStop'} = $ZWIDGETS{accionF}->Button(
-command => 'main::stop',
-text => 'Detener',
)->grid(
-row => 0,
-column => 1,
-padx => 20,
);

# Widget ButtonExit isa Button
$ZWIDGETS{'ButtonExit'} = $ZWIDGETS{accionF}->Button(
-command => 'main::exit',
-text => 'Salir',
)->grid(
-row => 0,
-column => 2,
-padx => 20,
);

# Widget audioF isa Labelframe
$ZWIDGETS{'audioF'} = $MW->Labelframe(
-takefocus => 0,
-text => 'Audio',
)->grid(
-row => 0,
-column => 1,
-sticky => 'ew',
);

# Widget audioL isa Label
$ZWIDGETS{'audioL'} = $ZWIDGETS{audioF}->Label(
-takefocus => 0,
-text => 'Seleccione Una Opcion',
)->grid(
-row => 0,
-column => 0,
-columnspan => 2,
);

# Widget ossB isa Radiobutton
$ZWIDGETS{'ossB'} = $ZWIDGETS{audioF}->Radiobutton(
-command => 'main::audio',
-highlightthickness => 1,
-indicatoron => 1,
-state => 'normal',
-takefocus => 0,
-text => 'OSS',
-value => 1,
-variable => \$audio,
)->grid(
-row => 1,
-column => 0,
);

# Widget alsaB isa Radiobutton
$ZWIDGETS{'alsaB'} = $ZWIDGETS{audioF}->Radiobutton(
-command => 'main::audio',
-indicatoron => 1,
-text => 'Alsa',
-value => 2,
-variable => \$audio,
)->grid(
-row => 1,
-column => 1,
);

# Widget estadoF isa Labelframe
$ZWIDGETS{'estadoF'} = $MW->Labelframe(
-text => 'Estado',
)->grid(
-row => 1,
-column => 1,
-sticky => 'nsew',
);



# Widget estadoL isa Label
$ZWIDGETS{'estadoL'} = $ZWIDGETS{estadoF}->Label(
-text => 'Label3',
-textvariable => \$estado,
)->grid(
-row => 1,
-column => 0,
);


my $devices=`ls /dev | grep video`;
my @dev=split("\n" , $devices);
$ZWIDGETS{'dev_list'}->insert('end',@dev);
###############
#
# MainLoop
#
###############

MainLoop;

#######################
#
# Subroutines
#
#######################

sub ZloadImages {
}

sub ZloadFonts {
}

sub audio {

}

sub start {

my $archivo = $ZWIDGETS{'archivoE'}->get();


if ($archivo eq ""){
$MW->messageBox(-type=>"ok", -message=>"Escriba el nombre del archivo");
goto start;

}


if ($audio eq 0){
$MW->messageBox(-type=>"ok", -message=>"Seleccione una opcion de audio");
goto start;
}



my $dev=$ZWIDGETS{'dev_list'}->get($ZWIDGETS{'dev_list'}->curselection( ));


if ($dev =~ "Error"){
$MW->messageBox(-type=>"ok", -message=>"Seleccione un dispositivo de captura");
goto start;
}

if ($audio==1){
$audios="adevice=/dev/dsp";
$dispoaudio="OSS";
}
elsif($audio==2){
$audios="alsa:adevice=hw.0";
$dispoaudio="ALSA";
}
my $rewrite=`ls ~`;
my $final="$dispoaudio-$archivo.avi";

if ($rewrite =~ "$final"){
$desition=$MW->Dialog(-title => 'Error',
-text => "El archivo $final ya existe, desea sobreescribirlo?",
-default_button => 'No', -buttons => [ 'Si', 'No'],
-bitmap => 'question' )->Show( );
if ($desition eq "No"){
goto start;
}




}
grabar:

system("xterm -e mencoder -tv driver=v4l2:width=768:height=576:norm=NTSC:device=/dev/$dev:$audios:forceaudio:immediatemode=0 -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=9000 -oac mp3lame -lameopts cbr:br=64 -o ~/$final tv:// &");
$estado="Grabando";
sleep (10);
system ("mplayer ~/$final &");

start:

}

sub stop {
system ("killall mencoder ; killall mplayer");
$estado="Detenido";
}

sub exit {
$MW->destroy;
}

mikrios
19-jul-2013, 01:36
Muy bueno , lo mire en el sitio que esta el post.

Crees que se podría cambiar las opciones ,para que le sirva a su capturadora .

Algunos programas de tv los use para ver en tiempo real , camaras web (microscopio usb ) y funcionaban bien (pero no tenia instalado ninguna capturadora ) .

A veces lo mas sencillo es lo mas eficaz , gracias por el aporte.

Saludos cordiales
Edito :
Como tenia varias ventanas abiertas se me colo el comentario aquí , en vez de :

http://www.forosuse.org/forosuse/showthread.php?t=30160

De todas formas el bucle está hecho . saludos y gracias nuevamente.