# SRT2EXIF **Repository Path**: woniugis/SRT2EXIF ## Basic Information - **Project Name**: SRT2EXIF - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-23 - **Last Updated**: 2025-10-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SRT2EXIF - DJI无人机视频帧提取与GPS信息嵌入工具 ## 简介 SRT2EXIF是一款专为DJI无人机视频设计的工具,能够按指定频率从视频中提取图像帧,并将SRT字幕文件中的GPS信息嵌入到对应图像的EXIF数据中。这对于后续进行3D重建、地理信息分析或其他需要地理位置信息的图像处理非常有用。 ## 功能特点 - 从DJI无人机视频中按指定频率提取图像帧 - 自动解析同名SRT文件中的GPS和相机参数信息 - 将GPS坐标、高度等信息嵌入到图像的EXIF数据中 - 支持进度条显示处理进度 - 支持中文路径 - 支持详细日志记录 ## 安装与依赖 本工具依赖以下Python库: - OpenCV (cv2) - piexif - tqdm - numpy 可以通过以下命令安装依赖: ```bash pip install opencv-python piexif tqdm numpy ``` ## 使用方法 ### 命令行参数 ``` python video_extractor.py -s 视频文件路径.MP4 -f 每秒提取帧数 [-m 输出目录] [--log 日志文件] ``` 参数说明: - `-s, --source`:**必需参数**,视频文件路径,程序会自动查找同名的SRT文件 - `-f, --fps`:**必需参数**,每秒提取的帧数 - `-m, --output`:*可选参数*,输出目录,默认为与视频同名的文件夹 - `--log`:*可选参数*,详细日志文件路径 ### 使用示例 从视频中每秒提取2帧,并添加GPS信息: ```bash python video_extractor.py -s drone_video.MP4 -f 2 ``` 从视频中每秒提取5帧,并保存到指定目录: ```bash python video_extractor.py -s drone_video.MP4 -f 5 -m output_frames ``` ## SRT文件格式说明 DJI无人机生成的SRT字幕文件包含每一帧的详细元数据信息,格式如下: 1. **时间码信息**:每个字幕条目的开始和结束时间,格式为"小时:分钟:秒,毫秒" 2. **帧计数和时间差**:例如"FrameCnt: 1, DiffTime: 33ms"表示第1帧,与上一帧相差33毫秒 3. **时间戳**:拍摄的具体时间,例如"2025-04-16 15:04:09.052" 4. **相机参数**: - iso: 100(感光度) - shutter: 1/939.1(快门速度) - fnum: 2.8(光圈值) - ev: 0(曝光补偿) - color_md: default(色彩模式) - ae_meter_md: 1(测光模式) - focal_len: 24.00(焦距,单位mm) - dzoom_ratio: 1.00(数字变焦比例) 5. **GPS信息**: - latitude: 纬度值 - longitude: 经度值 - rel_alt: 相对高度(单位米) - abs_alt: 绝对高度(单位米) 6. **云台信息**: - gb_yaw: 云台偏航角 - gb_pitch: 云台俯仰角 - gb_roll: 云台横滚角 ## 工作原理 ### 1. 帧提取逻辑 - 读取视频文件,获取其帧率(FPS) - 根据用户指定的每秒提取帧数计算跳过帧数 - 例如:视频为30FPS,用户要求每秒2帧,则每15帧提取一次 ### 2. SRT解析逻辑 - SRT文件包含每一帧的详细元数据,包括GPS坐标、高度、云台角度等 - 使用状态机解析SRT文件的不同部分(序号、时间戳、字体大小、日期时间、详细信息) - 将解析的信息存储在帧信息映射表中,以帧序号为索引 ### 3. EXIF嵌入逻辑 - 将GPS坐标转换为EXIF标准的DMS(度分秒)格式 - 设置经纬度、高度及其参考信息 - 使用piexif库将信息写入图像文件 #### GPS坐标转换过程 将十进制度格式的GPS坐标转换为度分秒(DMS)格式的步骤: 1. 提取整数部分作为度 2. 将小数部分乘以60得到分钟 3. 提取分钟的整数部分 4. 将分钟的小数部分乘以60得到秒 5. 将秒乘以10^7以保留精度 例如,将30.280056转换为DMS格式: - 度: int(30.280056) = 30 - 分: int((30.280056 - 30) * 60) = int(16.80336) = 16 - 秒: ((30.280056 - 30) * 60 - 16) * 60 = 48.2016 最终表示为:30° 16' 48.2016"N ## 注意事项 - SRT文件必须与视频文件同名,仅扩展名不同 - 确保有足够的磁盘空间存储提取的图像 - 对于大型视频文件,处理可能需要较长时间 - 支持中文路径,但在某些系统上可能需要正确设置字符编码 ## 特殊功能说明 ### 中文路径支持 本工具特别处理了OpenCV无法直接处理中文路径的问题。通过使用`cv2.imdecode`和`cv2.imencode`函数,实现了对中文路径的完美支持: ```python # 读取中文路径的图像 def cv_imread(file_path): return cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), cv2.IMREAD_COLOR) # 保存图像到中文路径 def cv_imwrite(file_path, img): ext = os.path.splitext(file_path)[1] cv2.imencode(ext, img)[1].tofile(file_path) ``` ### 打包为可执行文件 由于PyInstaller在打包时可能无法正确识别`piexif`模块,我们提供了一个自定义的spec文件来解决这个问题: ```bash # 使用自定义spec文件打包 pyinstaller SRT2EXIF_Custom.spec ``` `SRT2EXIF_Custom.spec`文件明确指定了`piexif`模块的路径和所有必要的依赖项,确保打包后的可执行文件能够正常运行。 ### Python与C++版本的区别 本工具有Python和C++两个版本的实现,两者的核心逻辑相同,但有以下区别: 1. **库依赖不同**: - Python版本使用`piexif`库处理EXIF数据 - C++版本使用`Exiv2`库处理EXIF数据 2. **坐标转换实现**: - 两个版本都将十进制度格式转换为度分秒格式 - 计算逻辑相同,但实现方式略有不同 - C++版本使用`static_cast`进行类型转换,Python版本使用`int()`函数 3. **性能差异**: - C++版本通常有更好的性能,特别是处理大型视频文件时 - Python版本更容易修改和扩展 ## 版本信息 - 版本:1.0 - 日期:2025-04-17 - 作者:孙雷雷 ## 许可证