FFprobe
ファイルの情報を取得するにはFFprobeを利用します。基本的な構文は、
ffprobe -hide_banner town.flac
以下のような出力が得られます。
$ ffprobe -hide_banner town.flac Input #0, flac, from 'town.flac': Metadata: ENCODER : FL Studio Duration: 00:01:20.00, start: 0.000000, bitrate: 690 kb/s Stream #0:0: Audio: flac, 44100 Hz, stereo, s16
ここから必要な情報を抜き出します。
曲の長さを取得
FFprobeのコマンドより、
exec('ffprobe -hide_banner town.flac </dev/null 2>&1',$contentAry,$error);
出力が配列として$contentAry
に格納されるので、これを1つの文字列として展開するためにimplode()
を用います。
$content = implode($contentAry);
これにより、目的の文字列を取り出します。
preg_match('/Duration: (.*),/',$content,$duration);
取得した文字列を以下のように秒数に変換します。
function getSec($str){
$sec = 0;
foreach(explode(':',$str) as $key=>$value){
if($key!==2) $value *= $key===1? 60:3600;
$sec += $value;
}
return $sec;
}
explode()
は第1引数で指定した文字列を区切りとして、第2引数の文字列を配列で返します。上記の例であれば、$str
を'00:01:20.00'
とすると、
Array ( [0] => 00 [1] => 01 [2] => 20.00 )
この配列のインデックスを$key
、それに対応する値を$value
として順番に取り出し、時と分の単位を秒にし、その合計を返します。
$durTotalSec = getSec($duration); //80
最後に、これらとは別に、曲の長さを取得するのに、wikiで紹介されている方法もあるので、以下に引用します。
$ ffprobe -v error -select_streams v:0 -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 town.flac 80.000000
URL: sac.ringil-music.com
環境: さくらのVPS・Centos7・Nginx・PHP-FPM