domingo, julio 21, 2013

Fundamentos de Programación Luis Joyanes

Aqui les dejo el libro Fundamentos de Programación Luis Joyanes...
Muy util para los a que apenas estan comenzando con la programacion orientada a objetos y Java

FundProgJoyAgu3ed.rar

Grabadora de Sonido Java: JVoiceRecoder

Hoy termine un pequeño proyecto señores sencillo pero eficiente.

Utilizando la tecnología de la librería de java para el tratamiento multimedia llamada Java Media Framework (JMF), me gusta mucho esta tecnologia por abre un sin numero de posibilidades... en fin, lo que hace esta pequeña aplicación es grabar audio de tu micrófono y guardarlo como un archivo MP3, es muy sencilla e intuitiva pero funciona genial.



Guarda los archivos siempre en una carpeta llamada JVoiceFiles que esta dentro de la carpeta del programa. Les dejo el Ejecutable de Windows (es java solo use un truco para que parezca de windows)...
Y también les dejo la clase base del programa, la que hace todo el trabajo... lo demás lo dejo a tu imaginación.
Descarga JVoiceRecoder.zip

Aqui el código fuente:
CaptureAudio.zip
Debes instalar jmf-2_1_1e-windows-i586.exe




package jvoicerecorder;


import java.io.File;
import java.io.IOException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.media.CaptureDeviceInfo;
import javax.media.CaptureDeviceManager;
import javax.media.Codec;
import javax.media.Controller;
import javax.media.ControllerClosedEvent;
import javax.media.ControllerErrorEvent;
import javax.media.ControllerEvent;
import javax.media.ControllerListener;
import javax.media.DataSink;
import javax.media.EndOfMediaEvent;
import javax.media.Format;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.NoProcessorException;
import javax.media.Player;
import javax.media.Processor;
import javax.media.RealizeCompleteEvent;
import javax.media.StartEvent;
import javax.media.control.TrackControl;
import javax.media.format.AudioFormat;
import javax.media.format.VideoFormat;
import javax.media.protocol.ContentDescriptor;
import javax.media.protocol.DataSource;
import javax.media.protocol.FileTypeDescriptor;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Esta clase es una interface personalizada de Processor
 * Contiene todos los metodos y funciones para grabar el audio
 *
 * @author FAMILIA MEZA MEZA
 */
public class CaptureAudioPlayer implements ControllerListener{
    private String State="Ready";
    private String Time="Capture Audio Player";
    private File Destino;
    private Processor p;
    private MediaLocator src;
    private DataSource source;
    private DataSink dataSink =null;
    private String IP;
    private int port;
    private String jffmpegAudioDecoder = "net.sourceforge.jffmpeg.AudioDecoder";
    private Codec codecAudio;
    public String Formato=AudioFormat.MPEG;
    public String FormatoV=VideoFormat.YUV;
    private ContentDescriptor cd = new ContentDescriptor(FileTypeDescriptor.MPEG_AUDIO);
    private Integer stateLock = new Integer(0);
    private boolean failed = false;
    private int hors;
    private int mins;
    private int segs;
 

 
 
    //funcion booleana que permite iniciar la grabacion
    //parametro: "audioDevice" es el dispositivo de sonido (Tipo: CaptureDeviceInfo)
    //parametro: "file" direccion fisica del archivo donde se va grabar (Tipo: String)
    public boolean rec(CaptureDeviceInfo audioDevice, String file){
        try {
         
            boolean result=false;
            p= this.prepareProcessor(audioDevice.getLocator());
         
            Destino=new File(file);      
            source            = p.getDataOutput();
            src               = new MediaLocator("file:"+Destino.getAbsolutePath());
            dataSink          = Manager.createDataSink(source, src);
     
            dataSink.open();
            dataSink.start();
            p.start();
     
            System.out.println("Starting capturing ...");
         
         
         
            State="Recording!...";
            return true;
        } catch (Exception ex) {
            System.err.println(ex);
        }
        return false;
    }
 
 
    //Funcion booleana que pausa la grabacion
    public boolean pause(){
     if(p!=null){
        try {
     p.stop();
     System.out.println("Paused!...");
     State="Paused!...";
     return true;
     } catch(Exception e) {
     e.printStackTrace();
   
       }
     }
     return false;
    }

 
    //Funcion booleana que reanuda la grabacion pausada
    public boolean resume(){
     if(p!=null){
        try {
     p.start();
     System.out.println("Resumed!...");
     State="Recording!...";
     return true;
     } catch(Exception e) {
     e.printStackTrace();
   
       }
     }
     return false;
    }

 
 
    //Funcion booleana que detiene la grabacion y cierra el archivo
    public boolean stop(){
    if(p!=null){
    p.removeControllerListener(this);
    p.stop();
        p.close();
        dataSink.close();
    p.deallocate();
        dataSink=null;
    p=null;
        System.out.println("Stopped!...");
        System.out.println("Done saving.");
        State="Stopped and Saved as: "+Destino.getName();
        Destino=null;
        return true;
    }else{
        return false;  
        }
    }
 
 
    //Funcion String que covierte un nemero entero en una cadena tipo 00:00:00 horas minutos segundos
    public String getDur(int dur){
     
       String Durat="";
       String S="";
       double a=0;
       double a2=0;

               a=dur/3600;
               S=""+a;
               hors=Integer.parseInt(S.substring(0,S.lastIndexOf(".")));
               a2=((dur)-(hors*3600))/60;
               S=""+a2;
               mins=Integer.parseInt(S.substring(0,S.lastIndexOf(".")));
               segs=dur-(hors*3600)-(mins*60);

       if(hors<=9){
           Durat="0"+hors+":";
       }else{
           Durat=hors+":";
       }
     
       if(mins<=9){
           Durat=Durat+"0"+mins+":";
       }else{
           Durat=Durat+mins+":";
       }
     
       if(segs<=9){
           Durat=Durat+"0"+segs+"";
       }else{
           Durat=Durat+segs+"";
       }
     
       S=null;
       return Durat;
     
    }
 
 
    //Funcion String que devuelve una cadena con el tiempo transcurrido de la grabacion
    public String getTime(){
     
        Time="00:00:00";
        if(p!=null){
        int D=(int)p.getMediaTime().getSeconds();
        Time=this.getDur(D);
        }
        return Time;
    }
 
 
    //Funcion String que devuelve una cadena con los estados del reproductor
    public String getState(){
        return State;
    }

 
 
 
 
    //Funcion tipo Processor que prepara el reproductor
    private Processor prepareProcessor(MediaLocator ML) {
        boolean result=false;
        Processor mediaProcessor=null;
     
            MediaLocator mediaLocator=ML;
        if (mediaLocator == null){
   System.err.println("- Locator is null");
            return null;
        }


// Try to create a processor to handle the input media locator
try {
         
   mediaProcessor = javax.media.Manager.createProcessor(mediaLocator);
         
} catch (NoProcessorException npe) {
   System.err.println("- Couldn't create processor");
            return null;
} catch (IOException ioe) {
   System.out.println("- IOException creating processor");
            return null;
}

// Wait for it to configure
result = waitForState(mediaProcessor, Processor.Configured);
if (result == false){
   System.err.println("- Couldn't configure processor");
        }
        if(mediaProcessor!=null){
// Get the tracks from the processor
TrackControl [] tracks = mediaProcessor.getTrackControls();

// Do we have atleast one track?
if (tracks == null || tracks.length < 1)
   System.err.println("- Couldn't find tracks in processor");

boolean programmed = false;
        AudioFormat afmt;
        VideoFormat vfmt;
     
// Search through the tracks for a Audio track
for (int i = 0; i < tracks.length; i++) {
   Format format = tracks[i].getFormat();
   if (  tracks[i].isEnabled() &&
 format instanceof AudioFormat &&
 !programmed) {
afmt = (AudioFormat)tracks[i].getFormat();
                       AudioFormat AFormat =   new AudioFormat(Formato);
                   
tracks[i].setFormat (AFormat);
System.out.println("Audio transmitted as:" );
System.out.println("  " + AFormat);
// Assume succesful
programmed = true;
   } else if (  tracks[i].isEnabled() &&
 format instanceof VideoFormat &&
 !programmed) {
vfmt = (VideoFormat)tracks[i].getFormat();
                       VideoFormat VFormat =   new VideoFormat(FormatoV);
                   
tracks[i].setFormat (VFormat);
System.out.println("Video transmitted as:" );
System.out.println("  " + VFormat);
// Assume succesful
programmed = true;
   } else {
tracks[i].setEnabled(false);
            }
}

if (!programmed){
   System.err.println("- Couldn't find Audio track");
        }
// Set the output content descriptor to RAW_RTP
       mediaProcessor.setContentDescriptor(cd);

// Realize the processor. This will internally create a flow
// graph and attempt to create an output datasource for ULAW/RTP
// Audio frames.
        }
result = waitForState(mediaProcessor, Controller.Realized);
if (result == false){
   System.err.println("- Couldn't realize processor");
            return null;
        }
// Get the output data source of the processor

        mediaProcessor.addControllerListener(new StateListener());
System.out.println("- Processor OK");
        return mediaProcessor;
    }

 
 
 
 
    // Funcion que devuelve un objeto CaptureDeviceInfo o un dispositivo pasando el nombre del mismo como parametro
    // Generalmente es "JavaSound audio capture"
    public CaptureDeviceInfo getDeviceInfo(String device){
        CaptureDeviceInfo cdi=CaptureDeviceManager.getDevice(device);
     
        return cdi;
    }
 
 
    //Obtiene un lista de dispositivos disponibles que detecto JMF
    public String getDeviceListString(){
        String List="";
        Vector v=javax.media.cdm.CaptureDeviceManager.getDeviceList(null);
        int t;
        if((t=v.size())>0)
            for(int i=0;i<t;i++)
            {
                List+=((CaptureDeviceInfo)v.elementAt(i)).getName()+"\n";
            }
     
        System.out.println(List);
        return List;
    }
 
 
    //Obtiene un lista de dispositivos disponibles que detecto JMF
    // Teniendo en cuenta el formato casi siempre es "LINEAR"
    public String[] getDeviceListString(String format){
        String List[]=null;
        Vector v=javax.media.cdm.CaptureDeviceManager.getDeviceList(null);
        int t;int c=0;
        if((t=v.size())>0)
            for(int i=0;i<t;i++){
                CaptureDeviceInfo dev=(CaptureDeviceInfo)v.elementAt(i);
                if(dev.getFormats()[i].getEncoding().equals(format)){
                    c++;
                 
                }
             
            }
            int k=0;
            List=new String[c];
            for(int i=0;i<t;i++){
                CaptureDeviceInfo dev=(CaptureDeviceInfo)v.elementAt(i);
                if(dev.getFormats()[i].getEncoding().equals(format)){
                    List[k]=dev.getName();
                    k++;
                }
             
            }
        return List;
    }
 
 
    //Obtiene una lista de los formatos disponibles del dsipositivo
    public Format[] getFormats(String device){
        CaptureDeviceInfo cdi=CaptureDeviceManager.getDevice(device);
        Format []formats=cdi.getFormats();
        return formats;
    }

 
 
 
 
 
 
 
     
     
     
     
     
     
     
     
    // Las siguientes funciones y metodos controlan los eventos de reproductor...  
    void setFailed() {
failed = true;
    }
   

    Integer getStateLock() {
return stateLock;
    }
 
 
    class StateListener implements ControllerListener {

public void controllerUpdate(ControllerEvent ce) {

   if (ce instanceof ControllerClosedEvent)
setFailed();

   if (ce instanceof ControllerEvent) {
synchronized (getStateLock()) {
   getStateLock().notifyAll();
}
   }
}
    }


       private synchronized boolean waitForState(Processor p, int state) {
p.addControllerListener(new StateListener());
failed = false;

if (state == Processor.Configured) {
   p.configure();
} else if (state == Processor.Realized) {
   p.realize();
}

// Wait until we get an event that confirms the
// success of the method, or a failure event.
// See StateListener inner class
while (p.getState() < state && !failed) {
   synchronized (getStateLock()) {
try {
   getStateLock().wait();
} catch (InterruptedException ie) {
   return false;
}
   }
}

if (failed)
   return false;
else
   return true;
     }




    public synchronized void controllerUpdate(ControllerEvent evt) {

System.err.println("Nuevo Evento: " + evt);
     

        if (evt instanceof RealizeCompleteEvent) {
 
            System.out.println("Conected!...");
}

        if (evt instanceof StartEvent) {
 
         
}



    }






     
     


 
}//Fin clase CaptureAudioPlayer












/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package jvoicerecorder;



/**
 * Para que todo funcione bien debes tener el archivo "jmf.properties" en la carpeta raiz
 * "jmf.properties" esta dentro de la carpeta de mi programa JVoiceRecorder
 * Si no funciona con ese instala jmf en tu equipo y sacalo de su capeta de instalacion y lo copias en la capeta raiz
 * Clase principal para probar CaptureAudioPlayer
 * Graba lo que captura de tu microfono durante 10 segundos y lo guarda en un archivo mp3 llamado "prueba.mp3"
 * @author FAMILIA MEZA MEZA
 */
public class Main {
    public static void main (String args[]){
        boolean b1,b2;
        CaptureAudioPlayer CAP=new CaptureAudioPlayer();
        b1=CAP.rec(CAP.getDeviceInfo("JavaSound audio capture"), "prueba.mp3");
        if(b1==true){
        try {
            Thread.sleep(10000);
            System.out.println("Grabando");
        } catch (InterruptedException ex) {}
        b2=CAP.stop();
     
        if(b1==b2){
            System.out.println("Grabacion exitosa!...");
        }
        }
     
    }
}







Recupera tu Informacion con este espectacular Programa de Recuperacion de Datos Alojamiento Web Profesional a un Precio Increible!