25% do meu .mp4 tem "erro ao ler o cabeçalho" no FFMPEG, OpenCV - mas todos os vídeos são reproduzidos bem

25% do meu .mp4 tem "erro ao ler o cabeçalho" no FFMPEG, OpenCV - mas todos os vídeos são reproduzidos bem

Eu tenho uma câmera de segurança Reolink, que salva arquivos .mp4 via FTP em um servidor local. Eu tenho então meu próprio aplicativo baseado em Python processando esses vídeos. Tem funcionado bem há cerca de um ano, embora muitas vezes eu tenha notado avisos no console Python (do OpenCV) sobre "erro ao ler o cabeçalho", mas funcionou mesmo assim, então o ignorei.

Desde que adquiriu um novo servidor e reinstalou todo o software, o que significa versões atualizadas do Debian Linux, Python e OpenCV, ele não tolera mais os erros e não consegue carregar esses vídeos. É preocupante que cerca de 1 em cada 4 vídeos salvos via FTP apresentam esse erro em meu aplicativo Python e, se eu tentar carregá-los via FFMPEG em meu servidor ou em meu laptop (Mac), recebo o erro[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7ff492000400] error reading header [path]: Operation not permitted

Coloquei um dos vídeos no Dropbox para que vocês possam ver:https://www.dropbox.com/s/tu4ddegh6yn05nu/ErrorReadingHeader.mp4?dl=0

Alguém tem alguma idéia do que está causando isso ou como consertar? Acho que tenho algumas opções, mas não tenho informações suficientes para progredir em nenhuma delas:

  • Corrija os vídeos para que não fiquem corrompidos. Perguntei à Reolink, o fabricante, se eles podem me dar alguma luz...
  • Faça o FFMPEG etc tolerar os erros. Não tenho certeza de como... também não tenho certeza de qual codec o OpenCV está usando (eu sei que definitivamente não é FFMPEG, então há mais de um codec que não está satisfeito com esses cabeçalhos!)
  • Tente ‘reparar’ os vídeos antes de processá-los. Pode haver alguma quilometragem nisso como solução, mas parece muito ineficiente, então prefiro evitar, se possível... mas está lá como recurso final!

Muito obrigado!

Responder1

A amostra MP4 é fragmentada e, portanto, em vez de ter um índice global para amostras, ou seja, quadros, os metadados são por fragmento. Dentro dos metadados de cada fragmento, há uma caixa de execução de trilha trunque contém dados para todas as amostras dentro do fragmento. Houve uma alteração feita em outubro de 2017 (ffmpeg 4.0+) onde o ffmpeg seria encerrado se a caixa trun indicasse que 0 amostras foram armazenadas dentro do fragmento.

mp4box ou versões mais antigas do ffmpeg não falham, então você pode usá-los para remuxar o arquivo para MP4s normais.

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

ou

mp4box -add in.mp4 -new out.mp4

informação relacionada