ffmpeg 合併音檔或圖片
為了把破碎的串流串在一起...
ffmpeg安裝
主要根據此網站下載安裝ffmpeg
我自己的步驟如下:
- 前往網站中指的 download site下載。( 我選擇 version 4.2.1、win-64bit、static)
- 檔案約64MB左右,解壓縮後,放在常安裝程式的資料夾比較好。例如
C:\Program Files\ffmpeg
- 進去解壓縮的資料夾,在
bin
下面該會有一個ffmpeg.exe
的程式。 - 加入環境變數。
為了要使cmd指令中可以直接使用ffmpeg
使用上述的exe,因此需要將該bin
資料夾設定進去。
本機 → 右鍵:內容 → 進階系統設定 →環境變數: 系統環境變數 → 按Path後點旁邊的編輯 →把exe的資料夾新增進去(此案來說就是C:\Program Files\ffmpeg\bin
)
(環境變數的部分網路上很多資料,不再贅述)
但是按照這樣做了,也重開機,系統還是說「不是內部或外部指令或命令」
一氣之下我乾脆把ffmpeg.exe
複製到我要執行程式的資料夾,解決路徑的問題!! (還真成功了…)
音訊合併
狀況: 有20個左右只有五秒鐘的音檔,想合併成一分鐘的檔案。
- 首先使用Python,把資料夾內的檔案抓出來,寫成一個
list.txt
import subprocess
import osfolder = r"D:/my/file/path/"
folder_path = r"file 'D:/my/path/"
folder_content = os.listdir(folder)l1 = folder_content[:-1]
fp = open("list.txt", "a")for i in folder_content:
fp.write(folder_path+i+"'\n")
fp.close()
2. 切換執行位置
看個人需求,我的寫法是切過去比較安全…,又因為前面環境變數沒設定好。因此直接把 ffmpeg.exe複製到 my/file/path
下面。並在cmd把工作位置切換到該資料夾
PS. Windows裡面,切換到D槽直接打 D:
即可,中文資料夾名的話,打 cd "中文資料夾"
也可以自由切換(用引號包起來)。
3. 執行指令
ffmpeg.exe -f concat -safe 0 -i list.txt -c copy output.aac
如此一來,ffmpeg便會讀取 list.txt裡面列的10個音檔,合成為一個 output.acc 音檔!!
合併多張圖片成影片檔
Hint : 如果輸出的影片檔不能播放,不一定是合併失敗,有可能是播放器沒辦法解碼。可以使用開源的播放軟體 MPC 試試看 (親身經歷)
同樣的作法,也可以用來合併多張圖片成為一個 .mp4!
直接使用與上面相仿的指令,[有關Concatenate方法的官方文件]
ffmpeg.exe -f concat -safe 0 -i weight_list.txt -c copy weight.mp4
但是,如此生成的影片,圖片速度有點太快了….
Step. 0 注意事項
使用文件清單主要適用於檔案名稱不規則,例如:cat.png, dog.png 、或是數字不是固定位數格式,例如:1.png, 2.png …. 10.png…100.png、不能使用 img%03d.png 下指令的情況。
如果名稱規則(可以用正則表達來形容(?)),可以嘗試直接用下列指令來執行。注意,當 -framerate 未設定時,預設fps=25。
ffmpeg -framerate 24 -i img%03d.png output.mp4
Step1. 修正清單文件
在檔案之間穿插 duration __(秒數)__
file 'file_000.png'
duration 0.2
file 'file_001.png'
duration 0.2
Step2. 指令修改為
參數說明: -r = set frame rate
ffmpeg.exe -f concat -safe 0 -y -i weight_list.txt -r 5 -c copy weight.mp4
該篇論壇樓主題到,這方法在官方文檔中有提及,稱作 Concat demuxer
轉成Gif
雖然能夠成功,但我的gif會失真,這篇或許能夠解決問題 (還沒研究)
ffmpeg -i input.mp4 -pix_fmt rgb24 -loop 0 output.gif# 或使用這個,圖像大小會壓縮
ffmpeg -i input.mp4 -pix_fmt rgb24 -s qcif -loop 0 output.gif
合併音訊與影片檔案
同上,把音訊跟影片檔案放在同個資料夾,包含 ffmpeg.exe
執行命令:
ffmpeg.exe -i video.mp4 -i audio.m4a outputvideo.mp4
有時候沒辦法單純使用 wget 下載到目標物件,可以改用 urllib.request。
參考
合併
使用urllib.request下載,並輸出當前下載進度。
調整 fps 的方法
這篇我沒用上,但或許值得參考