2008-12-30

osTube2.3--上傳檔案時加上自行設定轉檔時的bit_rate與fps

今天來玩弄的就是會很傷眼的東西…

先介紹一下…
1.what is bit rate?
簡單的說咧,就是我們所謂的畫質啦。只不過,詳細的說,它的主名是叫做「影像位元速率」。想要再仔細的說嗎?…請看wiki-比特率

2.what is fps?
這不懂的人,就差勁了。中譯為「每秒多少張影格數」,簡單的說,就是你看電影或動畫時,那一秒鐘的時間內,會有幾個畫格在播放。學過資料或媒體的人,應該知道正常人數可以接受的高清析的格數約在24~26,再高一下頂多到30,超過30的,就會對眼睛帶來壓力。反之,小於20的,敏感一些的人就會感覺到影像在閃,再低下去就會覺得影像好像一格一格在跳動。

在osTube的預設媒體(video)的上述二個,若不特別設定的話,會是底下三種(快速/普通/品質)轉檔設定的預設值:

fast(快速)
-ofps 25 -of lavf -oac mp3lame -lameopts abr:br=56 -srate 22050 -ovc lavc -lavcopts vcodec=flv:vbitrate=300:trell:v4mv -vf scale=

normal(普通/標準)
-ofps 25 -of lavf -oac mp3lame -lameopts abr:br=56 -srate 22050 -ovc lavc -lavcopts vcodec=flv:vbitrate=400:trell:v4mv:cbp:last_pred=3 -vf scale=

quality(品質)
-ofps 25 -oac mp3lame -of lavf -srate 22050 -ovc lavc -lavcopts vcodec=flv:keyint=50:vbitrate=600:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -vf scale=

在上面看到的vbitrate就是bit_rate,ofps就是fps…由此可見,bit_rate愈高會代表畫質愈好。但切記,來源檔本來的bit_rate就不高的情況下,轉檔時再把bit_rate設的再高,也不會把檔變的多好,只是徒增size而已。

然後,先進入osTube的mysql-db,找到osTube_media,這一個資料表是存放上傳的那一些檔案的索引細項。因為底下的convert會抓這table中的東西出來用,所以,把轉檔時要用的bit_rate與fps放在這裡最好。請在此資料表中,新增二個欄位[media_rate]與[media_fps](我自己用的),請用vchat[10],預設值設600與25

接著,我要開始著手動底下幾個檔案:
1.安裝目錄/languages/zh-TW.ini(就是中文語系檔…其他語系可以自己加)
--找到[upload]的區塊,加上下面的
--upload_rate = '影像位元速率:'
--upload_rate_desc = '預設值為600,若不填值或輸入超過960或非數字等將設定600'
--upload_fps = '每秒影格數:'
--upload_fps_desc = '預設值為25,若不填值或輸入超過30或非數字等將設定25'

2.安裝目錄/languages/admin.ini(後台的語系檔)
找到[admin_media],加上下面的
admin_media_rate = '影像位元速率'
admin_media_fps = '每秒影格數'

2.安裝目錄/admin/moduls/media.php(後台中的媒體,但我只要動項目中的編輯)
找到約362行[$adminarea -> addFormField($tablegen, "text", $language["admin_media_tags"], "media_tags");]
在此行的下一行加上以下的二個
$tablegen->line($language['admin_media_rate'],$all["media_rate"]);
$tablegen->line($language['admin_media_fps'],$all["media_fps"]);
我不用$adminarea->addFormField是因為轉檔只會在上傳後動作,所以,用了addFormField就沒意思了,所以,當做單純的檢視就好了。

以上二個設定好,你就可以後台的媒體,然後找隨便一個媒體進入它的編輯,就可以看到了。但是,就是每一種的媒體都會有預設的bit_rate與fps,因為我架的osTube只想用在video,所以,就懶的改了,若是想要特別的把video與其他的分開,目前可以提示要在安裝目錄/upload.php裡面做,但等有真的必要再說吧。

3.安裝目錄/upload.php
找約125行[$media_tags = requestGPCVar('upload_media_tags', '', 'P');]
--在下一行加上
--$media_rate = requestGPCVar('upload_rate','','P');
--$media_fps = requestGPCVar('upload_fps','','P');
找約15x行[if ($media_title && $media_description && ($numMediaChannels > 0))]
--在if的block中的$arrNewMedia = array中加上
--'upload_rate' => $media_rate,
--'upload_fps' => $media_fps,
找約24x行[$smarty -> assign("UPLOAD_MEDIATAGS", $form -> inputText("upload_media_tags", $media_tags, 52, 255));]
--在底下加上
--$smarty -> assign("UPLOAD_RATE", $form -> inputText("upload_rate", $media_rate, 3, 10));
--$smarty -> assign("UPLOAD_FPS", $form -> inputText("upload_fps", $media_fps, 3, 10));
找約39x行[$arr["media_extention"] = $fileFormat;]
--底下加上
--$arr["media_rate"] = check_int_val($arrNewMedia["upload_rate"],"0");
--$arr["media_fps"] = check_int_val($arrNewMedia["upload_fps"],"1");
--跳到upload.php的最後,加上底下的東西
function check_int_val($st,$t){
if(is_numeric($st)==false || $st==false || $st==""){
$st=check_rate_or_fps($t);
return $st;
}else if(is_numeric($st)){
if(intval($st)==0){
$st=check_rate_or_fps($t);
return $st;
}else{
switch($t){
case "0":
if(intval($st)>960) $st=600;
break;
case "1":
if(intval($st)>30) $st=25;
break;
}
return $st;
}
}
}
function check_rate_or_fps($t){
switch($t){
case "0"://rate
$st=600;
break;
case "1"://fps
$st=25;
break;
}
return $st;
}
找約52x行[$dbconn -> easyInput("media", array("media_conversion_info" => "flv", "media_extention" => $fileFormat), "media_id = '".$mid."'");]
--改成[$dbconn -> easyInput("media", array("media_conversion_info" => "flv", "media_extention" => $fileFormat, "media_rate" => "flv", "media_fps" => "flv"), "media_id = '".$mid."'");]
--(因為flv不用再轉,所以,把rate與fps填上flv,這就為什麼資料庫中的[media_rate]與[media_fps]我要用vchat(10)的原因)

4.安裝目錄/templates/default/content/upload.tpl
--找約39行[<p><label for="upload_media_description" id="l-description">{#upload_media_description#}</label> {$UPLOAD_MEDIADESCRIPTION}</p>]
--在底下加上
--<p><label for="upload_media_rate" id="l-rate">{#upload_rate#}</label>{$UPLOAD_RATE}{#upload_rate_desc#}</p>
--<p><label for="upload_media_fps" id="l-fps">{#upload_fps#}</label>{$UPLOAD_FPS}{#upload_fps_desc#}</p>
--大括號的寫法,是php-document的用法,#字包住的,是zh-TW.ini的,$字是upload.php中設定的…大小寫應該也是有關係的。

5.安裝目錄/convert.php
--可以找到之前我們特別為rmvb或mov/mp4/avi的轉檔的部份,在-ofps 25的地方,改成用-ofps $mediaData['media_fps'];在vbitrate 600的改成vbitrate $mediaData['media_rate']。

基本上,這樣子之後,就差不多ok了,你可以改回converstion.log每一次動作都記錄的程式,然後看看是否會照著轉。

最後,若是怕麻煩的人,其實在convert.php中也不用特別加上不同類型的轉檔分別,只要找[switch($main->getConfig("video_conversion_type"))]這邊,這邊就是你設定轉檔時要快速/一般/品質的使用轉碼指定的地方。
你可以在這邊特別寫自己用的一種。
我自己發現的一個基本轉碼
$conversionString = '-of lavf -oac mp3lame -lameopts abr:br=56 -srate 44100 -ovc lavc -lavcopts vcodec=flv:vbitrate='.$mediaData['media_rate'].':mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -ofps '.$mediaData['media_fps'].' -vf harddup,scale=';

這個指令的碼,在預設值media_rate=600/media_fps=25的條件下,轉出來的檔可是比osTube給的品質還好。只不過,在某一些高清畫質下的影片,照用我給的碼來轉,還是會遇上音與影不同步的狀況,所以,我才會特發這帖,設定成在上傳時就讓使用者自訂修改。不過,也是使用者自己要知道這東西才好用。

沒有留言: