如何将手机中的MP4传输到PC且不修改文件原始创建时间
MP4文件创建时间提取与防篡改解决方案
核心前提说明
- MP4格式内置的
creation_time元数据字段封装在文件二进制内容中,只要不对文件做重新编码、转封装操作,无论系统如何修改文件系统级属性,该字段都不会发生变化,是最可靠的时间来源 - 单纯将文件转为二进制流传输的操作不会修改文件本身的任何内容,系统传输后变更的仅为目标磁盘上的文件系统级属性(资源管理器中可见的创建时间、修改时间等),可通过代码主动覆盖修正
可行方案
方案1:直接读取MP4内置元数据(开发成本最低,优先推荐)
Windows系统移动文件时仅修改文件系统属性,不会改动MP4内部封装的时间字段,你之前读取的大概率是系统暴露的文件属性而非文件内部字段,可直接读取内置字段实现需求:
- C# 中可直接解析MP4文件结构获取时间:找到moov容器下mvhd块的第4字节起始的32位无符号整数,该值为从
1904-01-01 00:00:00开始计算的秒数,转换为本地时间即可得到原始创建时间 - 也可引入成熟的媒体处理库完成解析,无需手动处理文件结构
方案2:自定义C#传输工具(需保留文件系统级属性时使用)
如果业务要求必须让PC端文件的系统级创建时间和手机端完全一致,自己开发传输工具完全可行,实现逻辑如下:
- 手机端读取两个信息:MP4文件完整二进制流、文件原始创建时间戳
- 传输时将时间戳、文件长度、文件流按约定顺序依次发送
- PC端接收完成写入文件后,调用C#内置方法
File.SetCreationTimeUtc()将接收到的原始时间戳写入文件的系统属性即可,完全避免系统自动生成的时间篡改问题
方案3:无开发快速验证方案
如果需要先验证时间准确性,可直接用FFmpeg命令读取MP4内置创建时间,命令如下:ffprobe -v error -select_streams v:0 -show_entries format=creation_time -of default=noprint_wrappers=1:nokey=1 目标文件路径.mp4
该命令读取的是文件内部封装的原始时间,不受任何系统文件属性修改的影响
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

