25% моих .mp4 имеют «ошибку чтения заголовка» в FFMPEG, OpenCV, но все видео воспроизводятся нормально

25% моих .mp4 имеют «ошибку чтения заголовка» в FFMPEG, OpenCV, но все видео воспроизводятся нормально

У меня есть камера безопасности Reolink, которая сохраняет файлы .mp4 через FTP на локальном сервере. Затем у меня есть собственное приложение на Python, обрабатывающее эти видео. Оно работало нормально в течение последнего года или около того, хотя я часто замечал предупреждения в консоли Python (из OpenCV) об «ошибке чтения заголовка», но оно все равно работало, поэтому я проигнорировал его.

С тех пор, как я получил новый сервер и переустановил все программное обеспечение, что означает обновленные версии Debian Linux, Python и OpenCV, он больше не терпит ошибок и не может загрузить эти видео. Беспокоит то, что примерно 1 из 4 видео, сохраненных через 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, так что есть больше, чем один кодек, который не доволен этими заголовками!)
  • Попробуйте «исправить» видео перед обработкой. В этом может быть некоторая польза как в решении, но оно кажется очень неэффективным, поэтому лучше избегать его, если возможно... но это есть как последнее средство!

Большое спасибо!

решение1

Образец MP4 фрагментирован, поэтому вместо глобального индекса для образцов, т. е. кадров, метаданные по фрагменту. В метаданных каждого фрагмента есть поле track run, trunв котором есть данные для всех образцов в пределах фрагмента. В октябре 2017 г. (ffmpeg 4.0+) было внесено изменение, при котором ffmpeg выходил из строя, если поле trun указывало, что во фрагменте сохранено 0 образцов.

mp4box или более старые версии ffmpeg не дают сбоев, поэтому вы можете использовать их для ремикса файла в обычные MP4.

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

или

mp4box -add in.mp4 -new out.mp4

Связанный контент