aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominic Matarese <dominicmatarese@gmail.com>2021-07-12 16:12:43 +0000
committerDominic Matarese <dominicmatarese@gmail.com>2021-07-12 16:12:43 +0000
commit801c650e59764045a8c1495cc30e0226039d5dcb (patch)
tree6b8a44e615bfb50eed24fb3bbea9928e5c4807d4
required first commit
-rwxr-xr-xSampleVideo_1280x720_1mb.mp4bin0 -> 1055736 bytes
-rwxr-xr-xbin/Main.classbin0 -> 6445 bytes
-rwxr-xr-xbin/getFrames.classbin0 -> 3478 bytes
-rwxr-xr-xsrc/Main.java176
-rwxr-xr-xsrc/getFrames.java91
-rwxr-xr-xtoo_long.mp4bin0 -> 8794597 bytes
6 files changed, 267 insertions, 0 deletions
diff --git a/SampleVideo_1280x720_1mb.mp4 b/SampleVideo_1280x720_1mb.mp4
new file mode 100755
index 0000000..ed139d6
--- /dev/null
+++ b/SampleVideo_1280x720_1mb.mp4
Binary files differ
diff --git a/bin/Main.class b/bin/Main.class
new file mode 100755
index 0000000..d1763e9
--- /dev/null
+++ b/bin/Main.class
Binary files differ
diff --git a/bin/getFrames.class b/bin/getFrames.class
new file mode 100755
index 0000000..fab198d
--- /dev/null
+++ b/bin/getFrames.class
Binary files differ
diff --git a/src/Main.java b/src/Main.java
new file mode 100755
index 0000000..00f35ac
--- /dev/null
+++ b/src/Main.java
@@ -0,0 +1,176 @@
+import java.io.File;
+import java.io.IOException;
+
+import org.jcodec.api.JCodecException;
+
+import javafx.application.Application;
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+import javafx.scene.Scene;
+import javafx.scene.control.Button;
+import javafx.scene.layout.StackPane;
+import javafx.scene.media.Media;
+import javafx.scene.media.MediaPlayer;
+import javafx.scene.media.MediaPlayer.Status;
+import javafx.scene.media.MediaView;
+import javafx.stage.Stage;
+import javafx.stage.FileChooser;
+import javafx.stage.FileChooser.ExtensionFilter;
+//import JCodec.*;
+
+
+public class Main extends Application implements EventHandler <ActionEvent>{
+
+ public static void main(String[] args) {
+
+ launch(args);
+ }
+
+
+ MediaPlayer mediaPlayer, outputPlayer;
+ Button play, play2, edit, preview, preview2;
+ MediaView mediaView2;
+
+ boolean sceneTwo, edited;
+
+ //@Override //not sure what this does yet
+ public void start(Stage primaryStage) throws Exception {
+ primaryStage.setTitle("Assignment 4: Video Processor");
+
+ //buttons
+ play = new Button("\u25B6");
+ //play.setTranslateX(0-350);
+ play.setTranslateY(420);
+ play.setPrefSize(500, 100);
+ play.setStyle("-fx-font: 24 arial;");
+
+ play2 = new Button("\u25B6");
+ play2.setTranslateY(420);
+ play2.setPrefSize(500, 100);
+ play2.setStyle("-fx-font: 24 arial;");
+
+ edit = new Button("Apply Filter (this may take a while)");
+ edit.setTranslateX(0-400);
+ edit.setTranslateY(420);
+
+ preview = new Button("Preview Output");
+ preview.setTranslateX(350);
+ preview.setTranslateY(420);
+
+ preview2 = new Button("Back to input video");
+ preview2.setTranslateX(350);
+ preview2.setTranslateY(420);
+
+
+ //Choosing media file and displaying the media
+ File video;
+ FileChooser fileChooser = new FileChooser();
+ fileChooser.setTitle("Choose File (Currently only supports mp4 files)");
+ fileChooser.getExtensionFilters().addAll(new ExtensionFilter("mp4 Video Files", "*.mp4"));
+
+ video = fileChooser.showOpenDialog(primaryStage);
+ Media media = new Media(video.toURI().toString());
+ //create the player
+ mediaPlayer = new MediaPlayer(media);
+ MediaView mediaView = new MediaView(mediaPlayer);
+
+
+ //Play and pause events for play button - explicitly declared in handle function
+ play.setOnAction(this::handle);
+ //Play and pause events for the play2 button, handling the outputPlayer
+ play2.setOnAction(e -> {
+ if(edited) {
+ if(outputPlayer.getStatus() == Status.PLAYING) {
+ outputPlayer.pause();
+ play2.setText("\u25B6");
+ }
+ else {
+ outputPlayer.play();
+ play2.setText("II");
+ }
+ }
+ else {
+ play2.setText("There is no output to display!");
+ }
+
+ });
+
+ //video processing event for the process video button
+ edited = false;
+ edit.setOnAction(e -> {
+ try {
+ edit.setText(getFrames.encoded);
+ getFrames.editVideo(video);
+ edited = true;
+ edit.setText("Done!");
+ } catch (IOException e1) {
+ //Eclipse Auto-generated catch block
+ e1.printStackTrace();
+ } catch (JCodecException e1) {
+ //Eclipse Auto-generated catch block
+ e1.printStackTrace();
+ }
+ });
+
+
+
+ //Layout and scene
+ StackPane layout = new StackPane();
+ layout.getChildren().addAll(mediaView, play, edit, preview);
+ Scene scene = new Scene(layout, 1680, 1050);
+
+ StackPane layout2 = new StackPane();
+ Scene scene2 = new Scene(layout2, 1680, 1050);
+ //scene switching events for preview button
+ preview.setOnAction(e -> {
+
+ mediaPlayer.pause();
+ if(edited) {
+ //create the player for the output video
+ File output = new File("output.mp4");
+ Media outputMedia = new Media(output.toURI().toString());
+ outputPlayer = new MediaPlayer(outputMedia);
+ mediaView2 = new MediaView(outputPlayer);
+ layout2.getChildren().add(mediaView2);
+ }
+ //mediaView.setMediaPlayer(outputPlayer);
+ primaryStage.setScene(scene2);
+ });
+ preview2.setOnAction(e -> {
+ if(edited) {
+ outputPlayer.pause();
+ }
+
+ //mediaView.setMediaPlayer(mediaPlayer);
+ primaryStage.setScene(scene);
+
+ });
+ layout2.getChildren().addAll(play2, preview2);
+
+
+ //putting the scene in the stage and showing the stage
+ primaryStage.setScene(scene);
+ sceneTwo = false;
+ primaryStage.show();
+
+
+
+ }
+
+ @Override
+ public void handle(ActionEvent event) {
+
+ if(mediaPlayer.getStatus() == Status.PLAYING) {
+ mediaPlayer.pause();
+ play.setText("\u25B6");
+ }
+ else {
+ mediaPlayer.play();
+ play.setText("II");
+ }
+
+ }
+
+
+
+}
diff --git a/src/getFrames.java b/src/getFrames.java
new file mode 100755
index 0000000..e17f348
--- /dev/null
+++ b/src/getFrames.java
@@ -0,0 +1,91 @@
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import javax.imageio.ImageIO;
+
+import org.jcodec.api.FrameGrab;
+import org.jcodec.api.JCodecException;
+import org.jcodec.api.awt.AWTSequenceEncoder;
+import org.jcodec.common.io.*;
+import org.jcodec.common.io.NIOUtils;
+import org.jcodec.common.io.SeekableByteChannel;
+import org.jcodec.common.model.Picture;
+import org.jcodec.common.model.Rational;
+import org.jcodec.common.model.*;
+import org.jcodec.scale.*;
+import org.jcodec.scale.AWTUtil;
+
+
+public class getFrames {
+
+ //Splits the video into separate frames and dumps them in the frame-dump folder.
+ //Function is currently unused in the program
+ public static void splitVideo(File video) throws IOException, JCodecException{
+ double startSec = 0;
+ int frameCount = 1292;
+
+ FrameGrab grab = FrameGrab.createFrameGrab(NIOUtils.readableChannel(video));
+ grab.seekToSecondPrecise(startSec);
+
+ for (int i = 0; i < frameCount; i++) {
+ Picture picture = grab.getNativeFrame();
+ System.out.println(picture.getWidth() + "x" + picture.getHeight() + " " + picture.getColor());
+
+ BufferedImage bufferedImage = AWTUtil.toBufferedImage(picture);
+ ImageIO.write(bufferedImage, "png", new File("frame-dump/frame"+i+".png"));
+ }
+ }
+ public static String encoded;
+ public static void editVideo(File video) throws IOException, JCodecException{
+
+ SeekableByteChannel sbc = NIOUtils.readableChannel(video);
+
+ FrameGrab grab = FrameGrab.createFrameGrab(sbc);
+
+
+
+ AWTSequenceEncoder encoder = AWTSequenceEncoder.create30Fps(new File("output.mp4"));
+
+
+
+ Picture picture;
+ int i = 0;
+ while ((picture = grab.getNativeFrame()) != null)
+
+ {
+
+ BufferedImage image = AWTUtil.toBufferedImage(picture);
+
+
+ int width = image.getWidth();
+ int height = image.getHeight();
+
+ for(int y = 0; y < height; y++){
+ for(int x = 0; x < width; x++){
+
+ int p = image.getRGB(x,y);
+ int a = (p>>24)&0xff;
+ int r = (p>>16)&0xff;
+ int g = (p>>8)&0xff;
+ int b = p&0xff;
+ int avg = (r+g+b)/3;
+
+ //apply a different alpha value to each pixel
+ p = (a<<20) | (avg<<16) | (avg<<8) | avg;
+ image.setRGB(x, y, p);
+
+ }
+ }
+
+ encoder.encodeImage(image);
+ i++;
+ encoded = "Encoded frame "+i;
+ System.out.println("Encoded frame "+i);
+
+ }
+
+ encoder.finish();
+ }
+
+
+}
diff --git a/too_long.mp4 b/too_long.mp4
new file mode 100755
index 0000000..d9a6af7
--- /dev/null
+++ b/too_long.mp4
Binary files differ