2014-12-08 148 views
0

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

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

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

+1

好吧,我不知道你是如何实现它的ffmpeg。但是,这可能会有一些帮助。 [以下是JavaFX Media当前支持的编解码器列表](https://docs.oracle.com/javafx/2/api/javafx/scene/media/package-summary.html#SupportedMediaTypes) – ItachiUchiha 2014-12-08 10:05:34

回答

0

avi容器格式不被JavaFX支持,因此无法正常工作 - 但您的第一个示例应该弹球确定 - 我已经尝试过了,它适用于我。

您也可以尝试迫使MP4容器具有相同f开关,但只是在输出文件之前:

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)

0

试试这个

将引号中的文件名替换为文件名。文件名编号应该从0开始,然后进入1,2,3,4等

这是我的文件名怎么看

下颌空洞1个micron.gizmofill0.gizmoslice.jpg

下颌空洞1个micron.gizmofill17.gizmoslice.jpg

下颌空洞1个micron.gizmofill16994.gizmoslice.jpg

我的文件范围的大小198KB和47KB之间。我有大约18500个文件。所有文件加起来大约是2.9GB。这将产生在每秒50帧的影片文件,该文件是25MB左右

的ffmpeg -framerate 50 -i “下颌中空1个micron.gizmofill%d.gizmoslice.jpg” -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); 
    } 

} 
1

下面的工作对我来说,如果我有一个输入为MP4(但它应该与其他输入格式相应的工作,因为在你的情况下,图像延时):

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

所以重要的部分是:

  • 更改pix_fmt。显然默认的不支持。
  • 和分辨率似乎只在低于或等于1920x1080时才起作用
  • 我不需要音频! (如果您需要的音频删除或工作的音频编解码转换代替)