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