2025/06/15

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 -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 -pix_fmt yuv420p " & Chr(34) & mp4Name & Chr(34)
Debug.Print s

Shell s, windowStyle

Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub





 

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

0 comments:

張貼留言