最近將新的貼文利用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 |
之後可以將工作表當成資料庫,記錄每筆影音檔的圖檔來源、音檔來源與輸出檔案的路徑