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


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

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

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

  1. JavaFX-桌面應用開發系列文章匯總篇
  2. JavaFX桌面應用開發-HelloWorld
  3. JavaFX布局神器-SceneBuilder
  4. JavaFX讓UI更美觀-CSS樣式
  5. JavaFX桌面應用-為什么應用老是“未響應”
  6. JavaFX桌面應用-MVC模式開發,“真香”
  7. JavaFX桌面應用-loading界面
  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即可。

7. 轉碼效果

經過轉碼后的qsv視頻就可以采用視頻播放工具播放了。

=========================================================
關注 公眾號 “HiIT青年” 發送 “視頻轉碼工具” 獲取安裝包。(如果沒有收到回復,可能是你之前取消過關注。)

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM