Ich habe eine Reolink-Überwachungskamera, die MP4-Dateien per FTP auf einem lokalen Server gespeichert hat. Ich habe dann meine eigene Python-basierte Anwendung, die diese Videos verarbeitet. Sie funktioniert seit etwa einem Jahr einwandfrei, obwohl ich in der Python-Konsole (von OpenCV) häufig Warnungen über „Fehler beim Lesen des Headers“ bemerkt habe, aber sie funktionierte trotzdem, also habe ich sie ignoriert.
Seit ich einen neuen Server habe und die gesamte Software neu installiert habe, was zufällig aktualisierte Versionen von Debian Linux, Python und OpenCV bedeutet, toleriert es die Fehler nicht mehr und kann diese Videos nicht laden. Beunruhigenderweise tritt bei etwa einem Viertel der über FTP gespeicherten Videos dieser Fehler in meiner Python-App auf, und wenn ich versuche, sie über FFMPEG entweder auf meinem Server oder auf meinem (Mac-)Laptop zu laden, erhalte ich den Fehler[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7ff492000400] error reading header [path]: Operation not permitted
Ich habe eines der Videos auf Dropbox gestellt, damit Sie es sehen können:https://www.dropbox.com/s/tu4ddegh6yn05nu/ErrorReadingHeader.mp4?dl=0
Hat jemand eine Idee, woran das liegt oder wie man es beheben kann? Ich denke, ich habe ein paar Möglichkeiten, aber ich habe nicht genug Informationen, um eine davon weiterzuverfolgen:
- Reparieren Sie die Videos, damit sie nicht beschädigt werden. Ich habe den Hersteller Reolink gefragt, ob er Licht ins Dunkel bringen kann …
- Sorgen Sie dafür, dass FFMPEG usw. die Fehler tolerieren. Ich bin mir nicht sicher, wie ... und auch nicht sicher, welchen Codec OpenCV verwendet (ich weiß, dass es definitiv nicht FFMPEG ist, also gibt es mehr als einen Codec, der mit diesen Headern nicht zufrieden ist!)
- Versuchen Sie, die Videos vor der Verarbeitung zu „reparieren“. Dies ist möglicherweise eine brauchbare Lösung, fühlt sich aber sehr ineffizient an, daher würde ich es nach Möglichkeit lieber vermeiden … aber es ist nur der letzte Ausweg!
Vielen Dank!
Antwort1
Die MP4-Beispieldatei ist fragmentiert, sodass die Metadaten pro Fragment vorliegen, anstatt einen globalen Index für die Beispiele, d. h. Frames, zu haben. Innerhalb der Metadaten jedes Fragments gibt es eine Track-Run-Box, trun
die Daten für alle Beispiele innerhalb des Fragments enthält. Im Oktober 2017 (ffmpeg 4.0+) wurde eine Änderung vorgenommen, bei der ffmpeg abgebrochen wurde, wenn die Run-Box anzeigte, dass 0 Beispiele innerhalb des Fragments gespeichert waren.
Bei mp4box oder älteren Versionen von ffmpeg treten keine Fehler auf, Sie können sie also zum Remuxen der Datei in normale MP4s verwenden.
ffmpeg-3.4 -i in.mp4 -c copy out.mp4
oder
mp4box -add in.mp4 -new out.mp4