You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用FFmpeg提取视频特定像素并存储为JSON?

提取视频特定像素并保存为JSON的可行方案

FFmpeg确实是干这个的好手,完全不需要去改源码折腾自定义项目,直接用命令行就能搞定。下面分场景给你具体的实现方式,还有替代方案供你选择:

用FFmpeg实现的两种场景

1. 提取单帧的单个特定像素

如果你只需要从某一帧(比如第100帧)里拿某个坐标(比如x=200,y=150)的像素值,用这条命令:

ffmpeg -i input.mp4 -vf "select=eq(n\,99),crop=1:1:200:150" -frames:v 1 -f rawvideo -pix_fmt rgb24 - | xxd -p -c 3 | awk '{printf "{\"frame\": 100, \"x\": 200, \"y\": 150, \"r\": %d, \"g\": %d, \"b\": %d}\n", strtonum("0x"$1), strtonum("0x"$2), strtonum("0x"$3)}' > single_pixel.json

我给你拆解下关键部分:

  • select=eq(n\,99):选中第100帧(FFmpeg的帧索引是从0开始的,所以这里写99)
  • crop=1:1:200:150:裁出1x1的小区域,左上角就是你要的(200,150)坐标
  • -f rawvideo -pix_fmt rgb24:输出原始的RGB像素数据,避免编码干扰
  • xxd和awk:把二进制的像素值转成十六进制再转十进制,最后包装成JSON格式

2. 提取多帧中同一像素的序列

要是你需要跟踪这个像素在视频里的变化(比如每10帧提取一次),用这条命令生成JSON数组:

ffmpeg -i input.mp4 -vf "select=not(mod(n\,10)),crop=1:1:200:150" -f rawvideo -pix_fmt rgb24 - | xxd -p -c 3 | awk 'BEGIN{print "["} {printf "%s{\"frame\": %d, \"x\": 200, \"y\": 150, \"r\": %d, \"g\": %d, \"b\": %d}", (NR>1?",":""), NR*10, strtonum("0x"$1), strtonum("0x"$2), strtonum("0x"$3)} END{print "]"}' > pixel_sequence.json

这里select=not(mod(n\,10))表示每10帧提取一次(跳过9帧取1帧),awk会自动把所有结果拼成合法的JSON数组。

更灵活的替代方案:Python + OpenCV

如果FFmpeg的命令行组合对你来说有点绕,用Python结合OpenCV会更直观,还能轻松扩展功能(比如同时提取多个像素),给你个示例脚本:

import cv2
import json

video_path = "input.mp4"
target_coords = [(200, 150), (300, 200)]  # 可以同时添加多个像素坐标
frame_step = 10  # 每10帧提取一次

cap = cv2.VideoCapture(video_path)
pixel_records = []
current_frame = 0

while cap.isOpened():
    success, frame = cap.read()
    if not success:
        break
    if current_frame % frame_step == 0:
        for (x, y) in target_coords:
            # OpenCV读出来的帧是BGR格式,转成RGB
            b, g, r = frame[y, x]
            pixel_records.append({
                "frame": current_frame + 1,
                "x": x,
                "y": y,
                "r": int(r),
                "g": int(g),
                "b": int(b)
            })
    current_frame += 1

cap.release()

# 写入JSON文件
with open("pixel_data.json", "w", encoding="utf-8") as f:
    json.dump(pixel_records, f, indent=2)

这个脚本可以直接运行,你只需要修改视频路径、目标坐标和帧间隔就行,调试和修改都比命令行方便。

内容的提问来源于stack exchange,提问作者Neros

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:38:00