Advertisement
Guest User

capEncodeBeta.pde

a guest
May 8th, 2013
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.53 KB | None | 0 0
  1. import java.util.Arrays;
  2. import java.io.InputStreamReader;
  3. import java.io.BufferedOutputStream;
  4. import java.io.RandomAccessFile;
  5. import java.nio.channels.FileChannel;
  6. import java.nio.MappedByteBuffer;
  7. import java.nio.channels.Channels;
  8. import java.nio.channels.WritableByteChannel;
  9.  
  10. int ww = 1280;
  11. int hh = 720;
  12. String tmpLoc = "C:\\p5tmp";
  13. String saveLoc = "test\\";
  14. int ind = -1;
  15.  
  16. boolean doAudio;
  17. boolean started = true;
  18. boolean over;
  19. MappedByteBuffer mbb;
  20. String[] throb =
  21.   new String[]{
  22.     ".", " .", "  .", "   .", "    .", "     .","      ."};
  23.  
  24. RunCmd ffVid, ffAud;
  25.  
  26. void setup() {
  27.   size(200, 100);
  28.   frameRate(30);
  29.   saveLoc = sketchPath(saveLoc);
  30.  
  31.   try {
  32.     FileChannel fc =
  33.       new RandomAccessFile(tmpLoc, "rw").getChannel();
  34.     mbb = fc.map(FileChannel.MapMode.READ_ONLY, 0, ww*hh*4);
  35.    
  36.     ffVid = new RunCmd(true, false, ww*hh*16) {
  37.       public String getCmd() {
  38.         return
  39.           "ffmpeg " +
  40.           "-y " +
  41.           "-f rawvideo -vcodec rawvideo -pix_fmt bgra " +
  42.           "-s " + ww + "x" + hh + " -i - " +
  43.           "-r 30 -vcodec h264 -crf 18 " +
  44.           "-x264opts open_gop=0:cabac=1 " +
  45.           "-preset veryfast -rtbufsize 3686400 " +
  46.           "-vf vflip " +
  47.           "testv.mp4";
  48.       }
  49. //      public void doResponse(String re) {
  50. //        println(re);
  51. //      }
  52.     };
  53.    
  54.     if(doAudio) {    
  55.       ffAud = new RunCmd(true, false, 5120) {
  56.         public String getCmd() {
  57.           return
  58.             "ffmpeg " +
  59.             "-y " +
  60.             "-f dshow -i audio=\"virtual-audio-capturer\" " +
  61.             "-ac 2 " +
  62.             "testa.mp4";
  63.         }
  64. //        public void doResponse(String re) {
  65. //          println(re);
  66. //        }
  67.       };
  68.     }
  69.    
  70.   } catch(Throwable ex) {ex.printStackTrace();}
  71.  
  72. }
  73.  
  74. void mouseClicked() {
  75.   if(!started) {
  76.     println("starting output");
  77.     started = true;
  78.     return;
  79.   } else {
  80.     println("ending output");
  81.     started = false;
  82.     try {
  83.       ffVid.proc.getOutputStream().close();
  84.       if(doAudio) {
  85.         OutputStream os = ffAud.proc.getOutputStream();
  86.         os.write("q\n".getBytes());
  87.         os.flush();
  88.      
  89.         Thread.sleep(500);
  90.        
  91.         new RunCmd(true, true, 4096) {
  92.           public String getCmd() {
  93.             return
  94.               "ffmpeg -y " +
  95.               "-i testv.mp4 -i testa.mp4 " +
  96.               "-c copy -shortest " +
  97.               "testm.mp4";
  98.           }
  99.           public void doResponse(String re) {
  100.             println(re);
  101.           }
  102.           public void ended() {
  103.             new File(sketchPath("testa.mp4")).delete();
  104.             new File(sketchPath("testv.mp4")).delete();
  105.           }
  106.         };
  107.  
  108.       }
  109.      
  110.     } catch(Throwable ex) {ex.printStackTrace();}    
  111.     exit();
  112.   }
  113. }
  114.  
  115. void draw() {
  116.   frame.setTitle(
  117.     nf((ind>-1?ind:0), 6) + " " + throb[frameCount%7]);
  118.  
  119.   try {
  120.     if(started) {
  121.       ind++;
  122.       mbb.rewind();
  123.       if(!ffVid.dead) ffVid.wbc.write(mbb);
  124.     }
  125.   } catch(Throwable ex) {}
  126. }
  127.  
  128. void exit() {
  129.   try {
  130.     Thread.currentThread().sleep(500);
  131.   } catch(Throwable ex) {ex.printStackTrace();}
  132.   super.exit();
  133. }
  134.  
  135. class RunCmd {
  136.   boolean dead;
  137.   Process proc;
  138.   WritableByteChannel wbc;
  139.  
  140.   RunCmd(boolean doCom, boolean doEnd, int bf) throws Throwable {
  141.     ProcessBuilder builder = new ProcessBuilder(
  142.       Arrays.asList(splitTokens(getCmd())));
  143.     builder.directory(new File(getDir()));
  144.     builder.redirectErrorStream(true);
  145.     proc = builder.start();
  146.     BufferedOutputStream bos = new BufferedOutputStream(
  147.       proc.getOutputStream(), bf);
  148.     final BufferedReader br = new BufferedReader(
  149.       new InputStreamReader(proc.getInputStream()));
  150.    
  151.     if(doCom) {
  152.       wbc = Channels.newChannel(bos);
  153.       new Thread(new Runnable() {
  154.         public void run() {
  155.           String ln;
  156.           try {
  157.             while(!dead && (ln = br.readLine()) != null) {
  158.               doResponse(ln);
  159.             }
  160.           } catch(Throwable ex) {ex.printStackTrace();}
  161.         }
  162.       }).start();
  163.     }
  164.    
  165.     if(doEnd) {
  166.       new Thread(new Runnable() {
  167.         public void run() {
  168.           try {
  169.             proc.waitFor();
  170.             die();
  171.             proc.destroy();
  172.           } catch(Throwable ex) {ex.printStackTrace();}
  173.         }
  174.       }).start();
  175.     }
  176.   }
  177.  
  178.   void die() throws Throwable {
  179.     dead = true;
  180.     ended();
  181.   }
  182.  
  183.   String getDir() {return sketchPath("");}
  184.   String getCmd() {return "";}
  185.   void doResponse(String re) {}
  186.   void ended() {}
  187. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement