2009-10-11

osTube_v2.5---youtube-HD-AVC格式的抓圖

最近常在看韓國的少女時代(Jessica正又酷)…上youtube抓檔然後再丟上ostube時發現,常常有縮圖無法製作的問題…所以得上傳完flv之後再自己丟縮圖

因為我是flv to flv,按理來說,應該全部的flv在我上傳之後都會抓不到圖才對,但我發現,並非如此。

後來經getid3來查,發現,flv的video-codec會影響ostube抓圖

在youtube的HQ,HD的影片是使用H.264/X.264/AVC的編碼,而ostube的convert中的抓圖是用mencoder,預設使用的vcodec是用ffvhuff,大多數的flv的確是使用flv/ffvhuff就可以編碼,但這跟youtube-HQ,HD不符,所以mencoder會產生錯誤,而目前我是沒發現mencoder是不是可以支援h.264/x.264/avc(好像要特別重新編譯mplayer把x264丟進去)

所以,我後來就想把這種特有的flv給用ffmpeg來做抓圖(因為flv to flv,在ostube很正常,不用特別把轉檔也改用ffmpeg)

====以下是step======


ffmpeg官網來抓最新的版本(因為我fc8用yum裝的ffmpeg在格式支援上很有問題)

然後把tar.bz2解開(tar jxvf name.tar.bz2),接著就直接configure/make/make install

再來就是修改ostube-convert.php

====以下是step====


先把利用getid3來寫一個function來判斷flv檔是一般vcodec還是h.264/x.264/avc的vcodec
一般的flv在flv['video']中會有codec的屬性,且會是空白

而hd/hq的flv['video']中不會有codec的屬性
上面的就是判斷依據,當然,這樣判斷很粗略,但可以應付一下

再來就是使用ffmpeg來抓圖
if(noFLV_codec($sourcefile)){
$ffmpeg_cmd[] = "/usr/bin/ffmpeg -i " . $sourcefile . " -y -f image2 -ss 8 -t 0.001 -s 50x40 /var/www/html/feuOSB/media/thumbs/50/" . $mid . ".jpg";
$ffmpeg_cmd[] = "/usr/bin/ffmpeg -i " . $sourcefile . " -y -f image2 -ss 8 -t 0.001 -s 160x120 /var/www/html/feuOSB/media/thumbs/160/" . $mid . ".jpg";
$ffmpeg_cmd[] = "/usr/bin/ffmpeg -i " . $sourcefile . " -y -f image2 -ss 8 -t 0.001 -s 320x240 /var/www/html/feuOSB/media/thumbs/320/" . $mid . ".jpg";
$ffmpeg_cmd[] = "/usr/bin/ffmpeg -i " . $sourcefile . " -y -f image2 -ss 8 -t 0.001 -s 640x480 /var/www/html/feuOSB/media/thumbs/screenshots/" . $mid . ".jpg";
$ffmpeg_cmd[] = "/usr/bin/ffmpeg -i " . $sourcefile . " -y -f image2 -ss 8 -t 0.001 -s 600x333 /var/www/html/feuOSB/media/thumbs/screenshots/" . $mid . "_thumbs.jpg";
}else{
$cmd = $main->getConfig("encoder_binary") . " " .
$sourcefile . " -o " . $screenshotVideo . " " .
"-ovc lavc -lavcopts vcodec=ffvhuff -nosound -endpos 5";
}
//為了一些使用h264-avc編碼的flv檔,所以要判斷一下,否則avc編碼的video無法抓圖,所以註解下面的cmd,改用上面的
//$cmd = $main->getConfig("encoder_binary") . " " .
//$sourcefile . " -o " . $screenshotVideo . " " .
// "-ovc lavc -lavcopts vcodec=ffvhuff -nosound -endpos 5";
//因為ostube抓圖方式比較固定,所以改用ffmpeg之後得自己讓他抓50x50,160x120,320x240,thumbs的,所以改用以下的方式…
if(isset($ffmpeg_cmd)){
for($i=0; $i<count($ffmpeg_cmd); $i++){
$log_cmd[] = $ffmpeg_cmd[$i];
$info = system($ffmpeg_cmd[$i]);
}
}else{
$log_cmd[] = $cmd;
$info = system($cmd);
}
這是在放convert.php之中,取代掉原先的抓圖,順便放入log看一下

4 則留言:

Unknown 提到...

對 mencoder 和 ffmepg 不熟,我想請問一下大大

我用 mencoder 轉 flv , 影片都變快轉,原本 42 s 的,變成 9 s 就播完了....

mencoder 3.wmv -o outfile.flv -of lavf -nosound -ovc lavc -lavcopts vcodec=flv:vbitrate=150

是我要加什麼額外的設定嗎 @@?

另外我轉 libx264 的格式出來,想給 ffmpeg 截圖,但一直有問題
發生在 mms2 轉出來後的檔案 , 可以播,但 ffmpeg 都沒有法子截圖...

只看到能截的好像都有 yuv420p 這字出現,而不能給 ffmpeg 的檔案都沒有 yuv420p

還是可以指點一下該去那邊找相關的資料,或是發問嗎

死狐狸 提到...

基本上,畫面的快轉結束,應該跟fps有關
建議你可以多用一個參數[ -fps number ]加在你的code裡面…

number就是填入你每秒多少畫格,但我是建議,你最好先注意你source檔的fps是多少,而不要超過是最好

至於抓圖嘛,這有可能跟你ffmpeg支援的有關…一般我們用ffmpeg抓會是用image2的type…

至於有沒有相關的資料,基本上,我有問題都是自己google爬出來的…也很少在論壇去問(因為我懶的等人回)

至於你說yuv420p的才能抓,ffmpeg支援並沒有說「只」支援yuv420p,我是建議你可能要自己寫個抓圖的code會比較好…

就像ostube,就是因為他抓圖與轉檔的方式並不符合通用,所以我就會自己去改

Unknown 提到...

嗯,好的,謝謝您提供的意見

後來我是直接用 ffmpeg 去轉 flv
好像就沒有問題了

而 yuv420p 其實我也不太知道這是什麼

不過我指的並不是只有 yuv420p 的才能截
而是我給 mencoder 轉 h264 出來的

同樣的指令轉檔出來的,卻有的能截圖有的不能截圖,而看來看去我只看到 yuv420p 的差異

總之還是謝謝意您的意見 XD

死狐狸 提到...

不必客氣…
不過我個建議,如果在mencoder與ffmpeg來轉flv做選擇的話,我是會選ffmpeg的…

至於你抓圖的問題嘛,我個人是認為在h.264的編碼上…