JavaFX桌面應用-視訊轉碼工具(支援愛奇藝qsv轉mp4)
阿新 • • 發佈:2020-08-15
最近由於需要將在愛奇藝下載的視訊(qsv)轉化了mp4,用JavaFX開發一個視訊轉碼工具,算是JavaFX開發的第一個應用吧。
支援qsv轉碼mp4,理論上支援各種格式,僅測試了flv,qsv格式。
文末有安裝包獲取途徑
~ JavaFX桌面應用開發系列文章傳送門 ~
- JavaFX桌面應用開發-HelloWorld
- JavaFX佈局神器-SceneBuilder
- JavaFX讓UI更美觀-CSS樣式
- JavaFX桌面應用-為什麼應用老是“未響應”
- JavaFX桌面應用-MVC模式開發,“真香”
- JavaFX桌面應用-loading介面
- JavaFX桌面應用-表格用法
- 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青年” 傳送 “視訊轉碼工具” 獲取安裝包。
關注公眾號,閱讀更多文章。