我有一个 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