一种快速检测Mp4是否损坏的方法

2023-05-16

一种快速检测Mp4是否损坏的方法

由于项目上的需求,需要一种能快速检测MP4文件是否有效(即能正常播放)的方法。

网络上搜索到的绝大多数方案是使用ffmpeg或者ffprobe。以ffprobe为例:

ffprobe -v quiet -print_format json -show_format -show_streams -i '/root/**/test.mp4'

如果能查询到类似于下图的video信息,表示该MP4文件是可以正常播放的

ffprobe方案在绝大多数情况下都是正确的,但是在实际项目使用上,有时候莫名会检测不到上图的流结果。(即针对一个有效的MP4文件,有0.1%的可能会出现检测不到流信息。)

为了绝对的准确性,所以需要寻找另外一种方法进行再次检测。

网上找了一圈,发现了这个专利:https://patents.google.com/patent/CN104486614A/nl

该专利的核心思想是读取MP4文件里每个box的大小,然后相加起来。最终和文件的原始大小进行比较,如果相等,那么认为这个MP4文件是未损坏的

MP4文件格式我参考了这篇博文:https://www.cnblogs.com/chyingp/p/mp4-file-format.html

最终形成了下面这个检测方法:

package com.soyuan.mh.srs.util;

import java.io.*;
import java.nio.ByteBuffer;

public class Mp4Checker {

    public static boolean check(String filePath) {
        long total = 0;
        try (InputStream is = new FileInputStream(filePath)) {
            long realSize = new File(filePath).length();

            boolean readLarge = false;
            long size;
            byte[] buff = new byte[8];
            while (is.read(buff,0,buff.length) != -1) {
                ByteBuffer wrap = ByteBuffer.wrap(buff);
                if (readLarge) {
                    size = wrap.getLong();
                }else {
                    size = Integer.toUnsignedLong(wrap.getInt());
                }

                if (size == 0) {
                    break;
                }
                if (size == 1) {
                    //读取largeSize
                    readLarge = true;
                }else {
                    total += size;
                    long skip;
                    if (readLarge) {
                        skip = size - 16;//跳过size + type + largeSize
                    }else {
                        skip = size - 8;
                    }
                    if (skip > 0) {
                        is.skip(skip);
                    }
                    readLarge = false;
                }
            }
            return realSize==total?true:false;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }
}

测试结果:

20220308141023.mp4 合法: true
20220308141541.mp4 合法: false
20220308141120.mp4 合法: true
20220308141310.mp4 合法: true
20220308141502.mp4 合法: true
20220308141405.mp4 合法: true
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一种快速检测Mp4是否损坏的方法 的相关文章

  • Firefox 不支持 MP4?

    如果我将以下 URL 直接粘贴到 Firefox 的地址栏中 则视频可以正常播放 http distilleryvesper1 13 ak instagram com 744b42900fab11e3a34522000ae80008 101
  • 嵌入 mp4 视频时出现问题

    我正在尝试使用 html5 视频标签来嵌入 mp4 但我遇到了一些在不同浏览器中有所不同的问题 我的代码如下所示
  • 使用 gstreamer 1.12.2 将 MPEG-TS 分割为 MP4 文件

    我有一个 MPEG TS 文件 其中包含两个视频 音频流对 gst discoverer 1 0 Recorder Aug01 12 30 39 ts Analyzing Recorder Aug01 12 30 39 ts Done di
  • 为什么 PHP 会干扰我的 HTML5 MP4 视频?

    我正在编写一个提供 H 264 编码 MP4 视频的 Web 应用程序 在 Chrome 和 Safari 中 它通过 HTML5 视频标签来完成此操作 为了控制对这些视频的访问 它们的内容通过 PHP 使用非常简单的机制提供 header
  • 使用 PHP 读取 mp4 文件

    我正在尝试用 PHP 读取 mp4 文件 我现在正在做的是这样的 但这样我就无法跳过甚至返回 直到视频未加载 100 当然 当我直接从文件 video mp4 读取时 一切都很顺利 Thanks 您需要自己在 PHP 中实现跳过功能 这是一
  • 通过 MP4 进行直播

    我正在从事在线电视服务工作 目标之一是无需任何额外的浏览器插件 Flash 除外 即可播放视频 我决定使用 MP4 因为大多数 HTML5 浏览器和 Flash 作为后备 都支持它 这些视频由 FFMpeg 从服务器上的 ASF 进行转码
  • 将 mkv 转换为 h264 FFmpeg

    EDIT 这个问题已经变得非常流行 并且是搜索 convert mkv to h264 ffmpeg 的最佳结果之一 因此我认为对于任何偶然发现这个问题的人来说 添加这一点是适当的 而不是使用 ffmpeg i input mkv c v
  • 使用 ffmpeg 添加不透明度叠加

    我的 ffmpeg 有问题 我尝试在视频上添加 png 文件 我发现如何添加 只是我希望这个 png 文件有一些不透明度 我尝试了这条线 ffmpeg n i video mp4 i logo png filter complex sets
  • ffserver 可以播放 mp4 流吗?

    我尝试使用 ffserver 流式传输 mp4 文件的日子 我读过很多这样的问题 https superuser com questions 563591 streaming mp4 with ffmpeg https superuser
  • 使用 FFMPEG 从图像生成 2-fps mp4

    需要从一系列图像创建视频 视频需要具有低帧速率 这是我用来创建视频的命令 ffmpeg exe r 2 i images 3d jpg vcodec libx264 pix fmt yuvj420p output mp4 问题是 虽然通过
  • 使用 -vsync 0 选项时,从 ffmpeg 中的 mp4 提取帧到 jpg 格式会产生错误

    我正在尝试使用 ffmpeg 从 mp4 视频中提取所有帧 我使用以下命令 ffmpeg i Users raimundbuehler recordings 2022 01 24 000 exports 001 world mp4 vsyn
  • 如何使用 ffmpeg 从使用时间戳命名的帧创建视频

    我有一个充满框架的文件夹 其名称中的时间戳采用以下格式 im H M S MS png im 08 05 09 007324 png im 08 05 09 532857 png im 08 05 10 059340 png im 08 0
  • 获取 MP4 流长度

    我正在一个应用程序中工作 我们使用 IMediaDet 来获取流长度 现在我们开始使用 MP4 容器 问题是 当我尝试使用 MP4 文件使用 IMediaDet put fileName 时 我得到 HRESULT 2147024770 E
  • 在 Gstreamer 上流式传输 MP4 视频文件

    我第一次使用 gstreamer 并尝试使用 Gstreamer RTP 和 UDP 将 MP4 视频文件从服务器流式传输到客户端 我尝试使用的命令行 在服务器端 gst launch 1 0 v filesrc location file
  • VLC 流至 MP4 WEBM 和 Flash

    我正在尝试将视频从 IP 摄像机流式传输到我的 WordPress 网站 我希望我的流可以通过常见设备 Windows Mac Android 和 IOS 访问 目前我正在使用 VLC 进行流式传输 但我只能使用 flash 流 但我想做
  • MFCreateFMPEG4MediaSink 不生成 MSE 兼容的 MP4

    我正在尝试将 H 264 视频源流式传输到网络浏览器 Media Foundation 用于编码分段的 MPEG4 流 MFCreateFMPEG4MediaSink with MFTranscodeContainerType FMPEG4
  • 使用 imageio 和 Python 当帧率太低时视频是黑色的

    我有以下示例代码 import numpy as np writer imageio get writer test mp4 fps 1 max 800 resolution 256 for idx in range 1 max img n
  • Android,如何将元数据设置为MP4文件?

    我想将元数据设置为 MP4 文件 我通过以下方式创建 MP4 文件 new MediaMuxer mPath MediaMuxer OutputFormat MUXER OUTPUT MPEG 4 并且文件有元 Title unknown
  • Chromium 中的 MP4 编解码器支持

    我们已将 Chromium 嵌入式框架集成到我们的 Windows 游戏中 以允许我们从应用程序内渲染网页 并且一切正常 除了 MP4 视频 据我所知 由于许可问题 Chromium 不包含此编解码器 但任何人都可以提供有关我们如何添加支持
  • MP4 视频无法在 Firefox 上播放

    我有一个小型家庭服务器 可以托管多个项目 其中包括一些 MP4 示例视频 我一直在使用一个简单的

随机推荐