Ruby と FFmpeg を使って、MP4などの動画ファイルから撮影日時を抜き出す。
今回の環境は macOS Sierra version 10.12.1 で、 Ruby と Homebrew が導入済みの前提。
streamio-ffmpeg
FFmpeg を扱える Ruby のライブラリを検索してみたら、ダウンロード数で streamio-ffmpeg が圧倒的だった。
⇒ search | RubyGems.org | your community gem host
FFmpeg と streamio-ffmpeg を導入する
こんな感じのシェルスクリプト setup.sh を用意して。
#!/bin/sh
brew install ffmpeg
gem install streamio-ffmpeg
シェルスクリプトを実行して、 FFmpeg と streamio-ffmpeg をインストール。
$ sh setup.sh
動画撮影日時を出力する Ruby スクリプト
streamio-ffmpeg ライブラリを使って、 動画撮影日時 creation_time を抜き出す Ruby スクリプト mdate.rb。最終的には Time#getlocal で日本時間に変換して出力する。
require 'streamio-ffmpeg'
ARGV.each{|file|
movie = FFMPEG::Movie.new(file)
mtime = movie.creation_time
puts mtime
if mtime != nil
ltime = mtime.getlocal
puts ltime
ftime = ltime.strftime('%Y-%m-%d %H:%M:%S')
puts ftime
end
}
Ruby スクリプトと avprobe を実行するシェルスクリプト
Ruby スクリプトを実行するシェルスクリプト run.sh を用意する。
比較用に avprobe (FFmpeg) も実行して、動画の情報を出力している。
今回は、 MOV_0033.mp4, IMG_1588.MOV, 20070414_085400.3gp という3つのサンプル動画ファイルを読み込む。
#!/bin/sh
files=(MOV_0033.mp4 IMG_1588.MOV 20070414_085400.3gp)
for file in ${files[@]}
do
echo "===== $file ============================================================"
echo ''
echo '=== avprobe ==='
avprobe $file
echo '=== ruby mdate.rb ===='
ruby mdate.rb $file
echo ''
done
以下に実行結果。
3つのファイルについて、avprobe による出力と Ruby スクリプトによる動画撮影日時が出力される。avprobe が出力する日時はUTC (協定世界時) なので、Ruby スクリプトでは最終的に日本時間に変換している。
$ sh run.sh
===== MOV_0033.mp4 ============================================================
=== avprobe ===
avprobe version 11.4, Copyright (c) 2007-2014 the Libav developers
built on Mar 1 2016 12:20:19 with Apple LLVM version 7.0.2 (clang-700.1.81)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'MOV_0033.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2016-11-12 10:26:02
Duration: 00:00:06.63, start: 0.000000, bitrate: 18157 kb/s
Stream #0.0(eng): Video: h264 (High), yuv420p, 1920x1080, 17026 kb/s, PAR 65536:65536 DAR 16:9, 30 fps, 90k tbn (default)
Metadata:
creation_time : 2016-11-12 10:26:02
Side data:
displaymatrix: rotation of -90.00 degrees
Stream #0.1(eng): Audio: aac, 48000 Hz, stereo, fltp, 155 kb/s (default)
Metadata:
creation_time : 2016-11-12 10:26:02
# avprobe output
=== ruby mdate.rb ====
2016-11-12 10:26:02 UTC
2016-11-12 19:26:02 +0900
2016-11-12 19:26:02
===== IMG_1588.MOV ============================================================
=== avprobe ===
avprobe version 11.4, Copyright (c) 2007-2014 the Libav developers
built on Mar 1 2016 12:20:19 with Apple LLVM version 7.0.2 (clang-700.1.81)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'IMG_1588.MOV':
Metadata:
major_brand : qt
minor_version : 0
compatible_brands: qt
creation_time : 2016-11-12 10:21:16
Duration: 00:00:05.73, start: 0.000000, bitrate: 15799 kb/s
Stream #0.0(und): Video: h264 (High), yuv420p, 1920x1080, 15887 kb/s, 29.97 fps, 600 tbn (default)
Metadata:
creation_time : 2016-11-12 10:21:16
encoder : H.264
Side data:
displaymatrix: rotation of -90.00 degrees
Stream #0.1(und): Audio: aac, 44100 Hz, mono, fltp, 81 kb/s (default)
Metadata:
creation_time : 2016-11-12 10:21:16
Stream #0.2(und): Data: mebx / 0x7862656D, 0 kb/s (default)
Metadata:
creation_time : 2016-11-12 10:21:16
Stream #0.3(und): Data: mebx / 0x7862656D, 0 kb/s (default)
Metadata:
creation_time : 2016-11-12 10:21:16
Unsupported codec with id 0 for input stream 2
Unsupported codec with id 0 for input stream 3
# avprobe output
=== ruby mdate.rb ====
2016-11-12 10:21:16 UTC
2016-11-12 19:21:16 +0900
2016-11-12 19:21:16
===== 20070414_085400.3gp ============================================================
=== avprobe ===
avprobe version 11.4, Copyright (c) 2007-2014 the Libav developers
built on Mar 1 2016 12:20:19 with Apple LLVM version 7.0.2 (clang-700.1.81)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '20070414_085400.3gp':
Metadata:
major_brand : mmp4
minor_version : 1
compatible_brands: mmp43gp53gp4
creation_time : 2007-04-13 23:53:57
Duration: 00:00:05.16, start: 0.000000, bitrate: 85 kb/s
Stream #0.0(jpn): Video: mpeg4 (Simple Profile), yuv420p, 176x144 [PAR 1:1 DAR 11:9], 69 kb/s, 13.75 fps, 60k tbn, 30 tbc (default)
Metadata:
creation_time : 2007-04-13 23:53:57
Stream #0.1(jpn): Audio: amrnb, 8000 Hz, mono, flt, 12 kb/s (default)
Metadata:
creation_time : 2007-04-13 23:53:57
# avprobe output
=== ruby mdate.rb ====
2007-04-13 23:53:57 UTC
2007-04-14 08:53:57 +0900
2007-04-14 08:53:57
avprobe (FFmpeg) はいろいろ出力してしまうので、今回のように特定の情報だけ抜き出したいときは Ruby + streamio-ffmpeg を使うのが良さそう。
今回の実行環境
$ uname -mrsv
Darwin 16.1.0 Darwin Kernel Version 16.1.0: Thu Oct 13 21:26:57 PDT 2016; root:xnu-3789.21.3~60/RELEASE_X86_64 x86_64
$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin16]
$ gem list | grep streamio-ffmpeg
streamio-ffmpeg (3.0.1)
$ ffmpeg -version
ffmpeg version 3.2 Copyright (c) 2000-2016 the FFmpeg developers
built with Apple LLVM version 8.0.0 (clang-800.0.42.1)
参考資料
-
ref.
- GitHub - streamio/streamio-ffmpeg: Simple yet powerful ruby ffmpeg wrapper for reading metadata and transcoding movies
- streamio-ffmpeg/movie.rb at master · streamio/streamio-ffmpeg · GitHub
- ffmpegで動画の各種情報を確認する - Qiita
- class Time (Ruby 2.3.0)
tags: mac ruby ffmpeg movie
Posted by NI-Lab. (@nilab)