Como abrir e reparar um arquivo de vídeo m4v ou mp4?


59

Ontem eu estava filmando uma cena com meu telefone, mas de repente o aplicativo travou e quando tento abrir o m4v gerado ele diz que está corrompido.

Eu baixei os arquivos de vídeo (cerca de 36 MB) no meu PC e estou tentando abri-lo e repará-lo. Você pode me sugerir uma maneira de fazer isso?

Informações FFMPEG

Conforme sugerido nos comentários, tento verificar o que o FFMPEG me diz sobre esse arquivo com este comando

ffmpeg.exe -i VID_20120425_144739.m4v -c:v copy -c:a copy out.mp4 2> log.txt

Aqui está o resultado:

ffmpeg version N-40126-ga4b58fd Copyright (c) 2000-2012 the FFmpeg developers
  built on Apr 26 2012 03:29:50 with gcc 4.6.3
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-runtime-cpudetect --enable-avisynth --enable-bzlib --enable-frei0r --enable-libass --enable-libcelt --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-libnut --enable-libopenjpeg --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libutvideo --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      51. 47.100 / 51. 47.100
  libavcodec     54. 15.100 / 54. 15.100
  libavformat    54.  3.100 / 54.  3.100
  libavdevice    53.  4.100 / 53.  4.100
  libavfilter     2. 72.100 /  2. 72.100
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0. 11.100 /  0. 11.100
  libpostproc    52.  0.100 / 52.  0.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 003fc940] moov atom not found
VID_20120425_144739.m4v: Invalid data found when processing input

As duas últimas linhas são exibidas em vermelho.


Meu sistema operacional é o Windows 7, mas, se necessário, posso preparar uma máquina virtual com a distribuição Linux.
Drake

@slhck Obrigado pela ajuda, fiz o que você sugeriu e atualizou a pergunta.
Drake

7
Ah, era o que eu esperava. O átomo MOOV é um dado necessário para acessar os fluxos de vídeo não processados ​​dentro do contêiner MP4 / M4V. Existem muitas ferramentas de "reparo de vídeo" on-line, mas eu não confiaria na maioria delas. Você pode certamente dar-lhes uma chance - apenas não pague por nada. O que parece promissor é Untrunk , que parece estar codificado para esse problema exato (ou seja, um átomo MOOV ausente). Ou AtomicParsley . Boa sorte!
slhck

11
Como faço para corrigir um mp4 quebrado com o AtomicParsley?
chovy

Respostas:


60

É possível reparar o arquivo mp4 ou m4v quebrado usando Untrunc .

Para esse método, você precisa de outro arquivo de vídeo do mesmo dispositivo que não esteja quebrado.

Como instalar untrunc

Para compilação, você precisa de uma instalação Linux (idealmente Ubuntu) e capacidade básica de usar uma linha de comando. Você também pode pular esta parte e executar untruncpelo Docker (veja a resposta abaixo ), se tiver.

Isto é o que fazer:

  1. Instale algumas bibliotecas pré-requisitos com este comando:

    sudo apt-get install libavformat-dev libavcodec-dev libavutil-dev

  2. Obtenha o código-fonte para Untrunc no repositório do GitHub (escolha um método):

    • wget https://github.com/ponchio/untrunc/archive/master.zip && unzip master.zip && cd untrunc-master
    • ou git clone https://github.com/ponchio/untrunc.git && cd untrunc
  3. Compile o código-fonte usando este comando (todos em uma linha):

    g++ -o untrunc file.cpp main.cpp track.cpp atom.cpp mp4.cpp -L/usr/local/lib -lavformat -lavcodec -lavutil

    (você pode tentar pular esta etapa e usar o executável fornecido, mas não funcionou para mim)

  4. Então você pode consertar o vídeo. Você precisa do vídeo quebrado e de um exemplo de vídeo de trabalho.

Como consertar o vídeo

Encontre outro vídeo de trabalho, idealmente da mesma câmera e de preferência pelo menos contanto que o quebrado; também a mesma resolução, se possível (acredito que isso pode ajudar, embora não seja essencial).

Execute este comando na pasta em que você descompactou e compilou o Untrunc, mas substitua os /path/to/...bits pelos seus 2 arquivos de vídeo:

./untrunc /path/to/working-video.m4v /path/to/broken-video.m4v

Em seguida, ele deve girar e produzir um arquivo reproduzível chamado broken-video_fixed.m4v

É isso que você está pronto!

O VLC Media Player agora deve poder reproduzir o arquivo. No entanto, pode estar relatando as informações incorretas de comprimento (Untrunc tenta adivinhar / resolver isso, mas nem sempre as corrige). Para corrigir isso, tente recodificar o vídeo por outro programa.

[Obrigado ao comentário de slhck pela sugestão de tentar Untrunc.]

[Muito obrigado a Federico Ponchio por codificar Untrunc em primeiro lugar, para resolver esse problema exato.]


Legal, obrigado por fornecer as instruções completas aqui!
Slhck 16/05

3
Obrigado @Alex Atualizei o link. Divertidamente, o Leia-me no github é baseado nesta resposta!
Sparrowt

11
Daria uma solução baseada no Windows. < superuser.com/questions/938185/recover-incomplete-video-files >, pois não tenho acesso à Internet nas minhas distros linux.
RogUE

2
FWIW, isso não produziu nenhum vídeo reproduzível para mim - mas executar o recover_mp4_to_h264 via wine funcionou bem.
O compilador de

11
Untrunc funcionou para mim, mas tive que colocar os dois arquivos de vídeo no subdiretório da pasta .untrunc oculta denominada untrunc-master. Em seguida, execute: ./untrunc goodfile.mp4 badfile.mp4 Demorou cerca de 3 minutos para um arquivo de 2 gb e só precisei sincronizar novamente o áudio. Tudo o resto estava bem.
user8547

8

Se alguém tropeçar nisso, eu também tentei falar sobre o aplicativo sparrowt, mas não funcionou para mim (veja alguns relatórios de erros que eu criei no repositório de desenvolvedores). Talvez seja porque não era um arquivo mp4, mas um arquivo MOV ...

O que me ajudou foi este post: http://muzso.hu/2012/11/14/how-to-fix-a-broken-mp4-mov-video-ffmpeg-reports-moov-atom-not-found

Eles vinculam a um programa chamado "HD Video Repair Utility" ( http://grauonline.de/cmsimple2_6/en/?Solutions:HD_Video_Repair_Utility ), que é muito mais barato que o Treasured ( http://aeroquartet.com/movierepair/repair ) . Eles até apontaram que havia uma versão anterior (versão 1.5) que não custava nada ( http://nagasoft.cn/download/videorepair1.5.zip )!

Tentei reparar o arquivo usando a versão 1.5 e o consegui trabalhar parcialmente. Depois de recodificar com o ffmpeg (obtive alguns erros), percebi que uma parte do áudio havia desaparecido. Nos registros (felizmente, o Video Repair Utility possui alguns), não houve mais menções ao áudio após um determinado período. Vou levá-lo como está ...


3
O URL DROPBOX está morto. alternativa encontrada: nagasoft.cn/download/videorepair1.5.zip
T.Todua 3/17

2
@ T.Todua, obrigado por notificar. Substituí o link da caixa de depósito pelo link que você forneceu.
SimonSimCity

8

Você pode instalar docker(disponível para todos os principais sistemas operacionais) e executar:

docker run -v $(pwd):/vol -it synctree/untrunc /vol/GOOD-reference-file.MP4 /vol/BAD-corrupt-file.mdt

A sintaxe é para o Bash no Linux ou macOS. Aqui, GOOD-reference-file.MP4e BAD-corrupt-file.md5deve ser tanto em seu diretório atual, e o diretório será montado /volno recipiente Docker.

Leia os outros comentários para obter explicações mais detalhadas.

Este foi o mais rápido para mim!


Obrigado @slhck, ele Dockerfileestá disponível aqui se alguém quiser ver o que será executado antes de executá-lo no seu computador: github.com/synctree/docker-untrunc Também há um Dockerfileno untruncrepositório real agora - eu não testei nem comparei eles em detalhes, mas mencione-o aqui para obter detalhes: github.com/ponchio/untrunc/blob/master/Dockerfile
sparrowt

7

@sparrowt Suas instruções atuais não funcionaram na minha recente instalação do Ubuntu 16.10. Eu recebi o seguinte erro ao compilar sem interrupção:

track.cpp: In member function ‘int Codec::getLength(unsigned char*, int)’:
track.cpp:204:40: error: ‘avcodec_alloc_frame’ was not declared in this scope
   AVFrame *frame = avcodec_alloc_frame();

Conforme explicado no repositório não- truncado , pode ser necessário baixar o libav separadamente, em vez de usar a versão no repositório Ubuntu. O código a seguir funcionou para mim:

sudo apt-get install unzip yasm g++ zlib1g-dev libbz2-dev
cd /tmp/
wget https://github.com/ponchio/untrunc/archive/master.zip
unzip master.zip
cd untrunc-master
wget http://libav.org/releases/libav-12.2.tar.xz
tar xvf libav-12.2.tar.xz
cd libav-12.2
./configure
make
cd ..
g++ -o untrunc file.cpp main.cpp track.cpp atom.cpp mp4.cpp -I./libav-12.2 -L./libav-12.2/libavformat -lavformat -L./libav-12.2/libavcodec -lavcodec -L./libav-12.2/libavresample -lavresample -L./libav-12.2/libavutil -lavutil -lpthread -lz -lbz2
./untrunc /path/to/working-video.mp4 /path/to/broken-video.mp4

Isso criou um arquivo chamado broken-video_fixed.mp4 que funcionou para mim. Muito obrigado por iniciar este tópico.


11
Obrigado! Na linha de compilação untrunc Eu tive alguns erros ao longo das linhas de "undefined reference to` BZ2_bzDecompressInit '", eu tive que adicionar -lbz2
Andrew inteligente

Não suporta arquivos grandes. Apenas desiste.
Ken afiada

Seu libav contém um h264dec.h? porque track.cppestá tentando incluí-lo e eu não consigo encontrá-lo em qualquer lugar: /
x29a 17/11

Essa dependência foi adicionada ao commit github.com/ponchio/untrunc/commit/… em 10 de outubro de 2017. Acredito que agora você precisa descarregar o libav-12.2 em vez do libav-0.8.7
freeseek

Finalmente consegui que isso funcionasse no Ubuntu 14.04.5 LTS. Teve que correr sudo apt-get install yasm, sudo apt-get install libbz2-deve, para superar uma referência indefinida para 'clock_gettime', adicione -lrtao final da g++linha de comando (veja stackoverflow.com/a/2418175/550712 ). Ele converteu cerca de 2/3 do meu vídeo.
Mark Berry

2

Caso o untrunc não suporte o codec dentro do seu arquivo, tente corrigi-lo com um editor hexadecimal:

  1. obter outro arquivo com o mesmo formato, eu tenho um maior, mas provavelmente qualquer tamanho funcionará
  2. abra os dois arquivos em um editor hexadecimal
  3. substitua a mdatseção no arquivo "ok" pela mdatseção no arquivo "quebrado", sem o cabeçalho (ou seja, copie apenas os bytes após 'mdat')
  4. provavelmente já funcionaria assim, caso contrário, os 4 bytes antes de 'mdat' especificarem o tamanho da mdatseção, o valor atual será o tamanho antigo ( mdattamanho da seção do arquivo "ok" ), substitua-o pelo novo tamanho (" quebrado " mdattamanho da seção do arquivo )

Acabei codificando um programa simples para fazer isso: https://github.com/golimarrrr/fix-3gp

Tanto o programa quanto manualmente usando o editor hexadecimal devem criar o mesmo arquivo fixo


-3

Você tentou abrir o arquivo com o VLC Player ? Geralmente é muito bom em reparar arquivos danificados.


8
Eu acho que isso pode se aplicar a arquivos AVI, onde o índice pode ser incorporado na memória, mas um arquivo MP4, um erro de "átomo de moov não encontrado" durante o processamento do ffmpeg, não reproduz nada no VLC.
Sun

2
VLC não consegue reproduzi-lo tão bem, no meu caso (arquivo .mov)
rogerdpack
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.