2016-01-20 167 views
1

在這裏,我從圖像(8)和音頻(文件大小:307KB)轉換視頻。 但視頻正在播放一個帶有音頻的圖像,而其他則沒有音頻。 在我的知識中:因爲音頻文件的大小非常低。 我想轉換視頻播放所有帶有音頻的圖像。 示例代碼:使用FFMPEG從圖像和音頻文件轉換視頻

$audioPath = 'upload/2016/01/tmp_81332/audio_1453307709.wav'; 
$convAudioPath = 'upload/2016/01/tmp_81332/output.mp3'; 
$ffmpeg = '/usr/bin/ffmpeg'; 

$convImgPath = 'upload/2016/01/tmp_81332/image%d.jpeg'; 
$output = 'upload/2016/01/video_81332_1453307709.mp4'; 

exec("$ffmpeg -i $audioPath -f mp2 $convAudioPath"); 
exec("$ffmpeg -framerate 1/5 -i $convImgPath -i $convAudioPath -c:v libx264 -c:a aac -strict experimental -b:a 16k -shortest $output"); 

然而,這擴展了輸出的視頻文件是音頻文件的長度如果是比視頻更長。如果音頻文件比視頻短,使用-shortest會將視頻文件縮短。那麼是否有一個標誌告訴ffmpeg將輸出視頻的長度保持爲輸入視頻的長度?從wav格式爲mp3

回答

2

音頻轉換不需要你的情況。我們可以用單一命令來完成。通過用-r選項設置輸出視頻幀速率,可以解決只顯示1個圖像的問題。

用下面的替換您2條EXEC語句,它應該工作。

exec("$ffmpeg -framerate 1/5 -i $convImgPath -i $audioPath -c:v libx264 -r 30 -c:a aac -strict experimental -b:a 16k $output"); 

參考:https://trac.ffmpeg.org/wiki/Create%20a%20video%20slideshow%20from%20images

我也曾在以前的命令刪除的-shortest標誌。所以,輸出可以是視頻的長度(如果大於輸入音頻的長度),否則將是音頻的長度。

所以,你可以減少所需的視頻部分從第0秒開始,其中視頻結束到第N的第二。由於您已經知道輸入幀速率(因爲-framerate 1/5標誌,每張圖片顯示5秒)和圖像數量(8),因此可以找出n。

因此,n = 8×5 = 40秒。

所以,總是先ffmpeg的命令之後切割視頻從0到第40秒。這可以通過以下ffmpeg命令來實現。

ffmpeg -i INFILE.mp4 -vcodec copy -acodec copy -ss 00:00:00.000 -t 00:00:40.000 OUTFILE.mp4 

希望這會有所幫助。

+0

我相信OP想要一個可用於多種輸入的模板,其中音頻和視頻的持續時間之間的關係是事先不知道的。你的工作流程需要事後手術。 – Mulvya

+0

@Balaraman L這是很好的解釋和很好的解決方案。但它不適合我。音頻文件再次對於一個圖像僅播放5秒。 –

+0

@RamaLingam我可以知道你在這種情況下使用的音頻的全長嗎?因爲,我在答覆中提供的經理聲明對我來說非常合適。 –

0

使用

exec("$ffmpeg -framerate 1/5 -i $convImgPath -i $audioPath -af apad -c:v libx264 -r 5 -c:a aac -strict experimental -b:a 16k -shortest $output"); 

此墊具有潛在無限長度的空音頻源的音頻,因此,視頻將總是最短輸入。

+0

這不起作用。音頻文件不播放所有圖像。 –

+0

r <2/5似乎x264流有麻煩播放。用min引入r。值爲2/5,但理想情況下爲5或更高。 – Mulvya