ドライブレコーダーの動画ファイルからGPSデータを抜き出して動画編集する(1) 解析編

アプリ
スポンサーリンク

こん○○は、よふかしわーくすの、よふかしさんです

今や必需品となったドライブレコーダー
わたくしのクルマにも取り付けてあります

動画は1分ごとに区切られたmovファイル
専用のViewerで開くとGPS情報が同時に見れますが
普通の動画再生アプリで開くと当然GPS情報は表示されません

今回はこの動画ファイルを出発から到着まで1本の動画にしつつ
さらにGPSログデータも合成したいなと思いましたので
その過程を残しておきたいと思います


スポンサーリンク

対象のドラレコ

COMTEC製のHDR-352GHPです
2017年に購入したので、当時では結構性能よい部類でしたが、今となっては古いですね
内蔵バッテリーもほぼ死んでいる状態なので、翌朝になると日付情報がクリアされますw
GPSから日時を読み込んでくれますが、電源ONの後、1~2分くらいは掛かりますね…

このドラレコは専用ViewerとしてHDRviewer3が提供されてます
動画に加えて、日時、車速、XYZ軸のG、Google Mapなんかを同時に見ることができます

な ん で す が

  • 動画ファイル自体が1分毎に区切られているので連続した動画として観れない
    • 正確にはファイルの切れ目でラグが発生してしまう
  • ウィンドウサイズが一定以上大きくできなくて小さい
  • GPSログは専用Viewerでしか表示できないので他人に共有できない
    • 一般的な動画再生アプリだとGPSデータはなく生の動画だけが再生される

という不都合なことがあります
GPSログはmovと別ファイルにはなっていないので埋め込まれている模様

そこで今回はmovファイルを解析してGPSログを取り出し
aviutlで1本の動画に合成しちゃおうという企画です


movファイルをバイナリエディタでのぞき見

まずはバイナリエディタでざっと見てみたところ
ファイルの先頭辺りにftypという文字列が見つかった
また、ファイルの最後辺りにGPSログっぽい文字列が見つかった

ftypをググってみると、MPEG4のbox構造で、ftype、mdat、moovなどの4byteタグがあり
その後の4byteがデータサイズを示していることがわかった

簡単なPythonコードを組んで探したところ、以下のタグが見つかった

  • ftyp
  • mdat
  • moov
  • udat
  • ICAT

先のGPSログっぽい文字列はudatの中にあることがわかった

ちなみにSinkuSuperLiteで見てみると、このmovファイルはMPEG4形式であることもわかった

ここから、本腰を入れてGPSログデータを解析していく


GPSログデータの解析 データ構造

udatタグの先を見てみると
最初のデータだけヘッダデータがあるようで違うものの、2つ目以降は同じデータ構造だった

具体的にはこんな感じ(カンマと半角スペースは便宜的に記載)

XXXXX A XXXX.XXXX N XXXXX.XXXX E XXXXXXXXXXXXXXXX, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, XXXXXXXXXXXXXXXXXXXX

※注
X:整数の文字列

HDRviewerで表示されるデータと照らし合わせて分析した結果、下記の13個に分割できた

  1. XXXXX
  2. A
  3. XXXX.XXXX
  4. N
  5. XXXXX.XXXX
  6. E
  7. XXXX
  8. XXXXXXXXXXXX
  9. 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20
  10. XXXXX
  11. XXXXX
  12. XXXXX
  13. XXXXX


GPSログデータの解析 データ定義

まず、No.3が北緯、No.4がNorth、No.5が東経、No.6がEast
っぽいなぁと思ったのが取っ掛かり

次に、No.1とNo.10が同じデータになっている
データ間に0x00だったり、0x20が複数あるので、別データを区切っているためか
同じデータを2回残している模様
増加していくデータなのでインデックス的なものっぽい

No.8は日時データ
No.7は車速データ
No.11~13はX、Y、Zの順でGデータ

動画は29fpsだが、日付データは基本的に同じ値が10回繰り返されているし
動画内に601個のGPSログが残っているので、GPSは10Hzサンプリング
モータスポーツ用のGPSロガーでも5Hzなんで、高サンプリング…
HDRviewerで見ると、各データは動画のフレームレートで線形補間して表示している模様

まとめると下記となった

  1. インデックス的なもの
  2. 固定値
  3. 緯度
  4. N/S
  5. 経度
  6. E/W
  7. 車速
  8. 日時
  9. データ区切り
  10. インデックス的なもの
  11. 前後(X軸)
  12. 左右(Y軸)
  13. 上下(Z軸)


緯度経度データの単位を考える

No.3とNo.5のGPSデータから
例えば値はこんな感じ

  • No.3:3539.5073
  • No.5:13944.4850

GPSデータはの形式は色々ある模様だが、大体下記の3つ

  • DD形式:度
  • DMS形式:度分秒
  • DMM形式:度分分

GPSログを色々変換してGoogle MAPに表示させてみる
Google MAPだとそれぞれ下記の書式で検索できる

  • DD形式:35.395073, 139.444850
  • DMS形式:35°39’50.73″N 139°44’48.50″E
  • DMM形式:35 39.5073, 139 44.4850

結果、このデータはDMM形式だった


ちなみに、これは「日本経緯度原点」の場所を指している


その他データの単位を考える

その他のデータ単位はぱっと見で分かりやすい

車速は分解能が1、単位はkm/h
日時はYYMMDDhhmmss、JST(UTCではない)
X軸、Y軸、Z軸は1文字目が符号、以降がG
符号は+/-を0/-で表現、Gは分解能が0.001、単位はG

インデックスっぽいものは基本的に100ずつ増加していく
でもたまに80だったり120だったりする
59960の次が00080になっていたので、60000でOVFする仕様
60秒の動画に10HzのGPSログだから60000で収まると思ったが
このインデックスは0ではなく00040等から始まったりするので、想定外でOVFした感じ??

uint16の上限ではないのは何故なんだろう…

Gの符号といい、このインデックスといい、感覚的には違和感を覚えるのだが
一般的なのだろうか…?


終わりに

コムテック製のドラレコ、HDR-352GHPの動画データ、
movファイル内に保存されているGPSログを解析しました
次回はこれをaviutlで合成するために変換して、実際に合成させてみたいと思います

第二回の記事はこちら

公開日時:2025/01/09 23:16:00

コメント

タイトルとURLをコピーしました