JavaFX桌面應用-影片轉碼工具(支援愛奇藝qsv轉mp4)
最近由於需要將在愛奇藝下載的影片(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青年」 發送 「影片轉碼工具」 獲取安裝包。
關注公眾號,閱讀更多文章。