/* * guiStreamer.java * * Created on 13 de noviembre de 2008, 07:21 PM */ package clases; import java.io.BufferedReader; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLayeredPane; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JSeparator; import javax.swing.JTextArea; import java.io.IOException; import java.io.InputStreamReader; import java.util.logging.Level; import java.util.logging.Logger; import java.awt.event.ActionEvent; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.Semaphore; /** * * @author SebastianDuque */ public class guiStreamer extends javax.swing.JFrame { /** Creates new form guiStreamer */ public guiStreamer() { initComponents(); comandosInicialesxDefecto(); componentsStateallOff(); TimerTask timerTask = new TimerTask() { public void run() { System.out.println("Hola, soy repetitivo"); Runtime runTime = Runtime.getRuntime(); try { String path = null; processAreRunning = runTime.exec("corren"); verificador = new BufferedReader(new InputStreamReader(processAreRunning.getInputStream())); while(true) { String aux=null; aux = verificador.readLine(); // Se lee la linea if (aux == null) break; System.out.println("quienes corren:"+ verificador.readLine()); //Se verifica si se ha terminado el archivo } if (processAreRunning != null){ processAreRunning.destroy(); try { processAreRunning.waitFor(); } catch( InterruptedException e ) { System.out.println("No pudimos esperar por témino"); System.exit(-1); } } // Aquí el código que queremos ejecutar. } catch (IOException ex) { Logger.getLogger(guiStreamer.class.getName()).log(Level.SEVERE, null, ex); } // Aquí el código que queremos ejecutar. } }; } private void comandosInicialesxDefecto(){ String commandffserver = "ffserver -f /opt/ffmpeg-0.cvs20070307/doc/ffserver.conf"; String commandffmpegDesktStream = "ffmpeg -f audio_device -i /dev/dsp -f x11grab -s " + "1280x800 -ar 44100 -sameq -r 5 -ab 64 -er 4 -vcodec flv -i :0.0 -er 4 -ac 1 -ab 64 " + "-r 3 -s 1024x768 -sameq http://localhost:8090/feed3.ffm"; String commandffmpegVideoStream = "ffmpeg -f audio_device -i /dev/dsp -f x11grab -s 1280x800" + " -ar 22050 -sameq -r 30 -ab 64 -vcodec flv -i :0.0 -ac 1 -ab 64 -r 30 -s 1280x800 " + "-sameq http://localhost:8090/feed2.ffm"; jTextArea1.setText(commandffserver); jTextArea2.setText(commandffmpegDesktStream); } private void componentsStateallOff(){ jTextArea1.setEditable(true); jTextArea2.setEditable(false); jButton2.setEnabled(true); jButton2.setText("ffserverOn"); jButton3.setEnabled(false); jButton3.setText("ffmpegOn"); } private void ffserverstateRun(){ jTextArea1.setEditable(false); jButton2.setEnabled(true); jButton2.setText("ffserverOff"); } private void ffmpegstateRun(){ jTextArea2.setEditable(false); jButton3.setEnabled(true); jButton3.setText("ffmpegOff"); } private void ffserverstateStop(){ jTextArea1.setEditable(true); jButton2.setEnabled(true); jButton2.setText("ffserverOn"); } private void ffmpegstateStop(){ jTextArea2.setEditable(true); jButton3.setEnabled(false); jButton3.setText("ffmpegOn"); } private void ffmpegstatePause(){ jTextArea2.setEditable(true); jButton3.setEnabled(true); jButton3.setText("ffmpegOn"); } private void componentsStateAllrunning(){ } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // //GEN-BEGIN:initComponents private void initComponents() { jPopupMenu1 = new javax.swing.JPopupMenu(); jPanel1 = new javax.swing.JPanel(); jLayeredPane1 = new javax.swing.JLayeredPane(); jScrollPane1 = new javax.swing.JScrollPane(); jTextArea1 = new javax.swing.JTextArea(); jScrollPane2 = new javax.swing.JScrollPane(); jTextArea2 = new javax.swing.JTextArea(); jButton2 = new javax.swing.JButton(); jButton3 = new javax.swing.JButton(); jSeparator1 = new javax.swing.JSeparator(); jScrollPane4 = new javax.swing.JScrollPane(); jTextArea4 = new javax.swing.JTextArea(); jMenuBar1 = new javax.swing.JMenuBar(); jMenu1 = new javax.swing.JMenu(); jMenuItem1 = new javax.swing.JMenuItem(); jMenuItem3 = new javax.swing.JMenuItem(); jMenuItem4 = new javax.swing.JMenuItem(); jMenuItem2 = new javax.swing.JMenuItem(); jMenu3 = new javax.swing.JMenu(); jMenuItem7 = new javax.swing.JMenuItem(); jMenuItem6 = new javax.swing.JMenuItem(); javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 330, Short.MAX_VALUE) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 80, Short.MAX_VALUE) ); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle("FFmpeg-FFserver Control"); setAlwaysOnTop(true); setBackground(new java.awt.Color(153, 153, 153)); setBounds(new java.awt.Rectangle(400, 200, 0, 0)); setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); setResizable(false); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { formWindowClosing(evt); } }); jTextArea1.setColumns(20); jTextArea1.setRows(5); jScrollPane1.setViewportView(jTextArea1); jScrollPane1.setBounds(30, 40, 520, 40); jLayeredPane1.add(jScrollPane1, javax.swing.JLayeredPane.DEFAULT_LAYER); jTextArea2.setColumns(20); jTextArea2.setRows(5); jScrollPane2.setViewportView(jTextArea2); jScrollPane2.setBounds(30, 100, 520, 40); jLayeredPane1.add(jScrollPane2, javax.swing.JLayeredPane.DEFAULT_LAYER); jButton2.setText("ffserverOn"); jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton2ActionPerformed(evt); } }); jButton2.setBounds(580, 50, 120, 30); jLayeredPane1.add(jButton2, javax.swing.JLayeredPane.DEFAULT_LAYER); jButton3.setText("ffmpegOn"); jButton3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton3ActionPerformed(evt); } }); jButton3.setBounds(580, 110, 120, 30); jLayeredPane1.add(jButton3, javax.swing.JLayeredPane.DEFAULT_LAYER); jSeparator1.setBounds(0, 160, 700, 20); jLayeredPane1.add(jSeparator1, javax.swing.JLayeredPane.DEFAULT_LAYER); jTextArea4.setColumns(20); jTextArea4.setEditable(false); jTextArea4.setRows(5); jScrollPane4.setViewportView(jTextArea4); jScrollPane4.setBounds(30, 180, 520, 80); jLayeredPane1.add(jScrollPane4, javax.swing.JLayeredPane.DEFAULT_LAYER); jMenu1.setText("File"); jMenuItem1.setText("Streaming Video."); jMenu1.add(jMenuItem1); jMenuItem3.setText("Streaming My Desktop"); jMenu1.add(jMenuItem3); jMenuItem4.setText("Both"); jMenu1.add(jMenuItem4); jMenuItem2.setText("Exit"); jMenuItem2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jMenuItem2ActionPerformed(evt); } }); jMenu1.add(jMenuItem2); jMenuBar1.add(jMenu1); jMenu3.setText("About"); jMenuItem7.setText("Help"); jMenu3.add(jMenuItem7); jMenuItem6.setText("About"); jMenu3.add(jMenuItem6); jMenuBar1.add(jMenu3); setJMenuBar(jMenuBar1); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jLayeredPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 706, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jLayeredPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 270, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(17, Short.MAX_VALUE)) ); pack(); }// //GEN-END:initComponents private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed if (ffserver==stateffserver.off){ //Cuando se presiona por primera vez el botón ffserver try { Runtime runTime = Runtime.getRuntime(); processffserver = runTime.exec(jTextArea1.getText()); ffserver=stateffserver.on; jTextArea4.setText(jTextArea4.getText()+"\nFFserver iniciado. Esperando Contenido..."); ffserverstateRun(); ffmpegstatePause(); ffserverhandler_thread=new Ffserverhandler_thread(); ffserverhandler_thread.start(); } catch (IOException ex) { Logger.getLogger(guiStreamer.class.getName()).log(Level.SEVERE, null, ex); System.out.println("No pudimos iniciar ffserver"); System.exit(-1); } } else //semmutexFFserverState.acquireUninterruptibly(); //wait if (ffserver==stateffserver.on){ if(processffserver != null){ processffserver.destroy(); try { processffserver.waitFor(); } catch( InterruptedException e ) { System.out.println("No pudimos esperar por témino"); System.exit(-1); } if (processffmpeg != null){ processffmpeg.destroy(); try { processffmpeg.waitFor(); } catch( InterruptedException e ) { System.out.println("No pudimos esperar por témino"); System.exit(-1); } } ffserver=stateffserver.off; ffmpegSending=stateffmpeg.off; ffserverstateStop(); ffmpegstateStop(); jTextArea4.setText(jTextArea4.getText()+"\nFFserver fue finalizado."); } else{ jTextArea4.setText(jTextArea4.getText()+"\nFFserver fue finalizado!!"); System.out.println("FFserver fue finalizado!!"); } } }//GEN-LAST:event_jButton2ActionPerformed private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton3ActionPerformed if (ffmpegSending==ffmpegSending.off){ try { Runtime runTime = Runtime.getRuntime(); processffmpeg = runTime.exec(jTextArea2.getText()); ffmpegstateRun(); ffmpegSending=stateffmpeg.on; jTextArea4.setText(jTextArea4.getText()+"\nFFmpeg Iniciado. Enviando Contenido...Ffserver Esperando por Conexiones."); ffmpeghandler_thread=new Ffmpeghandler_thread(); ffmpeghandler_thread.start(); } catch (IOException ex) { Logger.getLogger(guiStreamer.class.getName()).log(Level.SEVERE, null, ex); System.out.println("No pudimos iniciar ffmpeg"); System.exit(-1); } } else // semmutexFFserverState.acquireUninterruptibly(); if (ffmpegSending==stateffmpeg.on){ if (processffmpeg!=null){ processffmpeg.destroy(); try { processffmpeg.waitFor(); } catch( InterruptedException e ) { System.out.println("No pudimos esperar por témino"); System.exit(-1); } ffmpegstatePause(); ffmpegSending=stateffmpeg.off; jTextArea4.setText(jTextArea4.getText()+"\nFFmpeg fue finalizado."); } else { jTextArea4.setText(jTextArea4.getText()+"\nFFmpeg anteriormente finalizado."); System.out.println("FFmpeg fue finalizado!!"); } } }//GEN-LAST:event_jButton3ActionPerformed private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem2ActionPerformed // Finalizar procesos al salir, pueden ser ocupados por otra aplicación if(processffmpeg!=null){ processffmpeg.destroy(); } if (processffserver!=null){ processffserver.destroy(); } System.exit(0); // TODO add your handling code here: }//GEN-LAST:event_jMenuItem2ActionPerformed private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing if(processffmpeg!=null){ processffmpeg.destroy(); } if (processffserver!=null){ processffserver.destroy(); } System.exit(0); }//GEN-LAST:event_formWindowClosing /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new guiStreamer().setVisible(true); } }); } class Ffserverhandler_thread extends Thread { boolean done = false; boolean done2 = false; BufferedReader inserver; BufferedReader errserver; String line=null; Ffserverhandler_thread(){ inserver = new BufferedReader(new InputStreamReader(processffserver.getInputStream())); errserver = new BufferedReader(new InputStreamReader(processffserver.getInputStream())); } @Override @SuppressWarnings("static-access") public void run() { while (!done){ /* try { System.out.println("ffserver " + inserver.readLine()); // System.out.println("ffserver " + errserver.readLine()); } catch (IOException ex) { Logger.getLogger(guiStreamer.class.getName()).log(Level.SEVERE, null, ex); } */ try { Thread.sleep(1000); } catch (InterruptedException ex) { Logger.getLogger(guiStreamer.class.getName()).log(Level.SEVERE, null, ex); } } } public void safeStop() { done = true; } public void safeStart() { done = false; } public void safeStopdone2() { done2 = true; } } class Ffmpeghandler_thread extends Thread { boolean done = false; BufferedReader inffmpeg; BufferedReader errinffmpeg; String info=null; Ffmpeghandler_thread(){ inffmpeg = new BufferedReader(new InputStreamReader(processffmpeg.getInputStream())); errinffmpeg = new BufferedReader(new InputStreamReader(processffmpeg.getErrorStream())); } @Override public void run() { while(!done) { /* try { //System.out.println("Y..."); info=errinffmpeg.readLine(); System.out.println("ffmpeg" + info); } catch (IOException ex) { Logger.getLogger(guiStreamer.class.getName()).log(Level.SEVERE, null, ex); } */ try { Thread.sleep(100); } catch (InterruptedException ex) { Logger.getLogger(guiStreamer.class.getName()).log(Level.SEVERE, null, ex); } } } public void safeStop() { done = true; } } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton jButton2; private javax.swing.JButton jButton3; private javax.swing.JLayeredPane jLayeredPane1; private javax.swing.JMenu jMenu1; private javax.swing.JMenu jMenu3; private javax.swing.JMenuBar jMenuBar1; private javax.swing.JMenuItem jMenuItem1; private javax.swing.JMenuItem jMenuItem2; private javax.swing.JMenuItem jMenuItem3; private javax.swing.JMenuItem jMenuItem4; private javax.swing.JMenuItem jMenuItem6; private javax.swing.JMenuItem jMenuItem7; private javax.swing.JPanel jPanel1; private javax.swing.JPopupMenu jPopupMenu1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JScrollPane jScrollPane4; private javax.swing.JSeparator jSeparator1; private javax.swing.JTextArea jTextArea1; private javax.swing.JTextArea jTextArea2; private javax.swing.JTextArea jTextArea4; // End of variables declaration//GEN-END:variables static enum stateffserver {off,starting,on,pause,restart,restarted}; static enum stateffmpeg {off,starting,on,pause,restart,restarted}; private static stateffserver ffserver=stateffserver.off; private static stateffmpeg ffmpegSending=stateffmpeg.off; private static Process processffserver=null; private static Process processffmpeg=null; private static Process processAreRunning=null; private static BufferedReader verificador=null; Ffserverhandler_thread ffserverhandler_thread; Ffmpeghandler_thread ffmpeghandler_thread; private Semaphore semmutexFFserverState; private Semaphore semmutexFFmpegState; //others }