iOS 17第三方编辑APP导出视频上传被识别为.jpeg格式问题求助
替代文件类型检测的视频判断方案
针对iOS 17系统下,经Soda、Beauty Cam等APP编辑后的视频被错误标记为.jpeg格式的问题,以下是几种不依赖文件扩展名或file.type的验证方案:
1. 读取文件二进制头部签名(Magic Number)
视频格式(如MP4)的二进制文件头部有固定的特征签名,不受扩展名或系统错误标注的影响。直接读取文件前几个字节匹配签名,就能准确判断是否为视频:
async function isVideoByMagicNumber(file) { // 读取文件前8个字节 const buffer = await file.slice(0, 8).arrayBuffer(); const uint8 = new Uint8Array(buffer); // MP4格式的常见头部签名集合 const mp4Signatures = [ [0x00, 0x00, 0x00, 0x18, 0x66, 0x74, 0x79, 0x70], [0x00, 0x00, 0x00, 0x0C, 0x66, 0x74, 0x79, 0x70], [0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, 0x32] ]; // 匹配是否符合MP4签名 return mp4Signatures.some(signature => signature.every((byte, index) => uint8[index] === byte) ); }
2. 利用浏览器视频API验证
通过HTML5的<video>元素尝试加载文件Blob,若能成功解析出视频元数据(如时长),则说明是有效视频文件:
function isVideoByVideoAPI(file) { return new Promise((resolve) => { const video = document.createElement('video'); video.preload = 'metadata'; // 成功加载元数据,判定为视频 video.onloadedmetadata = () => { URL.revokeObjectURL(video.src); resolve(true); }; // 加载失败,判定非视频 video.onerror = () => { URL.revokeObjectURL(video.src); resolve(false); }; video.src = URL.createObjectURL(file); }); }
注意:必须调用URL.revokeObjectURL释放资源,避免内存泄漏。
3. 文件大小辅助筛选
通常视频文件的体积远大于普通图片,可设置一个合理阈值(如10MB,根据业务场景调整):若被标记为.jpeg的文件超过该阈值,优先触发上述两种验证逻辑,减少不必要的检测开销。
组合方案建议
实际业务中可将三种方法结合使用:
- 先通过文件大小快速过滤小体积文件(直接判定为图片);
- 对大体积文件先验证二进制签名;
- 最后用视频API二次确认,确保准确率。
内容的提问来源于stack exchange,提问作者Ngọc Đồ Đinh
相关产品推荐
相关产品推荐

