2014-12-08 151 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時才起作用
  • 我不需要音頻! (如果您需要的音頻刪除或工作的音頻編解碼轉換代替)