題 將一個圖像+一個音頻文件組合使用FFmpeg製作一個視頻


這應該是微不足道的,但我找不到讓它工作的方法。

我希望FFmpeg將一個JPEG圖像和一個音頻文件作為輸入,並生成與音頻文件具有相同持續時間的視頻文件(通過在整個持續時間內拉伸靜止圖像)。

我不太關心用於輸出的視頻編解碼器,但是我可以使用“複製”作為音頻編解碼器(即復制音頻流而不對其進行轉碼)至關重要。

什麼是正確的命令行呢?

我試過了:

ffmpeg -i image8.jpg -i sound11.amr -acodec copy test.avi

並嘗試了很多有和沒有的組合 -s 640x360-loop_input-shortest-t xxx-r 0.1 (人為的低幀速率,希望視頻會更長)和 -f image2

要么我得到錯誤,要么得到一幀持續時間的視頻文件。

我已經google了一下,發現了十幾個建議的解決方案(據說這個同樣的問題)沒有一個可行。

任何人都可以提出工作指令並解釋其背後的基本原理嗎?


158
2018-05-04 17:19


起源


我剛試過你的命令行,它按預期工作。您的問題可能在於聲音格式。轉碼聲音是否有效? - Captain Giraffe
“按預期”,你的意思是結果視頻的持續時間與音頻輸入相同嗎?你玩過嗎?不是一幀長嗎? - matteo
聲音格式不是問題,轉錄聲音的工作原理 - matteo
我也有一個params問題的訂單,它花了我幾個小時!太糟糕了,幫助中沒有涵蓋這些問題。 gregoire.org/2009/12/05/fun-with-ffmpeg - Paul Gregoire
這比選擇的答案更好,我進行了實驗,速度快,文件大小小..ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi - Muhammad Umer


答案:


命令行中的選項順序很重要。以下適用於我的案例:

ffmpeg -loop 1 -y -i image8.jpg -i sound11.amr -shortest -acodec copy -vcodec mjpeg result.avi

在更一般的情況下,在哪裡 image.jpg 和 audio.wav 是您的輸入,您可以使用以下命令,改編自 FFmpeg維基

ffmpeg -loop 1 -i image.jpg -i audio.wav -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -shortest out.mp4

這將使用 libx264 編碼器,為您提供比上面使用的MJPEG編解碼器更好的壓縮。音頻是AAC,內置 ffmpeg AAC編碼器。


121
2017-12-16 14:21



為什麼文件最終比[圖像大小] + [音頻文件大小]大得多?我希望視頻壓縮會在一個恆定的幀中變得瘋狂嗎? - Alec Jacobson
這取決於您使用的視頻編解碼器。如果你在我的例子中復制命令,我使用mjpeg作為編解碼器,它分別壓縮每個幀,所以它沒有利用所有幀都相等的事實。此外,我認為即使是其他編解碼器也會偶爾重新編碼整個幀,即每隔一個N幀,所以你會得到一個小得多的文件,但仍然比圖像+聲音的大小大得多。他們這樣做是因為(a)否則解碼器需要從頭開始讀取整個文件,即使你只想跳到最後一幀, - matteo
Option shortest (finish encoding within shortest input) cannot be applied to input file image.jpg -- you are trying to apply an input option to an output file or vice versa. Move this option before the file it belongs to. - wim
使用 ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi 這樣效果更好!!!?!??!?! - Muhammad Umer
目前正在回答這個問題 討論 在元。 - DavidPostill♦


你正在製作它 辦法 更難 比它必須的。 FFmpeg比你給它的功能要聰明得多 - 它知道你希望視頻的長度與你的音軌相同。

ffmpeg -i still.png -i narrate.wav -acodec libvo_aacenc -vcodec libx264 final.flv

pause

唯一的屬性 您  指定是 input filenamesoutput codecs,和 output filename (哪一個 eo ipso 包括 output container,)。

當然, 從與最終視頻共享相同尺寸的靜止圖像開始是有意義的;如果您使用專用的圖像編輯器而不是指定FFmpeg的輸出尺寸,則需要 確保您的輸入尺寸為偶數

輸出大小是 FFmpeg最常見的一個問題;某些編解碼器的輸出維度比其他編解碼器更受限制,但是 沒有輸出可以具有奇數高度或寬度屬性。

pause 命令 在批處理文件的末尾保持CLI打開 - 調試命令行的最佳方法是閱讀錯誤消息 它會產生。它們非常具體 - 而且是FFmpeg最好的文檔 - 但是如果你允許窗口關閉之前開發人員的辛苦工作就會被浪費掉。

命令shell 有一個開關 cmd /k 維護一個打開的窗口,您可以在命令提示符處從批處理腳本運行相同的指令。

FFmpeg的 和 avconv 會讓你使用 -c:a對於 -acodec 和 -c:v對於 -vcodec 最終,但舊指令在我使用的構建中工作正常。

Nota Bene: 每個提交都有特殊性。如果你的命令行沒有明顯的原因失敗,那麼嘗試另一個構建通常會很有幫助 - 或者按照分支來實現 libav,FFmpeg最活躍的開發人員在過去幾年裡一直在這裡。他們的轉碼工具已重命名 avconv 但是你的批處理文件應該可以使用其中一個。


35
2018-05-26 02:09



我必須使用與你不同的版本(如果你已經嘗試過你的命令並且按照你的描述工作),因為正如我在問題中已經提到的那樣,我已經嘗試了完全相同的命令,並且我得到了持續時間的視頻1幀(幾分之一秒),而不是音頻文件的持續時間。我確實希望它是聰明的,但(在我的版本中)事實證明它不是。 - matteo
嘿馬特奧,是的,我確實執行了該代碼,是的,它的工作方式與廣告一樣。我確定有很多半智能會如此粗心,以至於在沒有測試它們的情況下做出這樣的聲明,所以我會盡量不被冒犯:)在下面的完整帖子中,我將提供到FFmpeg控制台輸出和MediaInfo的Pastebin鏈接輸入文件和最終輸出文件的數據。我的輸入文件,我的批處理文件,輸出文件都在GoogleDrive上 可免費下載,如果你想針對你的FFmpeg版本測試它們。
@ShinMuraoka Mine is a win-64 ffmpeg build compiled on: Jan 6 2013, at: 16:16:53 您的解決方案和@matteo解決方案都不適合我。此外,我從Google雲端硬盤下載了您的文件,但它未提供預期的輸出(輸出文件僅包含音頻的黑色)。請幫我弄清楚要使用的正確命令。 - coding_idiot
“沒有輸出可以具有奇數高度或寬度屬性”不正確。將pix_fmt設置為沒有色度子採樣的東西,如rgb24或yuv444p,然後確保編解碼器和容器支持它並且沒有進一步的限制。關於pix_fmt,FFmpeg小於智能;它假定yuv420p(具有色度子採樣),除非你另有說明。 - Jonathan Baldwin
多個圖像怎麼樣?我需要圖像在某個特定時間更改為另一個圖像。我希望能夠在命令行中指定它們,並為每個參數指定時間參數。


更容易:

ffmpeg -i ep1.png -i ep1.wav ep1.flv

FFmpeg將嘗試自動選擇最佳編解碼器,具體取決於輸出文件的擴展名。

更新:我注意到YouTube處理視頻有困難(卡在95%)我認為因為只有一幀。我發現讓YouTube開心的解決方案:添加更多幀。另外,我補充道-acodec copy 保持音質。你需要 -shortest 或者它永遠循環。 (它在最短流的末尾停止,這是音頻,因為圖像循環是無限的。)選項的順序對於速度非常重要,因為過濾器(等等)按照您指定的順序處理。 如果更改這些參數的順序,結果會有很大差異。 

ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:720 ep1.flv

還要注意我將幀速率設置兩次,這不是偶然的 - 第一幀速率用於輸入,第二幀速率用於輸出。如果你這樣做的話,每秒只應該有一幀視頻,這意味著它的編碼速度相對較快。此外,我將分辨率設置為720p,這意味著你應該在YouTube上獲得高清音頻:-)


29
2018-01-28 20:16



此外,您的音頻文件可能與.flv容器不兼容。在這種情況下,您應該嘗試使用不同的(輸出)容器,如.webm,.avi或任何格式,直到找到與您的音頻文件兼容的容器格式。 - PJ Brunet
用於製作MP4的.JPG和.MP3 - 完美運行。我從JPG / MP3創建的FLV似乎不起作用 - 這可能與先前的評論警告一樣。
更新版本適用於Youtube。我認為它停留在95%,但最終它有效。 - Basj
明白啦: No pixel format specified, yuvj420p for H.264 encoding chosen. Use -pix_fmt yuv420p for compatibility with outdated media players. [libx264 @ 0x2b5c940] height not divisible by 2 (700x457) ......這有效: ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:-2 video.mp4 - NineCattoRules
多個圖像怎麼樣?我需要圖像在某個特定時間更改為另一個圖像。我希望能夠在命令行中指定它們,並為每個參數指定時間參數。


對我有用的版本:

 ffmpeg -loop 1 -y -i pic.jpg -i sound.amr -shortest video.mp4

檢查選項 -shortest 必須在輸出文件的前面,如果不是我得到以下錯誤:

選項最短(在最短輸入內完成編碼)無法應用於輸入文件pic.jpg - 您正在嘗試將輸入選項應用於輸出文件,反之亦然。在其所屬的文件之前移動此選項。 解析輸入文件pic.jpg的選項時出錯。


14
2018-05-22 00:40



謝謝你。大多數其他答案對我沒有用(在Alpine linux上使用ffmpeg)。這個答案有最短的命令,對我來說完美無缺。 - DannyB


從ffmpeg手冊頁:

ffmpeg [[infile options][-i infile]]... {[outfile options] outfile}...

正如您所發現的那樣,infile選項必須在它們應用的infile之前。

但這不是一個錯誤,只是一種機制,您可以通過該機制指定適用的infile參數。


8
2018-04-15 22:15



多個圖像怎麼樣?我需要圖像在某個特定時間更改為另一個圖像。我希望能夠在命令行中指定它們,並為每個參數指定時間參數。


這對我有用

ffmpeg -loop 1 -shortest -y -i image.jpg -i audio.mp3 -acodec copy -vcodec libx264 video.avi

我找到了vcodec libx264 創建了比...更小的文件 mpjeg (10 MB而不是100 MB)。


4
2017-09-18 11:44



-shortest 是一個輸出選項,可以在使用時將其作為輸入選項忽略。 - LordNeckbeard


我試圖這樣做 @matteo,但沒有音頻,和 @Colonel恐慌的解決方案效果最好:

ffmpeg -loop 1 -shortest -y -i still.png -vcodec libx264 -t 10 video.avi

我只需要在幾秒鐘內添加持續時間參數(-t 10)。


1
2017-07-22 12:15



-shortest 是輸出選項,但您將其用作輸入選項。在輸出文件之前移動它,你可以消除 -t 10,但那麼你的回答將與其他回答幾乎相同。 - LordNeckbeard