「Excel / 使用VBA執行ffmpeg合併圖檔與音檔成為影音檔 」系列的第3篇
將合併流程更加自動化的另一個方式是利用Excel VBA表單功能
表單的功能介面如下
主要流程為透過2個按鈕,分別觸發選取圖檔與音檔的程式
選取之後將檔案路徑寫入對應的文字方塊,也可以用標籤
目的是顯示檔案路徑
選完檔案之後,再透過「合併」按鈕觸發合併圖檔與音檔的程式
當檔案成果轉檔之後,在將相關資料寫入工作表之中
選取檔案的程式碼跟之前的大同小異
差別只有在寫入的地方不同
程式碼如下
1.選取圖檔的按鈕
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Sub cb1_Click() Dim fd As FileDialog Set fd = Application.FileDialog(msoFileDialogFilePicker) With fd .AllowMultiSelect = False .Filters.Clear .Filters.Add "Images", "*.jpg; *.jpeg" .Title = "選取圖檔" End With Dim filePath As Variant If fd.Show = -1 Then filePath = fd.SelectedItems(1) Debug.Print filePath podcast.tb1.Text = filePath End If Set fd = Nothing End Sub |
2.選取音檔的程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Sub cb2_Click() Dim fd2 As FileDialog Set fd2 = Application.FileDialog(msoFileDialogFilePicker) With fd2 .AllowMultiSelect = False .Filters.Clear .Filters.Add "Wav", "*.wav" .Title = "選取音檔" End With Dim filePath As Variant If fd2.Show = -1 Then filePath = fd2.SelectedItems(1) Debug.Print filePath podcast.tb2.Text = filePath End If Set fd2 = Nothing End Sub |
3.合併圖檔與音檔
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
Sub cb3_Click() r = Sheets(1).Range("B1").End(xlDown).Row If r = 1048576 Then r = 2 Else r = r + 1 End If If podcast.tb1.Text <> "" And podcast.tb2.Text <> "" Then Dim wsh As Object Set wsh = VBA.CreateObject("WScript.Shell") Dim waitOnReturn As Boolean: waitOnReturn = True Dim windowStyle As Integer: windowStyle = 3 Dim errorCode As Long ' 如果用環境參數在WScript.Shell會無法執行 ffmpegFile = "C:\Users\trico\Desktop\ffmpeg\bin\ffmpeg.exe" ' ffmpegFile = "C:\Users\edu\Desktop\yt-dlp\ffmpeg\bin\ffmpeg.exe" imgPath = podcast.tb1.Text wavName = podcast.tb2.Text n = InStr(1, podcast.tb2.Text, ".", vbTextCompare) mp4Name = Mid(podcast.tb2.Text, 1, n - 1) & ".mp4" s = ffmpegFile & " -framerate 1 -i " & imgPath & " -i " & Chr(34) & wavName & Chr(34) & " -f mp4 -c:v libx264 -pix_fmt yuv420p " & Chr(34) & mp4Name & Chr(34) Debug.Print s ' Shell ' Shell s, windowStyle ' WScript.Shell errorCode = wsh.Run(s, windowStyle, waitOnReturn) If errorCode = 0 Then ' MsgBox "Done! No error to report." Debug.Print "輸出:" & mp4Name Sheets(1).Range("A" & r).Value = "◎" Sheets(1).Range("B" & r).Value = podcast.tb1.Text Sheets(1).Range("C" & r).Value = podcast.tb2.Text Sheets(1).Range("D" & r).Value = mp4Name Else MsgBox "Program exited with error code " & errorCode End If End If Unload podcast End Sub |
需要注意的地方是cb1_Click 、cb2_Click跟 cb3_Click
cb1、cb2、cb3是按鈕的名稱,也就是按鈕的Name屬性,可以設定成自己想要的名稱
順帶一提,按鈕內的文字可以在Caption屬性設定
Click則是按鈕的行為,直接在表單設計的介面點按鈕
就會自動產生物件的Click程序
也可以在程式碼介面的下拉選單選定
我的印象是不能直接用文字輸入,只能從表單設計界面或者程式設計介面下拉選單讓VBA自動產生
這樣就可以完成一個簡易的表單來達成自動化流程