Excel / 使用VBA執行ffmpeg合併圖檔與音檔成為影音檔 3

「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自動產生

這樣就可以完成一個簡易的表單來達成自動化流程