題 如何使用FFmpeg從圖像創建視頻?


是否可以使用 ffmpeg 從一組序列創建視頻,其中數字不是從零開始?

例如,我有一些圖像[test_100.jpg,test_101.jpg,test_102.jpg,...,test_200.jpg],我想將它們轉換為視頻。我嘗試了以下命令,但它沒有工作(似乎數字應該從零開始):

ffmpeg -i test_%d.jpg -vcodec mpeg4 test.avi

有什麼建議嗎?


82
2018-05-13 17:58


起源


你問這個問題已經有一段時間了,但是如果你仍然對這個問題感興趣,那麼答案是肯定的 - 我已經發布了以下詳細信息和示例: stackoverflow.com/a/12160155/181638 - Assad Ebrahim
@casperOne將有助於了解為什麼這不是主題。這似乎是一個特定的編程問題。 FFmpeg標籤有3.7k粉絲,有27k的視圖顯然人們發現它很有用.. - geotheory
@geotheory標籤統計數據無關緊要。 ffmpeg是一個 程序 更像是WinRar。雖然你可以編程反對 圖書館 在 ffmpeg的,這個問題與此無關。將詢問是否在命令行中使用ffmpeg 超級用戶,它是關於主題的。 - casperOne


答案:


如果使用,則無需重命名文件 -start_number 這樣切換:

ffmpeg -start_number n -i test_%d.jpg -vcodec mpeg4 test.avi

哪裡 n 是劇照序列的開始。

請注意,只要序列一旦啟動就不會中斷,這將起作用。如果存在間隙並且您希望包含所有靜止圖像,則可能需要重新編號以填補空白。

您可能會發現其他一些開關很有用。

我使用以下一個襯墊來獲得較慢的幀速率並壓縮圖像並獲得較小的結果視頻:

ffmpeg.exe -f image2 -framerate 25 -pattern_type sequence -start_number 1234 
        -r 3 -i Imgp%04d.jpg -s 720x480 test.avi

-r 3 選項將結果視頻的幀速率設置為每秒3幀,這樣我可以在短時間內看到每個幀的幀速率。該 -s 選項將圖片重新縮放到所需的分辨率,以管理生成的視頻的大小。

(在Windows shell中,替換 -i Imgp%04d.jpg 同 -i "Imgp%%04d.jpg"。相信Mike Fitzpatrick https://superuser.com/a/344178/153054


72
2017-08-28 13:19



-r和-framerate之間有什麼區別?
他們是同一個IIRC - rogerdpack
不需要編號胡說八道,只要你很樂意接受他們出現的順序(比如說)'ls'......只需使用:ffmpeg -pattern_type glob -i'* .jpg'movie.mp4 - Orwellophile
有沒有開關來控制 時間 圖像之間的差距,比方說,我想顯示第一個圖像13s,第二個15s,第三個24s,時間差是用戶定義的,這可能嗎? - zionpi
也可以看看 trac.ffmpeg.org/wiki/... - d3vid


你可以使用下面的代碼片段:

 cat *.jpg | ffmpeg -f image2pipe -r 1 -vcodec mjpeg -i - -vcodec libx264 out.mp4

34
2017-11-08 14:33



這不會將JPG旋轉到元數據中指定的旋轉。 - Erik Johansson


您可以在中找到示例腳本 ffmpeg文檔

3.2如何將單張圖片編碼為電影?

如果要重命名大量圖片,可以使用以下命令來減輕負擔。該命令使用bourne shell語法,將當前目錄中與* jpg匹配的所有文件符號鏈接到 /tmp' directory in the sequence ofimg001.jpg',`img002.jpg'等等。

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done

然後運行:

ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg

17
2017-07-18 17:02



你最好讓x = 0開始,所以圖像名稱的開始是img000.jpg,因為這是ffmpeg所期望的。 symlinking對我來說也不起作用,因為ffmpeg無法找到文件所以我不得不使用cp代替(明顯的速度和空間縮回但是無論如何我仍然使用它們)。如果你不介意丟失原件,mv也會工作。
請注意,在此答案中,提供的命令會創建硬鏈接,而不是符號鏈接。關於使用 cp 如果鏈接不起作用,如果您的文件系統支持它 cp --reflink=auto 將實現更好的速度/空間使用。 - Félix Saparelli


據我所知,你不能用隨機數開始序列(我不記得你應該在0或1開始),而且,它不能有間隙,如果是,ffmpeg將假設序列結束了停止添加更多圖像。

另外,正如我的回答評論中所述,請記住您需要指定索引的寬度。喜歡:

圖像%03d.jpg

如果您使用%03d索引類型,則需要將文件名填充為0,如:

image001.jpg image002.jpg image003.jpg

等等


11
2018-05-13 18:15



如果圖像文件名具有前導零,則格式字符串還必須指定寬度,如“%03d”。
如果這是唯一的障礙,您可以編寫一個腳本,將圖像重命名或符號鏈接到正確重新編制索引的集合。 - Cascabel
是的,之前我已經使用過這個,之前我在Ruby中編寫了一個包裝器,你調用了instance.addImage(),然後是instance.processVideo(),它會創建一個臨時目錄,用適當的索引複製/重命名圖像並創建視頻。這很容易。
@Jefromi我創建了一個符號鏈接,但是如何將符號鏈接文件的路徑提供給ffmpeg?它只是假設符號鏈接文件是我試圖轉換的圖像?我順便打win7順便說一句
序列可以從0到4開始,包括0和4。 - Assad Ebrahim


ffmpeg的文檔:

使用glob模式

ffmpeg還支持bash樣式的globbing(*代表任意數量的任何字符)。

如果您的圖像是連續的但不一定按照前面示例中的數字順序排列,則此功能非常有用。

ffmpeg -r 1 -pattern_type glob -i 'test_*.jpg' -c:v libx264 out.mp4

所以,只要你的文件被排序,使用 -pattern_type glob 開關應該適合你。


10
2017-07-13 07:11



請注意,此glob比常規shell glob更受限制: trac.ffmpeg.org/ticket/3620 顯然是因為圖像類型是從擴展中推斷出來的。 - Ciro Santilli 新疆改造中心 六四事件 法轮功


我同意弗朗西斯科,但作為一種解決方法,您可以編寫一個快速腳本來移動或創建具有ffmpeg所需序列號的文件的符號鏈接。然後,腳本可以調用ffmpeg,然後刪除鏈接或將文件移回其原始位置。


5
2018-05-13 18:23





抬頭

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i"
/tmp/img"$counter".jpg; x=$(($x+1)); done

1
2017-08-14 21:09





我使用了flv編碼器,因為我的視頻是在flash播放器中播放的(Jwplayer)

ffmpeg -i%d.jpg -vcodec flv test.flv


0
2017-11-11 18:04