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

最近將新的貼文利用AI語音摘要工具產生podcast音檔

如果產生的podcast內容有問題,通常是內文寫得不夠清楚

這也可以用來幫助自己確認文章邏輯與內容是否清晰

彰化一整天的粉絲頁看到他利用flexclip來製作可以上傳到youtube的影音檔

由於上傳到youtube的內容必須是影音檔

也就是要有畫面跟聲音

因為flexclip免費版會被加上浮水印

所以我想分開來處理

我先用canva製作圖檔

再用ffmpeg將圖檔跟podcast音檔進行合併

ffmpeg最直接的方式就是在命令提示字元(CMD)執行

指令結構如下

ffmpeg -framerate 1 -i xxx.jpg -i yyy.wav -f mp4 -c:v libx264 -pix_fmt yuv420p zzz.mp4

ffmpeg

因為已經將ffmpeg加入系統的環境參數,所以就可以不用列出ffmpeg.exe的完整路徑

-framerate 1

因為只有一張圖,所以影片幀數設定1

-i 表示來源檔案

xxx.jpg

來源圖檔路徑

yyy.wav

來源音檔路徑

-f 表示輸出格式

mp4

輸出檔案格式為mp4

-c:v libx264 -pix_fmt yuv420p

影音編碼

zzz.mp4

輸出的檔案名稱路徑

這樣就可以很快速地產生影音檔

 

如果要批次產生很多影音檔的話

可以用程式來幫助達成

我先嘗試用VBA來進行

程式思路很簡單,就是在VBA執行外部程式

通常有2種方式

第1種是使用WScript.Shell物件

第2種是使用內建的shell物件

先說明簡易版本的程式碼,之後還可以跟工作表結合,讓流程更順暢方便

1.WScript.Shell物件

 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
Public Sub tt2()

    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
       
    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 執行
    filePath = ThisWorkbook.path & Application.PathSeparator
    wavName = filePath & "yyy.wav"
    n = InStr(1, wavName, ".", vbTextCompare)
    mp4Name = Mid(wavName, 1, n - 1) & ".mp4"
    imgPath = filePath & "xxx.jpg"
    Debug.Print mp4Name
    
    s = "ffmpeg -framerate 1 -i " & imgPath & " -i " & Chr(34) & wavName & Chr(34) & " -f mp4 -c:v libx264 -r 30 -pix_fmt yuv420p " & Chr(34) & mp4Name & Chr(34)
    Debug.Print s
       
    errorCode = wsh.Run(s, windowStyle, waitOnReturn)
        
    If errorCode = 0 Then
'       MsgBox "Done! No error to report."
        Debug.Print "輸出:" & mp4Name
    Else
        MsgBox "Program exited with error code " & errorCode
    End If
    
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub

 

2.shell物件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Public Sub ffmpeg_sh()

    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    
    Dim windowStyle As Integer: windowStyle = 3
    Dim errorCode As Long
    
    '透過Shell 執行
    filePath = ThisWorkbook.path & Application.PathSeparator
    wavName = filePath & "yyy.wav"
    n = InStr(1, wavName, ".", vbTextCompare)
    mp4Name = Mid(wavName, 1, n - 1) & ".mp4"
    imgPath = filePath & "xxx.jpg"
    Debug.Print mp4Name
    
    s = "ffmpeg -framerate 1 -i " & imgPath & " -i " & Chr(34) & wavName & Chr(34) & " -f mp4 -c:v libx264 -r 30 -pix_fmt yuv420p " & Chr(34) & mp4Name & Chr(34)
    Debug.Print s
       
    Shell s, windowStyle
    
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub

 

之後可以將工作表當成資料庫,記錄每筆影音檔的圖檔來源、音檔來源與輸出檔案的路徑