如何用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
相关产品推荐
相关产品推荐

