Go
Git
KML
ffmpeg
GoPro

GoPro HERO5 Blackで撮影した動画からKMLファイルを抽出してみました

GoPro HERO5 BlackでGPSを取得したので、KMLファイルに出力して欲しいと依頼されました。

QUICKというソフトで軌跡は表示できるようなのですが、地図上に表示することは出来ないんですね。

Extracting GPS From Go Pro Hero 5を参考にしました。
ただし、Linux・json出力、で書かれているので、Windows・KML出力として残しておきます。

準備

必要なもの

  • ffmpeg
  • git
  • Go

ffmpeg

動画を扱いたいならとりあえずこれですね。
1. FFmpeg BuildsからStatic版をダウンロードします。
2. どこかに解凍します。
3. Pathを通します。

git

自分用 Git For Windowsのインストール手順が参考になると思います。
ここもPathが通っていないと後々つまづきます。

Go

Windows に インストーラを使って GoLang を インストールするときの注意点が参考になります。
GOROOTとかGOPATHとか、Pathを通す必要があったりするので、よく読んでください。

再起動

Pathをもろもろ通したらサインアウトか再起動します。

手順

1. Streamを調べる

GPS情報は、撮影した動画ファイルGOPRxxxx.MP4にメタデータとして入っています。
まずはこれを確認します。

ffprobe GOPRxxxx.MP4
  Duration: 00:11:56.80, start: 0.000000, bitrate: 30165 kb/s
    Stream #0:0(eng), 1, 1/60000: Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 29972 kb/s, 59.94 fps, 59.94 tbr, 60k tbn, 119.88 tbc (default)
    Metadata:
      creation_time   : 2018-04-11 13:42:19
      handler_name    :     GoPro AVC
      encoder         : GoPro AVC encoder
      timecode        : 13:55:26:27
    Stream #0:1(eng), 1, 1/48000: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      creation_time   : 2018-04-11 13:42:19
      handler_name    :     GoPro AAC
      timecode        : 13:55:26:27
    Stream #0:2(eng), 1, 1/60000: Data: none (tmcd / 0x64636D74) (default)
    Metadata:
      creation_time   : 2018-04-11 13:42:19
      handler_name    :     GoPro TCD
      timecode        : 13:55:26:27
    Stream #0:3(eng), 0, 1/1000: Data: none (gpmd / 0x646D7067), 38 kb/s (default)
    Metadata:
      creation_time   : 2018-04-11 13:42:19
      handler_name    :     GoPro MET
    Stream #0:4(eng), 4, 1/60000: Data: none (fdsc / 0x63736466), 13 kb/s (default)
    Metadata:
      creation_time   : 2018-04-11 13:42:19
      handler_name    :     GoPro SOS

このファイルの場合、Stream #0:3(eng), 0, 1/1000: Data: none (gpmd / 0x646D7067), 38 kb/s (default)がGPS情報なので、この0:3を覚えておきます。

2. バイナリで抽出する

ffmpegの細かいオプションはよく分かりませんが、ファイル名とStreamを変えて実行します。
ffmpeg -y -i GOPRxxxx.MP4 -codec copy -map 0:3 -f rawvideo GOPRxxxx.bin

3. バイナリからGPXに変換する

まず、github.com/stilldavid/gopro-utilsからgit cloneするかzipでダウンロードして展開しておきます。

次に、この二つのパッケージをgetします。

go get github.com/stilldavid/gopro-utils/telemetry
go get github.com/paulmach/go.geo

あとは、buildしても良し、runしても良しですが、ここではrunします。

go run gopro2gpx.go -i GOPRxxxx.bin -o GOPRxxxx.gpx

4. GPXからKMLに変換する

本当はここから先もGoで変換できたら良かったのですが…。
見つからなかったのでGPX2KMLを使いました。

GPXからKMLへの変換ツールはいくつかあるようなので、お好きなものを使えると思います。