วิธีการเปิดและซ่อมแซมไฟล์วิดีโอ m4v หรือ mp4


59

เมื่อวานนี้ฉันถ่ายทำฉากหนึ่งกับโทรศัพท์ของฉัน แต่ทันใดนั้นแอปพลิเคชันหยุดทำงานและเมื่อฉันพยายามเปิด m4v ที่สร้างขึ้นมันก็บอกว่าเสียหาย

ฉันดาวน์โหลดไฟล์วิดีโอ (ประมาณ 36MB) บนพีซีของฉันและฉันพยายามเปิดและซ่อมแซม คุณช่วยแนะนำให้ฉันทำมันได้ไหม?

ข้อมูล FFMPEG

ตามที่แนะนำในความคิดเห็นฉันลองตรวจสอบสิ่งที่ FFMPEG บอกฉันเกี่ยวกับไฟล์นั้นด้วยคำสั่งนี้

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

นี่คือผลลัพธ์:

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

สองบรรทัดล่าสุดจะแสดงเป็นสีแดง


ระบบปฏิบัติการของฉันคือ Windows 7 แต่ถ้าจำเป็นฉันสามารถเตรียมเครื่องเสมือนด้วย distro บน Linux
Drake

@slhck ขอบคุณสำหรับความช่วยเหลือฉันทำในสิ่งที่คุณแนะนำและอัปเดตคำถาม
Drake

7
อานั่นคือสิ่งที่ฉันคาดไว้ อะตอม MOOV เป็นชิ้นส่วนของข้อมูลที่จำเป็นในการเข้าถึงสตรีมวิดีโอดิบภายในคอนเทนเนอร์ MP4 / M4V มีเครื่องมือ "ซ่อมวิดีโอ" ออนไลน์มากมาย แต่ฉันจะไม่ไว้ใจพวกเขาส่วนใหญ่ แน่นอนคุณสามารถให้พวกเขายิง - เพียงแค่ไม่ต้องจ่ายอะไร สิ่งที่ดูเหมือนว่ามีแนวโน้มคือUntrunkซึ่งดูเหมือนว่าจะได้รับรหัสสำหรับปัญหาที่แน่นอนนี้ (เช่นอะตอม MOOV ที่ขาดหายไป) หรือAtomicParsley โชคดี!
slhck

1
ฉันจะแก้ไข mp4 ที่เสียหายด้วย AtomicParsley ได้อย่างไร
chovy

คำตอบ:


60

มันเป็นไปได้ที่จะซ่อมแซม mp4 เสียหรือไฟล์ M4V ใช้Untrunc

สำหรับวิธีนี้คุณต้องมีไฟล์วิดีโออื่นจากอุปกรณ์เดียวกันซึ่งไม่เสีย

ติดตั้งอย่างไร untrunc

สำหรับการคอมไพล์คุณต้องมีการติดตั้งลีนุกซ์ (โดยปกติคือ Ubuntu) และความสามารถขั้นพื้นฐานในการใช้บรรทัดคำสั่ง คุณสามารถข้ามส่วนนี้และเรียกใช้untruncผ่าน Docker (ดูคำตอบด้านล่าง ) หากคุณมี

นี่คือสิ่งที่ต้องทำ:

  1. ติดตั้งไลบรารีที่จำเป็นต้องมีล่วงหน้าด้วยคำสั่งนี้:

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

  2. รับซอร์สโค้ดสำหรับ Untrunc จาก repo GitHub (เลือกวิธีหนึ่ง):

    • wget https://github.com/ponchio/untrunc/archive/master.zip && unzip master.zip && cd untrunc-master
    • หรือ git clone https://github.com/ponchio/untrunc.git && cd untrunc
  3. รวบรวมซอร์สโค้ดโดยใช้คำสั่งนี้ (ทั้งหมดหนึ่งบรรทัด):

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

    (คุณสามารถลองข้ามขั้นตอนนี้และใช้ไฟล์ปฏิบัติการที่เตรียมไว้ แต่มันใช้ไม่ได้สำหรับฉัน)

  4. จากนั้นคุณสามารถแก้ไขวิดีโอได้ คุณต้องการทั้งวิดีโอที่ชำรุดและวิดีโอตัวอย่างที่ใช้งานได้

วิธีแก้ไขวิดีโอ

ค้นหาวิดีโอที่ใช้งานได้อื่นจากกล้องเดียวกันโดยเฉพาะอย่างยิ่งหากเป็นวิดีโอที่เสีย ยังแก้ไขปัญหาเดียวกันถ้าเป็นไปได้ (ฉันเชื่อว่านี่อาจช่วยได้แม้ว่าไม่จำเป็น)

เรียกใช้คำสั่งนี้ในโฟลเดอร์ที่คุณได้คลายซิปและคอมไพล์ Untrunc แต่แทนที่/path/to/...บิตด้วยไฟล์วิดีโอ 2 ไฟล์ของคุณ:

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

จากนั้นควรจะปั่นป่วนและหวังว่าจะสามารถสร้างไฟล์ที่สามารถเล่นได้ broken-video_fixed.m4v

เสร็จแล้ว!

VLC Media Player ควรจะสามารถเล่นไฟล์ได้แล้ว อย่างไรก็ตามอาจมีการรายงานข้อมูลความยาวที่ไม่ถูกต้อง (Untrunc พยายามเดา / ทำสิ่งนี้ แต่ไม่ได้ทำให้ถูกต้องเสมอไป) ในการแก้ไขปัญหานี้ให้ลองเข้ารหัสวิดีโออีกครั้งผ่านโปรแกรมอื่น

[ขอบคุณที่ความคิดเห็นของ slhck สำหรับคำแนะนำเพื่อลองยกเลิกการลบ]

[ขอบคุณมากสำหรับ Federico Ponchio สำหรับการเข้ารหัส Untrunc ตั้งแต่แรกเพื่อแก้ปัญหาที่แน่นอนนี้]


เยี่ยมมากขอบคุณที่ให้คำแนะนำอย่างครบถ้วนที่นี่!
slhck

3
ขอบคุณ @Alex ฉันได้อัพเดทลิงค์ คำว่า Readme บน github ที่สนุกสนานนั้นขึ้นอยู่กับคำตอบนี้!
กระจอก

1
จะให้ทางออกที่ใช้ windows < superuser.com/questions/938185/recover-incomplete-video-files > เพราะฉันไม่สามารถใช้งานอินเทอร์เน็ตได้ใน linux distros ของฉัน
RogUE

2
FWIW สิ่งนี้ไม่ได้สร้างวิดีโอที่เล่นได้สำหรับฉัน - แต่การใช้งานrecovery_mp4_to_h264ผ่านทางไวน์ทำงานได้ดี
คอมไพเลอร์

1
Untrunc ใช้งานได้สำหรับฉัน แต่ฉันต้องใส่ทั้งสองไฟล์วิดีโอในไดเรกทอรีย่อยของโฟลเดอร์untrunc-master. untrunc ที่ซ่อนชื่อ จากนั้นเรียกใช้: ./untrunc goodfile.mp4 badfile.mp4 ใช้เวลาประมาณ 3 นาทีสำหรับไฟล์ 2gb และฉันต้องซิงค์เสียงอีกครั้ง ทุกอย่างอื่นก็โอเค
user8547

8

หากมีคนอื่นสะดุดกับเรื่องนี้ฉันก็ลองใช้แอพ sparrowt กำลังพูดถึง แต่มันก็ไม่ได้ผลสำหรับฉัน (ดูรายงานข้อผิดพลาดบางอย่างที่ฉันสร้างขึ้นในที่เก็บนักพัฒนา) อาจเป็นเพราะมันไม่ใช่ไฟล์ mp4 แต่เป็นไฟล์ MOV ...

สิ่งที่ช่วยฉันได้คือโพสต์นี้: http://muzso.hu/2012/11/14/how-to-fix-a-broken-mp4-mov-video-ffmpeg-reports-moov-atom-not-found

พวกเขาเชื่อมโยงไปยังโปรแกรมที่เรียกว่า "HD Video Repair Utility" ( http://grauonline.de/cmsimple2_6/en/?Solutions:HD_Video_Repair_Utility ) ซึ่งราคาถูกกว่า Treasured ( http://aeroquartet.com/movierepair/repair ) . พวกเขายังชี้ให้เห็นว่ามีรุ่นก่อนหน้า (รุ่น 1.5) ที่ไม่เสียค่าใช้จ่ายใด ๆ ( http://nagasoft.cn/download/videorepair1.5.zip )!

ฉันพยายามซ่อมไฟล์โดยใช้เวอร์ชัน 1.5 และทำให้มันใช้งานได้บางส่วน หลังจากการเข้ารหัสด้วย ffmpeg อีกครั้ง (มีข้อผิดพลาดเกิดขึ้นที่นั่น) ฉันก็รู้ว่าเสียงส่วนหนึ่งหายไป ในบันทึก (ดีใจที่ยูทิลิตี้ซ่อมวิดีโอมีบางอย่าง) ไม่มีการพูดถึงเสียงเพิ่มเติมหลังจากเวลาที่กำหนด ฉันจะทำตามที่เป็นอยู่ ...


3
DROPBOX url ตายแล้ว พบทางเลือก: nagasoft.cn/download/videorepair1.5.zip
T.Todua

2
@ T.Todua ขอบคุณสำหรับการแจ้งเตือน ฉันได้แทนที่ลิงก์ดรอปบ็อกซ์โดยลิงก์ที่คุณให้ไว้
SimonSimCity

8

คุณสามารถติดตั้งdocker(ใช้ได้กับระบบปฏิบัติการหลักทั้งหมด) และเรียกใช้:

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

ไวยากรณ์สำหรับ Bash ภายใต้ Linux หรือ macOS ที่นี่GOOD-reference-file.MP4และBAD-corrupt-file.md5ทั้งคู่จะต้องอยู่ในไดเรกทอรีปัจจุบันของคุณและไดเรกทอรีจะถูกเมาท์/volในคอนเทนเนอร์ Docker

อ่านความคิดเห็นอื่น ๆ รอบ ๆ สำหรับคำอธิบายเชิงลึกเพิ่มเติม

นี่เป็นสิ่งที่เร็วที่สุดสำหรับฉัน!


ขอบคุณ @slhck Dockerfileมีให้ที่นี่ถ้าใครต้องการดูว่ามันจะทำงานอะไรก่อนที่จะรันบนคอมพิวเตอร์ของคุณ: github.com/synctree/docker-untruncนอกจากนี้ยังมีพื้นที่เก็บข้อมูลDockerfileจริงในuntruncขณะนี้ - ฉันยังไม่ได้ทดสอบหรือเปรียบเทียบ พวกเขาในรายละเอียด แต่พูดถึงมันที่นี่เพื่อความครบถ้วน: github.com/ponchio/untrunc/blob/master/Dockerfile
sparrowt

7

@sparrowt คำแนะนำปัจจุบันของคุณใช้ไม่ได้กับการติดตั้ง Ubuntu 16.10 ล่าสุดของฉัน ฉันได้รับข้อผิดพลาดต่อไปนี้ขณะคอมไพล์ untrunc:

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

ตามที่อธิบายไว้ในที่เก็บข้อมูลที่ไม่ถูกยกเลิกคุณอาจต้องดาวน์โหลด libav แยกต่างหากแทนที่จะใช้เวอร์ชันในที่เก็บ Ubuntu รหัสต่อไปนี้ทำงานให้ฉัน:

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

สิ่งนี้สร้างไฟล์ชื่อ broken-video_fixed.mp4 ที่เหมาะกับฉัน ขอบคุณมากสำหรับการเริ่มหัวข้อนี้


1
ขอขอบคุณ! ในบรรทัดการรวบรวม untrunc ฉันมีข้อผิดพลาดเล็กน้อยตามแนวของ "การอ้างอิงที่ไม่ได้กำหนดไปยัง` BZ2_bzDecompressInit '"ฉันต้องเพิ่ม -lbz2
Andrew Smart

ไม่สามารถจัดการไฟล์ขนาดใหญ่ได้ เพียงแค่ยอมแพ้
Ken Sharp เมื่อ

libav ของคุณโต้แย้งh264dec.hหรือไม่? เพราะtrack.cppกำลังพยายามรวมมันและฉันไม่สามารถหาได้ทุกที่: /
x29a

การพึ่งพานั้นถูกเพิ่มเข้ามาด้วยคอมมิทgithub.com/ponchio/untrunc/commit/ ......เมื่อวันที่ 10 ตุลาคม 2017 ฉันเชื่อว่าตอนนี้คุณต้อง donwload libav-12.2 แทนที่จะเป็น libav-0.8.7
freeseek

ในที่สุดก็มีสิ่งนี้ให้ทำงานบน Ubuntu 14.04.5 LTS ต้องวิ่งsudo apt-get install yasm, sudo apt-get install libbz2-devและที่จะเอาชนะการอ้างอิงที่ไม่ได้กำหนดที่จะ 'clock_gettime' เพิ่ม-lrtไปยังจุดสิ้นสุดของg++บรรทัดคำสั่ง (ดูstackoverflow.com/a/2418175/550712 ) มันแปลงประมาณ 2/3 ของวิดีโอของฉัน
Mark Berry

2

ในกรณีที่ untrunc ไม่รองรับ codec ในไฟล์ของคุณคุณสามารถลองแก้ไขด้วย hex editor:

  1. รับไฟล์อื่นที่มีรูปแบบเดียวกันฉันได้ไฟล์ที่ใหญ่กว่า แต่อาจมีความยาวเท่าใดก็ได้
  2. เปิดไฟล์ทั้งสองในโปรแกรมแก้ไขฐานสิบหก
  3. แทนที่mdatส่วนในไฟล์ "ตกลง" ด้วยmdatส่วนในไฟล์ "เสีย" โดยไม่มีส่วนหัว (เช่นคัดลอกเฉพาะไบต์หลังจาก 'mdat')
  4. มันอาจจะทำงานเช่นนั้นหากไม่ได้ 4 ไบต์ก่อนที่ 'mdat' จะระบุขนาดของmdatส่วนค่าปัจจุบันจะเป็นขนาดเก่า ("ตกลง" mdatขนาดส่วนของไฟล์) แทนที่ด้วยขนาดใหม่ (" mdatขนาดส่วนไฟล์เสีย)

ฉันสิ้นสุดการเขียนโปรแกรมง่าย ๆ ที่จะทำ: https://github.com/golimarrrr/fix-3gp

ทั้งโปรแกรมและด้วยมือโดยใช้โปรแกรมแก้ไข hex ควรสร้างไฟล์คงที่เดียวกัน


-3

คุณพยายามเปิดไฟล์ด้วยVLC Playerหรือไม่? โดยปกติจะค่อนข้างดีในการซ่อมไฟล์ที่เสียหาย


8
ฉันคิดว่าสิ่งนี้อาจใช้กับไฟล์ AVI ที่ดัชนีสามารถสร้างขึ้นในหน่วยความจำ แต่ไฟล์ MP4 ข้อผิดพลาดของ "moov atom ไม่พบ" ในระหว่างการประมวลผล ffmpeg ไม่เล่นอะไรใน VLC
อาทิตย์

2
VLC ไม่สามารถเล่นได้เช่นกันในกรณีของฉัน (ไฟล์. mov)
rogerdpack
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.