Làm cách nào để mở và sửa chữa tệp video m4v hoặc mp4?


59

Hôm qua tôi đang quay một cảnh bằng điện thoại của mình nhưng đột nhiên ứng dụng bị sập và khi tôi cố mở m4v thì nó báo bị hỏng.

Tôi đã tải xuống các tệp video (khoảng 36 MB) trên PC của mình và tôi đang cố gắng mở và sửa chữa nó. Bạn có thể gợi ý cho tôi một cách để làm điều đó?

Thông tin FFMPEG

Như đã đề xuất trong các bình luận, tôi thử kiểm tra xem FFMPEG nói gì về tập tin đó với lệnh này

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

Đây là kết quả:

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

Hai dòng mới nhất được hiển thị màu đỏ.


HĐH của tôi là Windows 7 nhưng nếu cần tôi có thể chuẩn bị một máy ảo với bản phân phối dựa trên Linux.
Drake

@slhck Cảm ơn bạn đã giúp đỡ, tôi đã làm những gì bạn đề xuất và cập nhật câu hỏi.
Drake

7
Ah, đó là những gì tôi mong đợi. Nguyên tử MOOV là một phần dữ liệu cần thiết để truy cập các luồng video thô bên trong thùng chứa MP4 / M4V. Có rất nhiều công cụ "sửa chữa video" trực tuyến, nhưng tôi không tin tưởng hầu hết chúng. Bạn chắc chắn có thể cung cấp cho họ một shot mặc dù - chỉ cần không trả tiền cho bất cứ điều gì. Những gì có vẻ hứa hẹn là Untrunk , dường như được mã hóa cho vấn đề chính xác này (cụ thể là một nguyên tử MOOV bị thiếu). Hoặc nguyên tử . Chúc may mắn!
slhck

1
Làm cách nào để sửa lỗi mp4 bị hỏng với AtomicParsley?
chovy

Câu trả lời:


60

Có thể sửa tệp mp4 hoặc m4v bị hỏng bằng Untrunc .

Đối với phương pháp này, bạn cần một tệp video khác từ cùng một thiết bị không bị hỏng.

Cài đặt thế nào untrunc

Để biên dịch, bạn cần cài đặt Linux (lý tưởng là Ubuntu) và khả năng cơ bản để sử dụng một dòng lệnh. Bạn cũng có thể bỏ qua phần này và chạy untruncqua Docker (xem câu trả lời bên dưới ), nếu bạn có phần đó.

Đây là những gì để làm:

  1. Cài đặt một số thư viện cần thiết với lệnh này:

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

  2. Lấy mã nguồn cho Untrunc từ repo GitHub (chọn một phương thức):

    • wget https://github.com/ponchio/untrunc/archive/master.zip && unzip master.zip && cd untrunc-master
    • hoặc là git clone https://github.com/ponchio/untrunc.git && cd untrunc
  3. Biên dịch mã nguồn bằng lệnh này (tất cả một dòng):

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

    (bạn có thể thử bỏ qua bước này và sử dụng tệp thực thi được cung cấp sẵn, nhưng nó không hoạt động với tôi)

  4. Sau đó, bạn thực sự có thể sửa video. Bạn cần cả video bị hỏng và một video làm việc mẫu.

Cách sửa video

Tìm một video làm việc khác, lý tưởng nhất là từ cùng một máy ảnh và tốt nhất là miễn là video bị hỏng; cũng có độ phân giải tương tự nếu có thể (tôi tin rằng điều này có thể giúp ích mặc dù không cần thiết).

Chạy lệnh này trong thư mục mà bạn đã giải nén và biên dịch Untrunc nhưng thay thế các /path/to/...bit bằng 2 tệp video của bạn:

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

Sau đó, nó sẽ rời đi và hy vọng tạo ra một tập tin có thể chơi được gọi là broken-video_fixed.m4v

Thế là xong!

VLC Media Player bây giờ có thể phát tệp. Tuy nhiên, nó có thể báo cáo thông tin độ dài sai (Untrunc cố gắng đoán / giải quyết vấn đề này, nhưng không phải lúc nào cũng đúng). Để khắc phục điều này, hãy thử mã hóa lại video thông qua một chương trình khác.

[Cảm ơn bình luận của slhck về đề xuất dùng thử Untrunc.]

[Rất cám ơn Federico Ponchio đã mã hóa Untrunc ngay từ đầu, để giải quyết vấn đề chính xác này.]


Thật tuyệt, cảm ơn vì đã cung cấp hướng dẫn đầy đủ ở đây!
slhck

3
Cảm ơn @Alex tôi đã cập nhật liên kết. Thật thú vị là Readme trên github dựa trên câu trả lời này!
sparrowt

1
Sẽ đưa ra một giải pháp dựa trên cửa sổ. < superuser.com/questions/938185/recover-incomplete-video-files > vì tôi không có quyền truy cập internet trong các bản phân phối linux của mình.
RogUE

2
FWIW điều này không tạo ra bất kỳ video có thể phát nào cho tôi - nhưng chạy recovery_mp4_to_h264 qua rượu vang hoạt động tốt.
Trình biên dịch

1
Untrunc làm việc cho tôi, nhưng tôi phải đặt cả hai tệp video vào thư mục con của thư mục .untrunc ẩn có tên untrunc-master. Sau đó, chạy: ./untrunc goodfile.mp4 badfile.mp4 Mất khoảng 3 phút cho tệp 2gb và tôi chỉ phải đồng bộ lại âm thanh. Mọi thứ khác đều ổn.
dùng8547

8

Nếu ai đó vấp phải điều này, tôi cũng đã thử ứng dụng mà sparrowt đang nói đến, nhưng nó không hoạt động với tôi (xem một số báo cáo lỗi tôi đã tạo trong kho lưu trữ của nhà phát triển). Có lẽ điều này là do đó không phải là tệp mp4 mà là tệp MOV ...

Điều giúp ích cho tôi là bài đăng này: http://muzso.hu/2012/11/14/how-to-fix-a-broken-mp4-mov-video-ffmpeg-reports-moov-atom-not-found

Họ liên kết với một chương trình có tên là "Tiện ích sửa chữa video HD" ( http://grauonline.de/cmsimple2_6/en/?Solutions:HD_Video_Repair_Utility ), rẻ hơn nhiều so với Treasured ( http://aeroquartet.com/movierepair/repair ) . Họ thậm chí còn chỉ ra rằng, có một phiên bản trước đó của nó (phiên bản 1.5) mà không tốn bất kỳ chi phí nào ( http://nagasoft.cn/doad/videore Pair1.5.zip )!

Tôi đã thử sửa chữa tệp bằng phiên bản 1.5 và nó đã hoạt động một phần. Sau khi mã hóa lại bằng ffmpeg (có một số lỗi ở đó), tôi nhận ra rằng một phần của âm thanh đã biến mất. Trong nhật ký (rất vui là Tiện ích sửa chữa video có một số), không có đề cập thêm về âm thanh sau một thời gian nhất định. Tôi sẽ coi nó như là ...


3
Url DROPBOX đã chết. tìm thấy thay thế: nagasoft.cn/doad/videore Pair1.5.zip
T.Todua

2
@ T.Todua, cảm ơn đã thông báo. Tôi đã thay thế liên kết dropbox bằng liên kết bạn cung cấp.
SimonSimCity

8

Bạn có thể cài đặt docker(có sẵn cho tất cả các hệ điều hành chính) và chạy:

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

Cú pháp dành cho Bash trong Linux hoặc macOS. Ở đây, GOOD-reference-file.MP4BAD-corrupt-file.md5cả hai phải nằm trong thư mục hiện tại của bạn và thư mục sẽ được gắn vào /voltrong Docker container.

Đọc các ý kiến ​​khác xung quanh để giải thích sâu hơn.

Đây là cách nhanh nhất đối với tôi!


Cảm ơn @slhck, Dockerfilecó sẵn ở đây nếu bất cứ ai muốn xem cái này sẽ chạy trước khi thực hiện nó trên máy tính của bạn: github.com/synctree/docker-untrunc Hiện tại cũng có một kho lưu trữ Dockerfilethực tế untrunc- Tôi chưa kiểm tra hoặc so sánh chúng chi tiết nhưng đề cập đến nó ở đây cho đầy đủ: github.com/ponchio/untrunc/blob/master/Dockerfile
sparrowt

7

@sparrowt Các hướng dẫn hiện tại của bạn không hoạt động trên bản cài đặt Ubuntu 16.10 gần đây của tôi. Tôi đã gặp lỗi sau khi biên dịch không đúng:

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

Như đã giải thích trong untrunc kho, bạn có thể cần phải tải về libav riêng chứ không phải sử dụng phiên bản trong kho Ubuntu. Các mã sau đây làm việc cho tôi:

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

Điều này đã tạo ra một tệp có tên broken-video_fixed.mp4 hoạt động với tôi. Cảm ơn bạn rất nhiều vì đã bắt đầu chủ đề này.


1
Cảm ơn bạn! Trên dòng biên dịch chưa được viết, tôi có một vài lỗi dọc theo dòng "tham chiếu không xác định đến` BZ2_bzDecompressInit '", tôi đã phải thêm -lbz2
Andrew Smart

Nó không thể xử lý các tệp lớn. Chỉ cần bỏ cuộc.
Ken Sharp

Libav của bạn có phải là một h264dec.h? bởi vì track.cppđang cố gắng bao gồm nó và tôi không thể tìm thấy nó ở bất cứ đâu: /
x29a

Sự phụ thuộc đó đã được thêm vào với cam kết github.com/ponchio/untrunc/commit/ vào ngày 10 tháng 10 năm 2017. Tôi tin rằng bây giờ bạn phải donwload libav-12.2 thay vì libav-0.8.7
freeseek

Cuối cùng, điều này đã hoạt động trên Ubuntu 14.04.5 LTS. Phải chạy sudo apt-get install yasm, sudo apt-get install libbz2-devvà, để vượt qua một tài liệu tham khảo không xác định để 'clock_gettime', thêm -lrtvào cuối g++dòng lệnh (xem stackoverflow.com/a/2418175/550712 ). Nó đã chuyển đổi khoảng 2/3 video của tôi.
Mark Berry

2

Trong trường hợp unsrunc không hỗ trợ codec bên trong tệp của bạn, bạn có thể thử sửa nó bằng trình soạn thảo hex:

  1. lấy một tệp khác có cùng định dạng, tôi có một tệp lớn hơn nhưng có lẽ độ dài bất kỳ sẽ hoạt động
  2. mở cả hai tập tin trong trình soạn thảo hex
  3. thay thế mdatphần trong tệp "ok" bằng mdatphần trong tệp "bị hỏng", không có tiêu đề (tức là chỉ sao chép các byte sau 'mdat')
  4. nó có thể đã hoạt động như vậy, nếu không, 4 byte trước 'mdat' chỉ định kích thước của mdatphần, giá trị hiện tại sẽ là kích thước phần cũ ("ok" mdatkích thước phần tệp ), thay thế nó bằng kích thước mới (" bị hỏng " mdatkích thước phần tập tin )

Cuối cùng tôi đã mã hóa một chương trình đơn giản để làm điều đó: https://github.com/golimarrrr/fix-3gp

Cả chương trình và bằng tay sử dụng trình soạn thảo hex sẽ tạo cùng một tệp cố định


-3

Bạn đã thử mở tệp bằng VLC Player chưa? Nó thường khá tốt trong việc sửa chữa các tập tin bị hư hỏng.


8
Tôi nghĩ rằng điều này có thể áp dụng cho các tệp AVI nơi chỉ mục có thể được tích hợp vào bộ nhớ, nhưng tệp MP4 có lỗi "không tìm thấy nguyên tử moov" trong quá trình xử lý ffmpeg không phát bất cứ điều gì trong VLC.
CN

2
VLC cũng không chơi được, trong trường hợp của tôi (tệp .mov)
rogerdpack
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.