ffmpeg 合併音檔或圖片

為了把破碎的串流串在一起...

yosame
Brainynight
7 min readJan 11, 2020

--

ffmpeg安裝

主要根據此網站下載安裝ffmpeg

我自己的步驟如下:

  1. 前往網站中指的 download site下載。( 我選擇 version 4.2.1、win-64bit、static)
  2. 檔案約64MB左右,解壓縮後,放在常安裝程式的資料夾比較好。例如 C:\Program Files\ffmpeg
  3. 進去解壓縮的資料夾,在 bin 下面該會有一個 ffmpeg.exe 的程式。
  4. 加入環境變數。
    為了要使cmd指令中可以直接使用 ffmpeg 使用上述的exe,因此需要將該 bin 資料夾設定進去。
    本機 → 右鍵:內容 → 進階系統設定 →環境變數: 系統環境變數 → 按Path後點旁邊的編輯 →把exe的資料夾新增進去(此案來說就是C:\Program Files\ffmpeg\bin )
    (環境變數的部分網路上很多資料,不再贅述)

但是按照這樣做了,也重開機,系統還是說「不是內部或外部指令或命令」

一氣之下我乾脆把ffmpeg.exe 複製到我要執行程式的資料夾,解決路徑的問題!! (還真成功了…)

音訊合併

狀況: 有20個左右只有五秒鐘的音檔,想合併成一分鐘的檔案。

  1. 首先使用Python,把資料夾內的檔案抓出來,寫成一個 list.txt
import subprocess
import os
folder = 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()
我的 list.txt 內容長相

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 的方法

這篇我沒用上,但或許值得參考

--

--