2012-08-22

CODE - php 使用 MediaInfo Parsing 影片遇到問題

參考「LINUX - MediaInfo 使用筆記」這篇,
在實際 parsing 影片時碰到 width, height 的顯示格式問題

在預想的狀況下, 以 mediainfo 取出的 video width & height 會是下面的格式
width     => 480
height    => 272
frameRate => 29.970

但在某些影片會變成
width     => 480 / 480
height    => 272 / 272
frameRate => 29.970 / 29.970

這樣會因為格式不同造成後續 ffmpeg cmd 的錯誤;
這時可由 php 的 intval() / floatval() 來解決 (php 真是有夠好用)

完整的 code 如下
# mediainfo audio parse cmd
$cmda = "/usr/bin/mediainfo --Inform='Audio;%Format%\n%Channel(s)%' $filePath";

# mediainfo video parse cmd
$cmdv = "/usr/bin/mediainfo --Inform='Video;%Format%\n%Width%\n%Height%\n%Duration%\n%DisplayAspectRatio/String%\n%Rotation%\n%FrameRate%\n%ScanType%' $filePath";

exec($cmda, $outputa, $retvala);
if ($retvala===0) {
    $result['AUDIO_STREAM'] = $outputa[0]!=null ? '1' : null;
    $result['AUDIO_CHANNELS'] = $outputa[1];
}
exec($cmdv, $outputv, $retvalv);
if ($retvalv===0) {
    # mediainfo parsing Video;Width,Height,FrameRate 時, 有些影音的值會是
    # width:480 / 480, height:272 / 272, frameRate:29.970 / 29.970, 這樣會造成後續的判斷錯誤
    # 故加上 intval()/floatval() 只取 int/float 的部份, 如此會改回 
    # width:480, height:272, frameRate:29.970, 以讓後續的處理正常
    $result['VIDEO_STREAM'] = $outputv[0]!=null ? '1' : null;
    $result['VIDEO_WIDTH'] = intval($outputv[1]);
    $result['VIDEO_HEIGHT'] = intval($outputv[2]);
    $result['VIDEO_DURATION'] = $outputv[3];
    $result['VIDEO_DAR'] = $outputv[4];
    $result['VIDEO_ROTATION'] = $outputv[5];
    $result['VIDEO_FRAMERATE'] = floatval($outputv[6]);
    $result['VIDEO_SCANTYPE'] = $outputv[7];
}


沒有留言:

張貼留言