1. 程式人生 > 實用技巧 >JavaFX桌面應用-視訊轉碼工具(支援愛奇藝qsv轉mp4)

JavaFX桌面應用-視訊轉碼工具(支援愛奇藝qsv轉mp4)

最近由於需要將在愛奇藝下載的視訊(qsv)轉化了mp4,用JavaFX開發一個視訊轉碼工具,算是JavaFX開發的第一個應用吧。

支援qsv轉碼mp4,理論上支援各種格式,僅測試了flv,qsv格式。
文末有安裝包獲取途徑

~ JavaFX桌面應用開發系列文章傳送門 ~

  1. JavaFX桌面應用開發-HelloWorld
  2. JavaFX佈局神器-SceneBuilder
  3. JavaFX讓UI更美觀-CSS樣式
  4. JavaFX桌面應用-為什麼應用老是“未響應”
  5. JavaFX桌面應用-MVC模式開發,“真香”
  6. JavaFX桌面應用-loading介面
  7. JavaFX桌面應用-表格用法
  8. JavaFX桌面應用-視訊轉碼工具(本文)

1. 應用程式預覽

UI介面主要分為三個部分,頂部用於顯示當前轉碼的視訊資訊,右側按鈕用於選擇需要轉碼的視訊,已經啟動轉碼,中間是轉碼視訊列表資訊顯示。

2. UI 佈局

使用BorderPane進行佈局,top為視訊資訊顯示區,center為表格顯示區

<center>
    <TableView fx:id="table" prefHeight="187.0" prefWidth="600.0"/>
</center>
<top>
    <VBox>
        <children>
            <HBox alignment="CENTER" prefHeight="30.0">
                <children>
                    <Label fx:id="info" alignment="CENTER" contentDisplay="CENTER" prefWidth="600.0"/>
                </children>
            </HBox>
            <HBox alignment="CENTER_RIGHT" prefHeight="30.0" spacing="10">
                <children>
                    <Button text="選擇..." onAction="#selectVideoHandler"/>
                    <Button text=" 啟動 " onAction="#executeConvertHandler"/>
                </children>
            </HBox>
        </children>
        <BorderPane.margin>
            <Insets bottom="10.0" left="10.0" right="10.0" top="10.0"/>
        </BorderPane.margin>
    </VBox>
</top>

3. 事件處理

這裡需要處理兩個按鈕的事件,即“選擇”按鈕和“啟動”按鈕的事件。

a. “選擇”事件處理

當用戶點選“選擇”時,彈出視訊檔案選擇框,支援同時選擇多個視訊。

public void selectVideoHandler(ActionEvent actionEvent) {
    FileChooser fileChooser = new FileChooser();
    List<File> fs = fileChooser.showOpenMultipleDialog(App.stage);
    int idx = 0;
    if (fs != null && !fs.isEmpty()) {
        for (File f : fs) {
            if (f.exists() && f.isFile()) {
                model.getTableList()
                    .add(TableColumnModel.fromWork(new Work(System.currentTimeMillis() + idx++, f.getAbsolutePath())));
            }
        }
    }
}

b. “啟動”事件處理

當用戶點選啟動按鈕的時候,開始轉碼,並禁用啟動按鈕,防止多次啟動轉碼。

public void executeConvertHandler(ActionEvent actionEvent) {
    if (model.getTableList().isEmpty()) {
        new Alert(Alert.AlertType.INFORMATION, "沒有轉碼任務,請選擇視訊進行轉碼。").show();
        return;
    }
    if (ffmpeg == null) {
        new Alert(Alert.AlertType.ERROR, "FFmpeg.exe Not Found.").show();
        return;
    }
    ((Button) actionEvent.getSource()).setDisable(true);
    new VideoConvertExecutor(ffmpeg, model.getTableList(), s -> Platform.runLater(() -> model.setInfo(s))).start();
}

4. 視訊轉碼主流程

視訊轉碼採用FFmpeg工具進行轉碼,當視訊進行轉碼時,將任務放入轉碼任務池,並啟動轉碼;如果轉碼出現異常,則將異常資訊放入model中顯示在介面上,如果所有任務都已執行完成後退出轉碼執行緒。

@Override
public void run() {
    while (true) {
        Optional<TableColumnModel> opt = modelList.stream().filter(i -> !VideoConvertHolder.has(i.getId())).findFirst();
        if (opt.isPresent()) {
            try {
                VideoConvertHolder.add(opt.get().getId());
                convert(opt.get());
            } catch (Exception e) {
                e.printStackTrace();
                Platform.runLater(() -> opt.get().setMessage(e.getMessage()));
            }
        } else {
            break;
        }
    }
}

5. 應用打包、安裝

應用打包只需用InnoSetup生成打包配置iss,如何將應用打包成安裝包即可,下面是安裝介面:

安裝成功後,目錄結構如下:

6. 應用解除安裝

如果需要解除安裝應用,只需要執行安裝目錄下面的unins000.exe即可。

=========================================================
關注 公眾號 “HiIT青年” 傳送 “視訊轉碼工具” 獲取安裝包。


關注公眾號,閱讀更多文章。