我的 .mp4 中有 25% 在 FFMPEG、OpenCV 中出现“读取标题错误” - 但所有视频都可以正常播放

我的 .mp4 中有 25% 在 FFMPEG、OpenCV 中出现“读取标题错误” - 但所有视频都可以正常播放

我有一个 Reolink 安全摄像头,它通过 FTP 将 .mp4 文件保存到本地服务器。然后我有一个基于 Python 的应用程序来处理这些视频。在过去一年左右的时间里,它一直运行良好,尽管我经常注意到 Python 控制台(来自 OpenCV)中出现有关“读取标题错误”的警告,但它无论如何都能正常工作,所以忽略了它。

自从购买了一台新服务器并重新安装了所有软件(这意味着 Debian Linux、Python 和 OpenCV 的更新版本)后,它就无法再容忍这些错误,无法加载这些视频。令人担忧的是,通过 FTP 保存的视频中,大约有四分之一在我的 Python 应用程序中出现此错误,如果我尝试在我的服务器或我的 (Mac) 笔记本电脑上通过 FFMPEG 加载它们,我会收到错误[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7ff492000400] error reading header [path]: Operation not permitted

我把其中一个视频放在了 Dropbox 上,以便你可以看到:https://www.dropbox.com/s/tu4ddegh6yn05nu/ErrorReadingHeader.mp4?dl=0

有人知道是什么原因造成的,或者如何解决吗?我想我有几个选择,但没有足够的信息来推进其中任何一个:

  • 修复视频,避免损坏。我已询问制造商 Reolink,看他们能否提供任何解释...
  • 让 FFMPEG 等容忍错误。不确定如何……也不确定 OpenCV 使用的是哪种编解码器(我知道它肯定不是 FFMPEG,所以有多个编解码器不满意这些标头!)
  • 尝试在处理之前“修复”视频。作为一种解决方案,这可能有一些好处,但感觉效率很低,所以如果可能的话最好避免……但这是最后的手段!

多谢!

答案1

样本 MP4 是分段的,因此元数据不是针对样本(即帧)的全局索引,而是针对每个片段。在每个片段的元数据中,都有一个轨道运行框,trun其中包含片段内所有样本的数据。2017 年 10 月(ffmpeg 4.0+)进行了更改,如果轨道运行框指示片段内存储了 0 个样本,则 ffmpeg 将放弃。

mp4box 或旧版本的 ffmpeg 不会失败,因此您可以使用它们将文件重新混合为常规 MP4。

ffmpeg-3.4 -i in.mp4 -c copy out.mp4

或者

mp4box -add in.mp4 -new out.mp4

相关内容