MPlayer を使って動画ファイルの情報を表示する

これ、ホントは "YouTube に高音質でアップロードできる動画ファイルを作るシェル・スクリプト (改良 MEncoder 版) - だらりな。" の一部を改良しただけなのだけど、awk の使いかたがちょっとわかってうれしかったので、ムダにメモしておく。

mplayer -vo null -ao null -frames 0 -identify "$1" 2> /dev/null | awk '/^=+$/ { exit; } /^ID_/ { print; }'

MPlayer の出力から単純に ID_ ではじまる行を grep すると、音声デコーダの出力が入っちゃって、これがよくまちがった音声ビットレートを出力してくれるものだから (もともとおかしい音声ストリームのヘッダ情報をすなおに出力したりしてるだけなのかもしれないけど)、この部分を省きたいなと思ってたのだった。
欲しい情報といらない情報の間に "=" が 74 個ってだけの行があるので、これ以後を捨てればいいのだけど、どうすればシンプルにできるのかがわからなくて調べてたら、awk でやればいいとわかった。
実際には、音声と映像を合わせたビットレートを知りたいと思ったので、それも計算して出力するシェル・スクリプトにして使ってる。

#! /bin/sh

mplayer -vo null -ao null -frames 0 -identify "$1" 2> /dev/null | awk '/^=+$/ { exit; } /^ID_/ { print; }'

eval `mplayer -vo null -ao null -frames 0 -identify "$1" 2> /dev/null | awk '/^=+$/ { exit; } /^ID_LENGTH/ { print; }'`
OUTPUT_FILE_SIZE=`ls -l "$1" | awk '{print $5;}'`
echo "TOTAL_BITRATE: `echo ${OUTPUT_FILE_SIZE} ${ID_LENGTH} | awk '{ print ( $1 * 8 / $2 / 1000 ); }'` kbps"

exit 0

出力はこんな感じ。

$ mplayer-identify.sh "Yoyodyne - 07. Bright World.flv" 
ID_VIDEO_ID=0
ID_AUDIO_ID=1
ID_FILENAME=Yoyodyne - 07. Bright World.flv
ID_DEMUXER=lavfpref
ID_VIDEO_FORMAT=VP6F
ID_VIDEO_BITRATE=0
ID_VIDEO_WIDTH=512
ID_VIDEO_HEIGHT=384
ID_VIDEO_FPS=29.970
ID_VIDEO_ASPECT=0.0000
ID_AUDIO_FORMAT=85
ID_AUDIO_BITRATE=128000
ID_AUDIO_RATE=44100
ID_AUDIO_NCH=2
ID_LENGTH=270.30
TOTAL_BITRATE: 299.814 kbps

ID_VIDEO_BITRATE は AVI ファイルのときしか出ないのかな?
ちなみに、上の出力はこの動画のもの。

実は、bash だけでは小数を含む計算ができない (整数演算しかできない) ってところから、awk の使いかたをちょっと前にだらだらと見てて、そのへんでわかったのだった。
awk、便利かも!
ただ、ホントはひとつパワフルなスクリプト言語 (PerlPythonRuby、他) をちょっとかじったほうが早い気がしないでもない。