处理 - 在处理草图中记录和显示视频

processing - record and show video in the processing sketch

我的处理草图中有一个网络摄像头,我可以录制和保存视频。我想完成的是,当我转到下一个案例 (drawScreenOne) 时,我刚刚录制的视频将显示在 canvas 上。我现在遇到的问题是,当我使用来自 com.hamoid 的视频导出库保存视频时,它会保存在与我的草图相同的文件夹中,但要播放电影,它需要在数据中文件夹。所以如果不手动移动到数据文件夹我就无法播放电影。你能从处理中做到这一点吗? 以及如何加载我之前在案例中创建的视频?我需要为此使用数组吗?当我手动将它移动到数据文件夹时我可以播放电影,但我想要处理来处理它。

这是我目前的代码:

import com.hamoid.*;
import processing.video.*;
import ddf.minim.*;

Minim minim;
AudioInput in;
AudioRecorder recorder;

Movie myMovie;
Movie myMovie1;

int currentScreen;

VideoExport videoExport;
boolean recording = false;

Capture theCap; 

Capture cam;

int i = 0;

int countname; //change the name
int name = 000000; //set the number in key's' function

// change the file name
void newFile()
{      
 countname =( name + 1);
 recorder = minim.createRecorder(in, "file/Sound" + countname + ".wav", true);
 // println("file/" + countname + ".wav");
}

void setup() {
   size(500,500);
   frameRate(30);
   noStroke();
   smooth();

   myMovie = new Movie(this, "video0.mp4");
   myMovie.loop();

   myMovie1 = new Movie(this, "video1.mp4");
   myMovie1.loop();

   String[] cameras = Capture.list();

  if (cameras.length == 0) {
    println("There are no cameras available for capture.");
    exit();
  } else {
    println("Available cameras:");
    for (int i = 0; i < cameras.length; i++) {
      println(cameras[i]);
    }

    // The camera can be initialized directly using an 
    // element from the array returned by list():
    //cam = new Capture(this, cameras[3]); //built in mac cam "isight"
    cam = new Capture(this, 1280, 960, "USB-camera"); //externe camera Lex, linker USB
    cam.start();
  }

  println("Druk op R om geluid en video op te nemen.Druk nog een keer op R om het opnemen te stoppen en druk op S om het op te slaan Druk vervolgens op Z om verder te gaan.");

  videoExport = new VideoExport(this, "video" + i + ".mp4");

   minim = new Minim(this);

 // get a stereo line-in: sample buffer length of 2048
 // default sample rate is 44100, default bit depth is 16
 in = minim.getLineIn(Minim.STEREO, 2048);
 // create a recorder that  will record from the input to the filename specified, using buffered recording
 // buffered recording means that all captured audio will be written into a sample buffer
 // then when save() is called, the contents of the buffer will actually be written to a file
 // the file will be located in the sketch's root folder.

 newFile();//go to change file name
 textFont(createFont("SanSerif", 12));
}

void draw() {
   switch(currentScreen){
   case 0: drawScreenZero(); break; //camera
   case 1: drawScreenOne(); break; //1 video
   case 2: drawScreenZero(); break; //camera
   case 3: drawScreenTwo(); break; // 2 video's
   case 4: drawScreenZero(); break; //camera
   case 5: drawScreenThree(); break; //3 video's
   case 6: drawScreenZero(); break; //camera
   case 7: drawScreenFour(); break; //4 video's
   default: background(0); break;
   }
}

void mousePressed() {
   currentScreen++;
   if (currentScreen > 2) { currentScreen = 0; }
}

void drawScreenZero() {
 println("drawScreenZero camera");

 if (cam.available() == true) {
    cam.read();
  }
  image(cam, 0,0,width, height);
  // The following does the same, and is faster when just drawing the image
  // without any additional resizing, transformations, or tint.
  //set(0, 0, cam);

  if (recording) {
    videoExport.saveFrame();
  }

  for(int i = 0; i < in.bufferSize() - 1; i++)
 {
   line(i, 50 + in.left.get(i)*50, i+1, 50 + in.left.get(i+1)*50);
   line(i, 150 + in.right.get(i)*50, i+1, 150 + in.right.get(i+1)*50);
 }

 if ( recorder.isRecording() )
 {
   text("Aan het opnemen...", 5, 15);
   text("Druk op R als je klaar bent met opnemen en druk op S om het op te slaan.", 5, 30);
 }
 else
 {
   text("Gestopt met opnemen. Druk op R om op te nemen, druk op S om op te slaan.", 5, 15);
 }
}

void drawScreenOne() {
 background(0,255,0);
 //fill(0);
 //rect(250,40,250,400);
 println("drawScreenOne 1 video");

 image(myMovie, 0,0, (width/2),(height/2));

}


void drawScreenTwo(){
 background(0,0,255);
 println("drawScreenTwo 2 videos");
 //triangle(150,100,150,400,450,250);
 image(myMovie, 0,0, (width/2),(height/2));
 image(myMovie1, (width/2),(height/2),(width/2),(height/2));
}

void drawScreenThree(){
  //fill(0);
 //rect(250,40,250,400);
  background(255,0,0);
 println("drawScreenThree 3 videos");
  image(myMovie, 0,0, (width/2),(height/2));
  image(myMovie1, (width/2),(height/2),(width/2),(height/2));
  image(myMovie, (width/2),0, (width/2),(height/2));
}

void drawScreenFour(){
  //triangle(150,100,150,400,450,250);
  background(0,0,255);
 println("drawScreenFour 4 videos");
  image(myMovie, 0,0, (width/2),(height/2));
  image(myMovie1, (width/2),(height/2),(width/2),(height/2));
  image(myMovie, (width/2),0, (width/2),(height/2));
  image(myMovie1, 0,(height/2),(width/2),(height/2));
}

void keyPressed() {
  if (key == 'r' || key == 'R') {
    recording = !recording;
    println("Recording is " + (recording ? "ON" : "OFF"));
  } else   if (key == 's' || key == 's') {
    i++;
    videoExport = new VideoExport(this, "video" + i + ".mp4");
    currentScreen++;
    if (currentScreen > 7) { currentScreen = 0; } 

  }
}

void movieEvent(Movie m) {
  m.read();
}

void keyReleased()
{
 if ( key == 'r' ) 
 {
   // to indicate that you want to start or stop capturing audio data, you must call
   // beginRecord() and endRecord() on the AudioRecorder object. You can start and stop
   // as many times as you like, the audio data will be appended to the end of the buffer 
   // (in the case of buffered recording) or to the end of the file (in the case of streamed recording). 
   if ( recorder.isRecording() ) 
   {
     recorder.endRecord();
   }
   else 
   {
     /*#######################################*/
     newFile();
     /*#######################################*/
     recorder.beginRecord();
   }
 }
 if ( key == 's' )
 {
   // we've filled the file out buffer, 
   // now write it to the file we specified in createRecorder
   // in the case of buffered recording, if the buffer is large, 
   // this will appear to freeze the sketch for sometime
   // in the case of streamed recording, 
   // it will not freeze as the data is already in the file and all that is being done
   // is closing the file.
   // the method returns the recorded audio as an AudioRecording, 
   // see the example  AudioRecorder >> RecordAndPlayback for more about that

   name++; //change the file name, everytime +1
   recorder.save();
   println("Done saving.");
   println(name);//check the name
 }
}

void stop()
{
 // always close Minim audio classes when you are done with them
 in.close();
 minim.stop();

 super.stop();
}

Can you do that from within processing?

当然可以。只需 google 类似 "Java move file" 的内容,我相信您会找到大量结果。 或者您可以先将视频保存到 data 目录。 我从未使用过 VideoExport class 所以这只是一个猜测,但我想这会将视频放在 data 目录中:

videoExport = new VideoExport(this, "data/video" + i + ".mp4");

And how can i load up the videos that i just created in a case before? Do i need to use an array for that?

我不确定我是否理解这个问题,但您可以使用任何您想要的变量。只需跟踪文件的去向,然后从那里加载它们。