Ruby と FFmpeg を使って、MP4などの動画ファイルから撮影日時を抜き出す。

今回の環境は macOS Sierra version 10.12.1 で、 RubyHomebrew が導入済みの前提。

streamio-ffmpeg

FFmpeg を扱える Ruby のライブラリを検索してみたら、ダウンロード数で streamio-ffmpeg が圧倒的だった。

Ruby + FFmpeg + 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)

参考資料

tags: mac ruby ffmpeg movie

Posted by NI-Lab. (@nilab)