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

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的文件超过该阈值,优先触发上述两种验证逻辑,减少不必要的检测开销。

组合方案建议

实际业务中可将三种方法结合使用:

  1. 先通过文件大小快速过滤小体积文件(直接判定为图片);
  2. 对大体积文件先验证二进制签名;
  3. 最后用视频API二次确认,确保准确率。

内容的提问来源于stack exchange,提问作者Ngọc Đồ Đinh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:33:19