我有一个 Reolink 安全摄像头,它通过 FTP 将 .mp4 文件保存到本地服务器。然后我有自己的基于 Python 的应用程序来处理这些视频。在过去一年左右的时间里,它一直运行良好,尽管我经常注意到 Python 控制台(来自 OpenCV)中关于“错误读取标头”的警告,但它仍然有效,所以忽略了它。
由于获得了一台新服务器并重新安装了所有软件,这恰好意味着 Debian Linux、Python 和 OpenCV 的更新版本,它不再容忍错误并且无法加载这些视频。令人担忧的是,大约四分之一通过 FTP 保存的视频在我的 Python 应用程序中出现此错误,如果我尝试通过 FFMPEG 在我的服务器或我的 (Mac) 笔记本电脑上加载它们,我会收到错误[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,所以有不止一个编解码器对这些标头不满意!)
- 在处理之前尝试“修复”视频。作为解决方案,这可能会有一些里程数,但感觉效率很低,所以如果可能的话宁愿避免......但它是最后的手段!
非常感谢!
样本 MP4 是分段的,因此元数据是每个片段,而不是样本(即帧)的全局索引。在每个片段的元数据中,都有一个轨道运行框
trun
,其中包含片段中所有样本的数据。2017 年 10 月 (ffmpeg 4.0+) 发生了变化,如果 trun 框指示片段中存储了 0 个样本,ffmpeg 将退出。mp4box 或旧版本的 ffmpeg 不会失败,因此您可以使用它们将文件重新混合为常规 MP4。
或者