From 7b5993bcc4edf478ba42cdf60b1e4ec61f3b58bf Mon Sep 17 00:00:00 2001 From: zhangmeng <1334717033@qq.com> Date: Wed, 24 May 2023 16:14:18 +0800 Subject: [PATCH] =?UTF-8?q?2023=E5=B9=B45=E6=9C=8824=E6=97=A516:13:58=20?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E8=BD=AC=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/VideoTranscoderController.java | 61 +++++++++++++++++-- src/main/resources/fxml/video-transcoder.fxml | 12 ++-- 2 files changed, 64 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/zhangmeng/tools/controller/VideoTranscoderController.java b/src/main/java/com/zhangmeng/tools/controller/VideoTranscoderController.java index 53748a1..4ddf159 100644 --- a/src/main/java/com/zhangmeng/tools/controller/VideoTranscoderController.java +++ b/src/main/java/com/zhangmeng/tools/controller/VideoTranscoderController.java @@ -5,6 +5,8 @@ import com.zhangmeng.tools.utils.ImagePath; import javafx.application.Platform; import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleObjectProperty; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; import javafx.concurrent.Task; import javafx.fxml.FXML; import javafx.scene.control.Button; @@ -12,21 +14,27 @@ import javafx.scene.control.ProgressBar; import javafx.scene.control.TextField; import javafx.scene.image.Image; import javafx.scene.image.ImageView; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.StackPane; import javafx.scene.media.Media; import javafx.scene.media.MediaPlayer; +import javafx.scene.media.MediaView; import javafx.stage.DirectoryChooser; import javafx.stage.FileChooser; import javafx.stage.Stage; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FilenameUtils; import org.bytedeco.ffmpeg.global.avcodec; +import org.bytedeco.ffmpeg.global.avutil; import org.bytedeco.javacv.*; import java.io.File; import java.io.IOException; +import java.net.URL; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import static org.bytedeco.ffmpeg.global.avcodec.AV_CODEC_ID_MPEG4; +import static org.bytedeco.ffmpeg.global.avcodec.*; /** * @author : 芊芊墨客 @@ -60,15 +68,32 @@ public class VideoTranscoderController { public SimpleObjectProperty in_file = new SimpleObjectProperty<>(); public SimpleObjectProperty out_file = new SimpleObjectProperty<>(); + @FXML + public MediaView mv; + + @FXML + public AnchorPane mv_root; + @FXML public void initialize() { + + // 绑定MediaView的宽度和高度到父容器的宽度和高度 + this.mv.setPreserveRatio(false); + this.mv.fitHeightProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Number oldValue, Number newValue) { + System.out.println("fitHeightProperty:" + newValue.doubleValue()); + } + }); + init_but(input_file_button); init_but(output_file_button); init_choose_dir_manager(); init_choose_file_manager(); this.start_button.setOnAction(event -> { - + this.mv.setFitWidth(mv_root.getWidth()); + this.mv.setFitHeight(mv_root.getHeight()); if (input_file.getText().length() == 0){ AlertUtils.alert_warning("请选择转码文件!"); return; @@ -149,13 +174,27 @@ public class VideoTranscoderController { protected Void call() throws Exception { try { FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(in_file.get()); - grabber.setVideoCodec(AV_CODEC_ID_MPEG4); grabber.start(); FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(out_file.get(), grabber.getImageWidth(), grabber.getImageHeight(), grabber.getAudioChannels()); - recorder.setFormat("avi"); - recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4); + String extension = FilenameUtils.getExtension(out_file.get().getName()); + recorder.setFormat(extension); + recorder.setVideoCodec(grabber.getVideoCodec()); + recorder.setVideoBitrate(grabber.getVideoBitrate()); + recorder.setAudioCodec(grabber.getAudioCodec()); + recorder.setAudioBitrate(grabber.getAudioCodec()); recorder.setFrameRate(grabber.getFrameRate()); + + if (extension.equals("mp4")){ + recorder.setVideoCodec(AV_CODEC_ID_MPEG4); + } + if (extension.equals("avi")){ + recorder.setVideoCodec(AV_CODEC_ID_HUFFYUV); + } + if (extension.equals("flv")){ + recorder.setVideoCodec(AV_CODEC_ID_FLV1); + } + recorder.start(); int totalFrames = grabber.getLengthInFrames(); @@ -170,7 +209,10 @@ public class VideoTranscoderController { } grabber.stop(); + grabber.release(); recorder.stop(); + recorder.release(); + } catch (FrameGrabber.Exception | FrameRecorder.Exception e) { e.printStackTrace(); } @@ -181,6 +223,15 @@ public class VideoTranscoderController { protected void succeeded() { progressbar.setProgress(1); AlertUtils.alert_msg("转码完成!"); + try { + Media media = new Media(out_file.get().toURI().toASCIIString()); + MediaPlayer mediaPlayer = new MediaPlayer(media); + mediaPlayer.setAutoPlay(true); + mediaPlayer.setOnEndOfMedia(mediaPlayer::dispose); + mv.setMediaPlayer(mediaPlayer); + } catch (Exception e) { + e.printStackTrace(); + } } @Override diff --git a/src/main/resources/fxml/video-transcoder.fxml b/src/main/resources/fxml/video-transcoder.fxml index 3018b54..5109480 100644 --- a/src/main/resources/fxml/video-transcoder.fxml +++ b/src/main/resources/fxml/video-transcoder.fxml @@ -7,7 +7,7 @@ - +