2013-03-14 148 views
2

我最近開始了一個網站,用戶可以上傳視頻到上工作,我用的ffmpeg一個初學者,但我一直在尋找,尋找如何做這些事情,我想要做,但是其中大部分都不適合我。FFMPEG用PHP轉換視頻的MP4和快照

我想任何視頻類型轉換爲.mp4和保持質量儘可能的好。現在我的代碼只能用於上傳.mov.mp4,但.avi不能轉換(它甚至不會爲這些文件創建新文件)。

我也想借高畫質截圖從視頻爲好,但現在我得到的截圖似乎真的低質量的,所以我不知道這是怎麼回事這一點。

我現在使用的代碼是這樣的:

$ffmpeg = "/Users/USERNAME/ffmpeg/ffmpeg"; 
$src = "/Applications/MAMP/htdocs/lounge/videos/".$filename."_original.".$ext; 
$img = "/Applications/MAMP/htdocs/lounge/videos/thumbnails/".$filename."_1.jpg"; 
$img2 = "/Applications/MAMP/htdocs/lounge/videos/thumbnails/".$filename."_2.jpg"; 
$img3 = "/Applications/MAMP/htdocs/lounge/videos/thumbnails/".$filename."_3.jpg"; 
$video = "/Applications/MAMP/htdocs/lounge/videos/".$filename.".mp4"; 

$src = preg_replace("/ /", "\ ", $src); 
$img = preg_replace("/ /", "\ ", $img); 

$imgOutput = shell_exec("$ffmpeg -ss 1 -i $src -s 960x540 -f image2 -vframes 1 $img"); 
$imgOutput2 = shell_exec("$ffmpeg -ss 15 -i $src -s 960x540 -f image2 -vframes 1 $img2"); 
$imgOutput3 = shell_exec("$ffmpeg -ss 30 -i $src -s 960x540 -f image2 -vframes 1 $img3"); 

$videoOuput = shell_exec("$ffmpeg -y -i $src 2>&1 -s vga $video"); 

我怎麼能去輸出720p或1080p的視頻?

+0

如果你想要真正高質量的截圖,請刪除.jpg並使用.png – Havenard 2013-03-14 22:12:42

+0

1080p視頻是'-s 1920x1080'和720p視頻是'-s 1280x720' – Havenard 2013-03-14 22:15:24

+0

好的,我確實使用過720p視頻,但它是與原始圖像相比仍然有點像。 – 2013-03-14 22:25:17

回答

4

FFMpeg是一個非常強大的解決方案,但是你需要習慣它的衆多選項來獲得你想要的。

首先,您需要確定哪些軟件/硬件將播放您的視頻。

我這裏假設視頻將要可能使用Flash播放器,或HTML5播放器(JWPlayer既是,例如)在網站上播放。

然後,您需要找到所需質量的最佳視頻和音頻格式。 請注意.mp4只是一個容器,可以包含各種視頻和音頻格式。 FFMpeg足夠智能,可以使用默認的AVC(H.264)用於視頻,而AAC用於音頻,這很好,但可能不會給你完美的結果,除非你指定你想要的比特率或質量。

在繼續下一步之前,請先閱讀這個非常有用的鏈接http://ffmpeg.org/trac/ffmpeg/wiki/x264EncodingGuide

你或許應該使用ABR或CBR模式,如果你想確保predictible網絡吞吐量,或者CRF模式(18至20會給你帶來很大的質量),如果你擔心主要是關於質量。

調整視頻大小本身就是一個複雜的話題。您可能會發現自己遇到了非正方形樣本長寬比的視頻,這意味着該視頻的觀看尺寸與實際的寬度或高度不同,或者您只會嘗試以4:3的比例觀看視頻。調整到16:9的比例,導致變形。

使用-s選項實際上插入了一個scale過濾器,該過濾器默認使用雙線性過濾算法來調整視頻幀的大小。這通常足夠滿足您的需求,但如果您要對視頻執行其他處理步驟,則明確使用過濾器會更有趣。例如:

-vf "scale=-1:720" 

這會強制720像素的高度,但確保輸出比例與輸入比例相同,因此視頻不會變形。

請注意,實際製作較大的視頻並不會提高其質量,反而會增加處理時間以及文件大小。

最後,在對通過HTTP播放的文件進行MP4編碼之後,必須注意一個問題。 MP4文件包含一個稱爲MOOV的原子,它是描述文件內容的數據塊。播放器軟件需要讀取該塊以便能夠開始播放,如果在磁盤上找到該文件,則該問題在本地不是問題,但如果在文件末尾找到該文件,則從HTTP下載時阻止文件播放,因爲在播放開始之前必須下載整個文件。 猜猜看,FFMpeg將MOOV原子置於文件末尾,因此默認情況下它不適合HTTP漸進式播放。

您必須使用類似qt-faststart或MP4Box的工具來修改文件以將MOOV原子置於開頭。

1

你試過-preset veryslow -qp 0?請閱讀SirDarius的'suggested link作爲無損H.264最佳壓縮的預設。