Perlで動画の画面サイズを取得する

動画の縦のサイズと横のサイズを取得する必要があってGoogleで色々と検索してみたんですが、なかなか良い方法が見つからなかったので、色々調べてみました。特にsearch.cpan.org

えと、結論的にはImage::ExifToolで取得できます。

use strict;
use warnings;
use Image::ExifTool qw(:Public);

my $file = shift @ARGV;

if (-f $file) {
    my $info = ImageInfo($file);
    while ( my($key, $val) = each %$info ) {
        print sprintf "%s - %s\n", $key, $val;
    }
}
else {
    warn 'File-Name ERROR.';
}
1;

というコードをとりあえずvideoinfo.plとしておいて、コマンドシェル上で

perl videoinfo.pl test.MOV

を実行すると、

AudioSampleRate - 44100
SelectionTime - 0 s
OpColor - 32768 32768 32768
TrackVersion (1) - 0
HandlerDescription (2) - Core Media Data Handler
TrackVolume (1) - 100.00%
SourceImageHeight - 480
MIMEType - video/quicktime
FileType - MOV
AudioBitsPerSample - 16
MediaHeaderVersion (1) - 0
TrackLayer (1) - 0
TrackCreateDate (1) - 2010:05:17 08:16:43
ExifToolVersion - 8.15
FilePermissions - rw-r--r--
MediaModifyDate - 2010:05:17 08:16:50
Directory - .
Version - 0
ImageHeight - 480
PreferredRate - 1
TrackID (1) - 2
AudioFormat (1) - mp4a
HandlerVendorID (2) - Apple
HandlerVendorID (1) - Apple
TrackVolume - 0.00%
CompatibleBrands - qt  
PreferredVolume - 100.00%
BitDepth - 24
HandlerClass (2) - Data Handler
SelectionDuration - 0 s
NextTrackID - 3
MediaTimeScale (1) - 600
UserData_xyz - +35.****+135.****/
Duration - 6.12 s
HandlerType (3) - Audio Track
Rotation - 90
MajorBrand - Apple QuickTime (.MOV/QT)
HandlerDescription (1) - Core Media Video
TrackLayer - 0
PreviewDuration - 0 s
MinorVersion - 0.0.0
MediaDuration - 6.18 s
SourceImageWidth - 640
HandlerType (2) - Alias Data
ModifyDate - 2010:05:17 08:16:50
MediaTimeScale - 44100
MatrixStructure - 1 0 0 0 1 0 0 0 1
CreateDate (1) - 2010:05:17 08:16:43
ImageSize - 640x480
ImageWidth - 640
AudioFormat - chan
HandlerType - Alias Data
HandlerClass (1) - Media Handler
TimeScale - 600
PosterTime - 0 s
CurrentTime - 0 s
HandlerClass (3) - Media Handler
HandlerVendorID - Apple
VideoFrameRate - 16.20
MatrixStructure (1) - 1 0 0 0 1 0 0 0 1
HandlerVendorID (3) - Apple
TrackDuration - 6.12 s
UserData_mak - Apple
GraphicsMode - ditherCopy
CompressorID - avc1
FileName - test.MOV
XResolution - 72
HandlerType (1) - Video Track
MatrixStructure (2) - 0 1 0 -1 0 0 480 0 1
MediaCreateDate (1) - 2010:05:17 08:16:43
UserData_mod - iPhone 3GS
CompressorName - H.264
TrackModifyDate - 2010:05:17 08:16:50
UserData_swr - 3.1.3
CreateDate - 2010-05-17T17:16:43+0900
HandlerDescription - Core Media Data Handler
MediaLanguageCode (1) - und
FileModifyDate - 2010:05:17 17:20:04+09:00
TrackVersion - 0
HandlerClass - Data Handler
MediaHeaderVersion - 0
MediaLanguageCode - und
HandlerDescription (3) - Core Media Audio
MediaDuration (1) - 6.17 s
MediaModifyDate (1) - 2010:05:17 08:16:50
TrackID - 1
FileSize - 2.7 MB
Balance - 0
AudioChannels - 1
YResolution - 72
TrackModifyDate (1) - 2010:05:17 08:16:50
MediaCreateDate - 2010:05:17 08:16:43
TrackDuration (1) - 6.12 s
PreviewTime - 0 s
TrackCreateDate - 2010:05:17 08:16:43

こんな感じの結果が返ってきます(一部情報を伏せてます)。で、この中のImageWidthが動画の横サイズ、ImageHeightが動画の縦サイズになります。

単純に動画の縦横サイズを取得したいだけなら他にも色々とモジュールがあるようですが、Image::ExifToolではRotation情報も取得できるのが便利。

例えばiPhoneで縦向きのまま動画を撮るとそのまま縦長の動画になりますが、縦横サイズの情報は向きに関係なく普通の横長のサイズで記録されるため、FFmpegMEncoderなどでファイル形式を変換すると縦長の動画は横向けになって変換されてしまうんです。その時にRotation情報があると変換後の画像を回転させる程度が分かります。