使用ffmpeg为JavaFX MediaPlayer生成视频

时间:2014-12-08 08:48:27

标签: java video ffmpeg javafx

我正在尝试使用ffmpeg从timelapse图像生成视频文件。不知何故,我没有找到哪个编解码器resp。我必须在ffmpeg中使用哪些参数,视频文件可以使用JavaFX的MediaPlayer播放。我试过这些编解码器:

  • libx264 ffmpeg -f image2 -i %05d.jpg -r 30 -filter:v crop=4000:2250:0:0 -s 1920x1080 -vcodec libx264 -preset ultrafast -qp 0 Timelapse3.mp4
  • mpeg4 ffmpeg -f image2 -i %05d.jpg -r 30 -filter:v crop=4000:2250:0:0 -s 1920x1080 -vcodec mpeg4 -qscale 1 ../Timelapse.avi

但他们没有使用JavaFX。我必须使用哪种编解码器和参数才能获得高质量的输出?

3 个答案:

答案 0 :(得分:1)

如果我有一个输入为mp4(但它应该与其他输入格式相应地工作,如你的情况下图像游戏中时光倒流),以下对我有用:

ffmpeg -i input.mp4 -vcodec h264 -vf scale=1920x1080 -an -pix_fmt yuv420p output.mp4

所以重要的部分是:

  • 更改pix_fmt 。显然不支持默认值。
  • 并且分辨率似乎仅在低于或等于1920x1080 时才有效
  • 在我的情况下,我不需要音频! (如果您需要音频删除-an 或替换为有效的音频编解码器转换)

答案 1 :(得分:0)

JavaFX不支持avi容器格式,所以不会工作 - 但是你的第一个例子应该可以播放球 - 我已经尝试了它并且它适用于我。< / p>

您也可以尝试使用相同的f开关强制mp4容器,但在输出文件之前:

ffmpeg -f image2 -i %05d.jpg -r 30 -filter:v crop=4000:2250:0:0 -s 1920x1080 -vcodec mpeg4 -qscale 1 -f mp4 ../Timelapse.mp4

(也可以使用libx264尝试上述内容。)

答案 2 :(得分:0)

试试这个

用引号替换引号中的文件名。文件名编号应从0开始,然后转到1,2,3,4等等

这就是我的文件名看起来的样子

下颌空洞1微米.gizmofill0.gizmoslice.jpg

下颌空洞1微米.gizmofill17.gizmoslice.jpg

下颌空洞1微米.gizmofill16994.gizmoslice.jpg

我的文件大小介于198kb和47kb之间。我有大约18500个文件。所有文件组合约为2.9GB。这将生成每秒50帧的电影文件,大约25MB

ffmpeg -framerate 50 -i&#34;下颌空心1微米.gizmofill%d.gizmoslice.jpg&#34; -s 1638x1004 -c:v libx264 -pix_fmt yuv420p output.mp4

此控制器代码适用于我

package javafxapplication13;

import java.io.File;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;

/**
 *
 * @author kobus
 */
public class FXMLDocumentController implements Initializable {

    @FXML
    private MediaView mediaView;

    @FXML
    private void handleButtonAction(ActionEvent event) {
        final File f = new File("C:/Users/kobus/Dropbox/JavaProjects/Gizmetor/temp/output.mp4");

        Media media = new Media(f.toURI().toString());
        MediaPlayer mediaPlayer = new MediaPlayer(media);
        mediaPlayer.setAutoPlay(true);

        mediaPlayer.play();
        mediaView.setMediaPlayer(mediaPlayer);
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }
}

这是.fxml文件

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.media.*?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="javafxapplication13.FXMLDocumentController">
    <children>
        <Button fx:id="button" layoutX="126" layoutY="90" onAction="#handleButtonAction" text="Click Me!" />
        <Label fx:id="label" layoutX="126" layoutY="120" minHeight="16" minWidth="69" />
      <MediaView fx:id="mediaView" fitHeight="1005.0" fitWidth="1638.0" layoutX="14.0" layoutY="165.0" />
    </children>
</AnchorPane>

这是应用程序文件

package javafxapplication13;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

/**
 *
 * @author kobus
 */
public class JavaFXApplication13 extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));

        Scene scene = new Scene(root);

        stage.setScene(scene);
        stage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}