我有一個 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+)進行了一項更改,如果 trun box 指示片段中儲存了 0 個樣本,則 ffmpeg 將退出。
mp4box 或舊版的 ffmpeg 不會失敗,因此您可以使用它們將檔案重新混合為常規 MP4。
ffmpeg-3.4 -i in.mp4 -c copy out.mp4
或者
mp4box -add in.mp4 -new out.mp4