






















如何使用 FFmpeg 提取 GoPro 视频中保存的原始 telemetry 数据
# reinstall
$ brew reinstall ffmpeg

$ ffmpeg -version
ffmpeg version 8.1 Copyright (c) 2000-2026 the FFmpeg developers
built with Apple clang version 16.0.0 (clang-1600.0.26.6)
configuration: --prefix=/usr/local/Cellar/ffmpeg/8.1 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gpl --enable-libsvtav1 --enable-libopus --enable-libx264 --enable-libmp3lame --enable-libdav1d --enable-libvmaf --enable-libvpx --enable-libx265 --enable-openssl --enable-videotoolbox --enable-audiotoolbox
libavutil 60. 26.100 / 60. 26.100
libavcodec 62. 28.100 / 62. 28.100
libavformat 62. 12.100 / 62. 12.100
libavdevice 62. 3.100 / 62. 3.100
libavfilter 11. 14.100 / 11. 14.100
libswscale 9. 5.100 / 9. 5.100
libswresample 6. 3.100 / 6. 3.100
Exiting with exit code 0
https://github.com/ffmpeg/ffmpeg
如何使用 ffmpeg 提取 GoPro 视频中保存的原始 telemetry 数据,并且根据数据中的速度,生成一个展示实时速度的仪表盘 overlay
# 1. 查看 GoPro 原始视频中的 telemetry metadata 数据位置
$ ffmpeg -i /Users/xgqfrms-mm/Movies/goPro/GX010918_Trim_06.11.MP4
ffmpeg version 8.1 Copyright (c) 2000-2026 the FFmpeg developers
built with Apple clang version 16.0.0 (clang-1600.0.26.6)
configuration: --prefix=/usr/local/Cellar/ffmpeg/8.1 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gpl --enable-libsvtav1 --enable-libopus --enable-libx264 --enable-libmp3lame --enable-libdav1d --enable-libvmaf --enable-libvpx --enable-libx265 --enable-openssl --enable-videotoolbox --enable-audiotoolbox
libavutil 60. 26.100 / 60. 26.100
libavcodec 62. 28.100 / 62. 28.100
libavformat 62. 12.100 / 62. 12.100
libavdevice 62. 3.100 / 62. 3.100
libavfilter 11. 14.100 / 11. 14.100
libswscale 9. 5.100 / 9. 5.100
libswresample 6. 3.100 / 6. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/xgqfrms-mm/Movies/goPro/GX010918_Trim_06.11.MP4':
Metadata:
major_brand : mp41
minor_version : 538120216
compatible_brands: mp41
creation_time : 2026-04-12T14:59:23.000000Z
firmware : H24.01.02.10.70
location : +31.0419+121.2282/
location-eng : +31.0419+121.2282/
Duration: 00:01:22.82, start: 0.000000, bitrate: 8193 kb/s
Stream #0:0[0x1](eng): Video: hevc (Main) (hvc1 / 0x31637668), yuvj420p(pc, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 7912 kb/s, 59.94 fps, 59.94 tbr, 60k tbn (default)
Metadata:
creation_time : 2026-04-12T14:59:23.000000Z
handler_name : GoPro H.265
encoder : GoPro H.265 encoder
timecode : 22:35:05:23
Stream #0:1[0x2](eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 189 kb/s (default)
Metadata:
creation_time : 2026-04-12T14:59:23.000000Z
handler_name : GoPro AAC
Stream #0:2[0x3](eng): Data: bin_data (gpmd / 0x646D7067), 64 kb/s (default)
Metadata:
creation_time : 2026-04-12T14:59:23.000000Z
handler_name : GoPro MET
Stream #0:3[0x4](eng): Data: none (tmcd / 0x64636D74)
Metadata:
creation_time : 2026-04-12T14:59:23.000000Z
timecode : 22:35:05:23
At least one output file must be specified

General Purpose Metadata Format (GPMF)
GoPro Metadata (GPMD)
# 2. 提取 telemetry metadata,并保存到 telemetry.bin
$ cd /Users/xgqfrms-mm/Movies/goPro/
$ ffmpeg -y -i GX010918_Trim_06.11.MP4 -codec copy -map 0:2 -f rawvideo telemetry.bin
# 等价于
$ ffmpeg -y -i /Users/xgqfrms-mm/Movies/goPro/GX010918_Trim_06.11.MP4 -codec copy -map 0:2 -f rawvideo /Users/xgqfrms-mm/Movies/goPro/telemetry.bin
0:2 是 telemetry stream(可能不同,按实际调整)
0:2 就是 gpmd

# 3. 解析 GPS speed
$ npm install gopro-telemetry
$ node extract.js
// extract.js
const fs = require('fs');
const goproTelemetry = require('gopro-telemetry');
const rawData = fs.readFileSync('telemetry.bin');
goproTelemetry({ rawData }, (err, data) => {
if (err) throw err;
const gps = data['1'].streams.GPS5.samples;
const result = gps.map(s => ({
t: s.date,
speed: (s.value[3] || 0) * 3.6 // m/s → km/h
}));
fs.writeFileSync('speed.json', JSON.stringify(result, null, 2));
});
生成 speed.json 速度数据
# 4. 生成仪表盘: 赛车 HUD(右上角)
$ python render.py
// render.py
import cv2
import json
import numpy as np
video = "GX010918_Trim_06.11.MP4"
with open("speed.json") as f:
data = json.load(f)
cap = cv2.VideoCapture(video)
fps = cap.get(cv2.CAP_PROP_FPS)
w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
out = cv2.VideoWriter(
"overlay.mp4",
cv2.VideoWriter_fourcc(*"mp4v"),
fps,
(w, h)
)
max_speed = 140
i = 0
while True:
ret, frame = cap.read()
if not ret:
break
speed = data[min(i, len(data)-1)]["speed"]
# HUD区域(右上角)
hud = np.zeros((200, 300, 3), dtype=np.uint8)
center = (150, 140)
radius = 90
# 外圈
cv2.circle(hud, center, radius, (0,255,255), 2)
# 指针
angle = int((speed / max_speed) * 270 - 135)
x = int(center[0] + radius * np.cos(np.radians(angle)))
y = int(center[1] + radius * np.sin(np.radians(angle)))
cv2.line(hud, center, (x,y), (0,0,255), 3)
# 数字速度
cv2.putText(hud, f"{speed:.0f} km/h",
(60, 180),
cv2.FONT_HERSHEY_SIMPLEX,
0.8,
(255,255,255), 2)
# 叠加到右上角
frame[10:210, w-310:w-10] = hud
out.write(frame)
i += 1
cap.release()
out.release()
# 5. 叠加仪表盘
$ ffmpeg -i GX010918_Trim_06.11.MP4 -i overlay.mp4 \
-filter_complex "[1:v]format=rgba[ov];[0:v][ov]overlay=W-w-20:20" \
-c:a copy final.mp4
???
telemetry data used within GoPro® cameras.GPMF -- GoPro Metadata Format or General Purpose Metadata Format
https://github.com/gopro/gpmf-parser
free 3 days trial


https://www.cnblogs.com/xgqfrms/p/18525348#5407123
telemetry extractor
https://chatgpt.com/c/69dca899-2da4-832d-a929-3dc5145b564c
©xgqfrms 2012-2021
www.cnblogs.com/xgqfrms 发布文章使用:只允许注册用户才可以访问!
原创文章,版权所有©️xgqfrms, 禁止转载 🈲️,侵权必究⚠️!
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。