Jak otworzyć i naprawić plik wideo m4v lub mp4?


59

Wczoraj nagrywałem scenę za pomocą telefonu, ale nagle aplikacja uległa awarii i gdy próbuję otworzyć wygenerowany m4v, mówi, że jest uszkodzony.

Pobrałem pliki wideo (około 36 MB) na komputer i próbuję je otworzyć i naprawić. Czy możesz mi zasugerować, jak to zrobić?

Informacje o FFMPEG

Jak sugerowałem w komentarzach, próbuję sprawdzić, co FFMPEG mówi mi o tym pliku za pomocą tego polecenia

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

Oto wynik:

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

Ostatnie dwa wiersze są wyświetlane na czerwono.


Mój system operacyjny to Windows 7, ale w razie potrzeby mogę przygotować maszynę wirtualną z dystrybucją opartą na systemie Linux.
Drake

@slhck Dziękuję za pomoc, zrobiłem to, co zasugerowałeś i zaktualizowałem pytanie.
Drake

7
Ach, tego się spodziewałem. Atom MOOV to część danych potrzebnych do uzyskania dostępu do nieprzetworzonych strumieni wideo w kontenerze MP4 / M4V. Istnieje wiele narzędzi do naprawy wideo w Internecie, ale nie ufałbym większości z nich. Z pewnością możesz dać im szansę - po prostu nie płać za nic. To, co wygląda obiecująco, to Untrunk , który wydaje się być zakodowany dla tego konkretnego problemu (mianowicie brakującego atomu MOOV). Lub Atomowa Pietruszka . Powodzenia!
slhck

1
Jak naprawić zepsuty plik MP4 za pomocą AtomicParsley?
chovy

Odpowiedzi:


60

Możliwe jest naprawienie uszkodzonego pliku MP4 lub MP4 przy użyciu Untrunc .

Do tej metody potrzebujesz innego pliku wideo z tego samego urządzenia, który nie jest uszkodzony.

Jak zainstalować untrunc

Do kompilacji potrzebujesz instalacji Linuksa (najlepiej Ubuntu) i podstawowej umiejętności korzystania z wiersza poleceń. Możesz również pominąć tę część i uruchomić untruncza pomocą Dockera (patrz odpowiedź poniżej ), jeśli ją masz.

Oto co należy zrobić:

  1. Zainstaluj niektóre wstępnie wymagane biblioteki za pomocą tego polecenia:

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

  2. Pobierz kod źródłowy dla Untrunc z repozytorium GitHub (wybierz jedną metodę):

    • wget https://github.com/ponchio/untrunc/archive/master.zip && unzip master.zip && cd untrunc-master
    • lub git clone https://github.com/ponchio/untrunc.git && cd untrunc
  3. Skompiluj kod źródłowy za pomocą tego polecenia (wszystkie w jednym wierszu):

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

    (możesz spróbować pominąć ten krok i użyć gotowego pliku wykonywalnego, ale to nie działało dla mnie)

  4. Następnie możesz naprawić wideo. Potrzebujesz zarówno uszkodzonego wideo, jak i przykładowego działającego wideo.

Jak naprawić wideo

Znajdź inny działający film, najlepiej z tej samej kamery, najlepiej przynajmniej tak długi, jak zepsuty; także ta sama rozdzielczość, jeśli to możliwe (uważam, że to może pomóc, choć nie jest konieczne).

Uruchom to polecenie w folderze, w którym rozpakowałeś i skompilowałeś Untrunc, ale zamień /path/to/...bity na 2 pliki wideo:

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

Następnie powinien się odejść i, mam nadzieję, stworzyć plik do odtworzenia o nazwie broken-video_fixed.m4v

To już koniec!

VLC Media Player powinien teraz móc odtwarzać plik. Może jednak zgłaszać nieprawidłowe informacje o długości (Untrunc próbuje zgadnąć / rozwiązać problem, ale nie zawsze robi to poprawnie). Aby rozwiązać ten problem, spróbuj ponownie zakodować wideo za pomocą innego programu.

[Dzięki komentarzowi slhck za sugestię wypróbowania Untrunc.]

[Wielkie podziękowania dla Federico Ponchio za kodowanie Untrunc w pierwszej kolejności, aby rozwiązać ten dokładnie problem.]


Fajnie, dziękuję za dostarczenie tutaj pełnych instrukcji!
slhck

3
Dzięki @Alex zaktualizowałem link. Zabawne jest, że Readme na github opiera się na tej odpowiedzi!
sparrowt

1
Dałby rozwiązanie oparte na systemie Windows. < superuser.com/questions/938185/recover-incomplete-video-files >, ponieważ nie mam dostępu do Internetu w moich dystrybucjach linuksowych.
NIEBEZPIECZNY

2
FWIW nie stworzyło to dla mnie żadnych odtwarzalnych filmów - ale uruchomienie recovery_mp4_to_h264 za pośrednictwem wina działało dobrze.
Kompilator

1
Untrunc działało dla mnie, ale musiałem umieścić oba pliki wideo w podkatalogu ukrytego folderu .untrunc o nazwie untrunc-master. Następnie uruchom: ./untrunc goodfile.mp4 badfile.mp4 Plik 2 GB zajął około 3 minut i musiałem tylko ponownie zsynchronizować dźwięk. Wszystko inne było w porządku.
user8547,

8

Jeśli ktoś się na to natknie, spróbowałem też aplikacji, o której mówił sparrowt, ale to nie działało dla mnie (zobacz kilka raportów o błędach, które utworzyłem w repozytorium programistów). Może to dlatego, że nie był to plik MP4, ale plik MOV ...

Pomógł mi ten post: http://muzso.hu/2012/11/14/how-to-fix-a-broken-mp4-mov-video-ffmpeg-reports-moov-atom-not-found

Łączą się z programem o nazwie „Narzędzie naprawy wideo HD” ( http://grauonline.de/cmsimple2_6/en/?Solutions:HD_Video_Repair_Utility ), który jest znacznie tańszy niż Treasured ( http://aeroquartet.com/movierepair/repair ) . Wskazali nawet, że istnieje wcześniejsza wersja (wersja 1.5), która nic nie kosztuje ( http://nagasoft.cn/download/videorepair1.5.zip )!

Próbowałem naprawić plik przy użyciu wersji 1.5 i częściowo go uruchomiłem. Po ponownym kodowaniu za pomocą ffmpeg (dostałem kilka błędów), zdałem sobie sprawę, że część audio zniknęła. W dziennikach (na szczęście w narzędziu do naprawy wideo) nie było żadnej wzmianki o dźwięku po pewnym czasie. Wezmę to tak, jak jest ...


3
Adres URL DROPBOX jest martwy. znaleziona alternatywa: nagasoft.cn/download/videorepair1.5.zip
T.Todua

2
@ T.Todua, dzięki za powiadomienie. Zamieniłem dropbox-link na podany przez ciebie link.
SimonSimCity,

8

Możesz zainstalować docker(dostępny dla wszystkich głównych systemów operacyjnych) i uruchomić:

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

Składnia dotyczy Bash pod Linuksem lub macOS. Tutaj GOOD-reference-file.MP4i BAD-corrupt-file.md5oba muszą znajdować się w bieżącym katalogu, a katalog zostanie zamontowany /volw kontenerze Docker.

Przeczytaj pozostałe komentarze, aby uzyskać bardziej szczegółowe wyjaśnienia.

To było dla mnie najszybsze!


Dzięki @slhck, Dockerfilejest dostępny tutaj, jeśli ktoś chce zobaczyć, co to będzie działać, zanim uruchomi się go na twoim komputerze: github.com/synctree/docker-untrunc Teraz jest też Dockerfilew untruncrepozytorium - nie testowałem ani nie porównałem je szczegółowo, ale wspomnij o tym tutaj dla kompletności: github.com/ponchio/untrunc/blob/master/Dockerfile
sparrowt

7

@sparrowt Twoje bieżące instrukcje nie działały na mojej ostatniej instalacji Ubuntu 16.10. Podczas kompilowania untrunc wystąpił następujący błąd:

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();

Jak wyjaśniono w repozytorium untrunc , może być konieczne oddzielne pobranie libav zamiast używania wersji z repozytorium Ubuntu. Poniższy kod działał dla mnie:

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

To stworzyło plik o nazwie broken-video_fixed.mp4, który działał dla mnie. Dziękuję bardzo za zainicjowanie tego wątku.


1
Dziękuję Ci! W wierszu kompilacji untrunc miałem kilka błędów w stylu „niezdefiniowanego odwołania do` BZ2_bzDecompressInit '”, musiałem dodać -lbz2
Andrew Smart

Nie obsługuje dużych plików. Po prostu się poddaje.
Ken Sharp

Czy twój libav zawiera a h264dec.h? ponieważ track.cpppróbuje to dołączyć i nie mogę go znaleźć nigdzie: /
x29a

Ta zależność została dodana do commit github.com/ponchio/untrunc/commit/… 10 października 2017 r. Uważam, że teraz musisz załadować libav-12.2 zamiast libav-0.8.7
freeseek

Wreszcie udało się to uruchomić na Ubuntu 14.04.5 LTS. Musieli biec sudo apt-get install yasm, sudo apt-get install libbz2-deva do pokonania niezdefiniowanej odniesienie do „clock_gettime” dodaj -lrtdo końca g++wiersza poleceń (patrz stackoverflow.com/a/2418175/550712 ). Konwertuje około 2/3 mojego filmu.
Mark Berry

2

Jeśli untrunc nie obsługuje kodeka w twoim pliku, możesz spróbować go naprawić za pomocą edytora szesnastkowego:

  1. dostać inny plik o tym samym formacie, mam większy, ale prawdopodobnie każda długość będzie działać
  2. otwórz oba pliki w edytorze szesnastkowym
  3. zamień mdatsekcję w pliku „ok” na mdatsekcję w „uszkodzonym” pliku, bez nagłówka (tzn. skopiuj tylko bajty po „mdat”)
  4. prawdopodobnie już tak by działało, jeśli nie, 4 bajty przed „mdat” określają rozmiar mdatsekcji, bieżącą wartością będzie stary rozmiar ( mdatrozmiar sekcji pliku „ok” ), zamień go na nowy rozmiar („ uszkodzony „ mdatrozmiar sekcji pliku )

W końcu napisałem prosty program, aby to zrobić: https://github.com/golimarrrr/fix-3gp

Zarówno program, jak i ręcznie za pomocą edytora szesnastkowego powinny utworzyć ten sam ustalony plik


-3

Czy próbowałeś otworzyć plik za pomocą VLC Player ? Zwykle jest bardzo dobry w naprawie uszkodzonych plików.


8
Myślę, że może to dotyczyć plików AVI, w których indeks można wbudować w pamięć, ale w pliku MP4 błąd „nie znaleziono atomu moov” podczas przetwarzania ffmpeg nie odtwarza niczego w VLC.
niedz.

2
VLC również go nie odtwarza, w moim przypadku (plik .mov)
rogerdpack
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.