需要幫助修復缺少MOOV原子的MP4損壞


2

請原諒一個視頻文件格式的新手,他已經遍及整個網絡,尋找一個相對簡單的問題,並希望得到一個答案(即使是一個相當複雜的問題也可以!):

TL;DR: I have a broken MP4 which lacks a MOOV atom (neither at the beginning nor at the end). So, how do I create a new MOOV atom in order to fix the file?

現在是擴展的問題(如果您不願意閱讀的話),它顯示了我到目前為止已完成的作業...

到目前為止我找到了什麼解決方案...

quick search just here on video.stackexchange.com將為您帶來數十個與此主題相關的類似問題和變化;在Google上進行搜索,您將獲得數百個搜索結果;even Quora has a few answers ...總結其中最多的,這通常是他們 所說的:

  1. " MP4文件的末尾可以有一個MOOV原子(這是通常的方式),也可以在開始時有一個MOOV原子;這是N種解決方案的選擇,可以將原子從一個位置移動到另一個位置"(不,它們不是如果您沒有 MOOV原子,則很有用)
  2. "您可以某種方式使用ffmpeg(或數不勝數的類似實用程序-大多數仍將使用ffmpeg的庫-甚至是VLC(某些版本似乎可以自動修復損壞的視頻,儘管不是我的情況))神奇地提取損壞文件的一部分,將其拆分為幾個位,甚至拆分為單個幀,然後重新編碼,最終您將從損壞的視頻中得到一些幀序列,或者很幸運,可以播放的連續視頻(有時僅在VLC下,有時僅在mplayer下,有時需要[在這裡插入喜歡的視頻播放器])"(所有這些建議都非常好,但是都假設至少有一個MOOV原子-否則 all 都會失敗)
  3. "某些工具(或商業應用程序)可以通過直接從底層介質讀取扇區並繞過FAT或操作系統使用的任何文件系統層來處理故障磁盤/筆驅動器/存儲卡上的損壞數據。至少能夠恢復您的視頻的一部分,即使(可能)故障,不完整等也是如此。"(這可能都是正確的,但對我而言並沒有幫助,因為該文件是原始文件,並且當前存儲的硬件沒有任何問題—該文件只是缺少一個MOOV原子,因此這些工具都無法提供幫助)
  4. "一些工具,例如untrunc,可能能夠修復損壞的文件,尤其是在文件末尾缺少MOOV原子的情況下,這是因為攝像機突然斷電(或某些類似情況)。也有幾種商業軟件解決方案可以做到相同(並且更易於使用)甚至web-based ones。商業應用程序通常具有演示/試用模式,在該模式下,您至少可以恢復一些數據以提供給您通常,這種軟件需要在相同情況下由同一台攝像機製作的視頻,以便將丟失的數據從該視頻推送到損壞的文件中。"(到目前為止,我還沒有找到能夠準確執行所聲稱的功能的"魔術工具" ...我測試過的 all 都會由於缺少MOOV原子而失敗...無論是否"測試視頻"具有它,可以輕鬆複製-假設這當然可以"修復"任何東西)。

為什麼以上這些都沒有幫助我

在一種情況或另一種情況下,事情的解釋可能有所不同,但是在對數十種"解決方案"進行了描述之後,我會說大多數情況將屬於這四種情況中的一種。當然,第四個案例是唯一對我有幫助的案例,但是到目前為止,我已經嘗試了幾乎所有可以在Mac上運行的東西-是的,包括一些商用軟件。apps —並且 none 將解決此問題。

我還發現了許多這樣的工具,尤其是那些商業工具!—僅僅是ffmpeg / libav的GUI。有些甚至使用了絕望的版本。在某些情況下,它們是用靜態方式編譯的;在其他情況下,ffmpeg和它的朋友會隨該應用程序一起打包,該應用程序會使用開發人員認為對大多數情況都可能有幫助(甚至起作用!)的任何特殊參數進行調用。

雖然我可以肯定我嘗試過的某些工具可能具有非ffmpeg / libav代碼,但它們也沒有起作用。我似乎可以得出的結論是,如果沒有有效的MOOV原子,則取決於ffmpeg / libav代碼的所有內容將起作用。因此,訣竅-如果有的話!—以某種方式從另一個文件中"提取" MOOV原子和/或從現有數據中重新創建MOOV原子。儘管前者似乎是最受歡迎的方法(而且,正如我所說,我已經使用該方法測試了十幾個應用程序),但在我看來,沒有一種方法有效;至於後一種方法,如果它確實存在,它在我測試過的任何工具中都沒有明確命名,所以我無法說這是否完全可能(例如,可能ffmpeg的晦澀且未記錄的功能,但到目前為止,我還沒有得到提及該功能的答案;當然,出於明顯的原因,商業工具可能根本無法記錄其工具在"幕後"的確切作用。

哇。羅y,我知道!讓我給你一個保證,儘管我幾乎不明白我在說什麼-即MP4 / MOV文件的複雜結構-我當然已經盡了最大的努力來弄清我的文件出了什麼問題以及為什麼到目前為止,我嘗試過的所有嘗試都完全失敗了。如果我對MP4格式有錯誤的認識和/或只是說毫無意義的垃圾(例如"從電影中的現有幀中重構MOOV原子"),我事先道歉。也許這是出於我無法理解的原因而無法執行)。

我對文件的了解...

  1. 其中肯定有數據(即不只是垃圾)。其中一些實用程序正確地指出這是QuickTime流。有些甚至可以識別出幾個原子。

以下是ffmpeg1的示例:

[ftyp] size=8+12
  major_brand = qt  
  minor_version = 0
  compatible_brand = qt  
[wide] size=8+0

這是ffmpeg2的輸出:

File:
  major brand:      qt  
  minor version:    0
  compatible brand: qt  
  fast start:       yes

No movie found in the file

(不過,它對"快速啟動"非常了解...)

這是我自己被黑的實用程序的輸出(見下文):

[ftyp]
        Major brand: qt  
        Minor brand: 0
        Compatible brands: [qt  ]

[wide]
        Size: 8
        Start: 20

[mdat]
        Size: 2305577342
        Start: 28

但是沒有人可以找到一個MOOV原子。Photoshop可以從某些幀中導入"噪點",但它們看起來像幀,但噪聲很大,以至於它們變成"隨機像素",也就是說,要弄清楚該幀到底是什麼幾乎是不可能的應該是...

  1. 我有由同一台攝像機(iPhone 8的"自拍"攝像機以橫向格式)生成的"相似"文件,因此我可以輕鬆提取現有的MOOV原子(或任何其他原子)並將其"膠合"到其他位置現有文件,許多提到的工具都認為該過程可能是解決"丟失" MOOV原子的一種可能的方法-但實際上沒有人能夠使用 my 視頻...

理論上我可以做的事情

(或:嘗試開始回答我自己的問題...)

我只是一個謙虛的業餘程序員,這意味著完全不可能開發一個 new 工具來修復自己的視頻(此外,我沒有時間那)。如果沒有答案,我可以保證做的最好的事情就是弄清楚MP4編碼器實際上是如何從現有數據中生成MOOV原子的,並查看我是否可以適應an existing tool以從頭開始"重新生成" MOOV原子(注意:它有點顯示了缺少MOOV原子時可以在文件中找到的所有原子的內容,這是我之前給出的輸出)... a,我認為這可能如果您不了解視頻文件本身的一些基本知識,這是不可能的(畢竟,這些"基本內容"存儲在MOOV原子上!),但我很高興為此被證明是錯誤的-特別是因為我可以只需從類似情況下生成的視頻文件中讀取MOOV原子,就可以猜測許多"基本事物" ...

這是一個示例(音軌3和4並不是真正的基礎):

found avc1
File:
  file Size:    16072874
  brands:   qt  , [qt  ]

Movie:
  duration: 6859 ms / 600 (00:00:11:431)
  fragments:    false
  timescale:    600

Found 4 Tracks

Track 1:
  flags:    15 ENABLED IN-MOVIE IN-PREVIEW
  id:       1
  type:     Video
  duration: 6859 ms
  language: und
  width:    1920
  height:   1080
  media:
    sample count:   184
    timescale:      600
    duration:       6859 (media timescale units)
    duration:       11431 (ms)
  display width:         1920
  display height:        1080
  frame rate (computed): 16.10

Track 2:
  flags:    15 ENABLED IN-MOVIE IN-PREVIEW
  id:       2
  type:     Sound
  duration: 6859 ms
  language: und
  width:    0
  height:   0
  media:
    sample count:   495
    timescale:      44100
    duration:       506880 (media timescale units)
    duration:       11493 (ms)

從理論上講,通過增加一些技巧,我還可以提取每個音軌開始和結束的精確位置(假設這就是MP4格式的工作方式!)以及"重構" MOOV原子所需的任何信息...

我實際上需要什麼幫助

我確實可以使用ISO/IEC 14496-12 standard which defines the MP4 file format訪問PDF,但是我還沒有閱讀它們。本質上,我需要理解是如何根據現有視頻數據創建/生成MOOV原子。我可以下載並安裝我以前沒有提到的任何工具(只要它們在macOS或任何非GUI Linux上都可以工作,我 可以暫時(如果我確信有一種可以在Windows下運行的解決方案)可以訪問Windows 10計算機。我也願意更改或改編現有的開放源代碼工具,只要我能從如何從現有視頻數據實際"生成" MOOV原子中獲得一些指導即可(最好用ffmpeg3或ffmpeg4編寫,但我可以使用ffmpeg5,ffmpeg6,ffmpeg7或Python(按優先級從高到低的順序),或者,或者,Perl或JavaScript ...我只是不願意安裝Java :-P,所以我真的很需要說服使用Ruby,Rust或任何當前流行的語言...)。

1

As you said you have similar files, you may try the following:

1) any good mp4 file with the same resolution and bitrate to generate the header files:
recover_mp4.exe good.mp4 --analyze

2) recover streams from the corrupted file, for example:
recover_mp4.exe bad.mp4 recovered.h264 recovered.aac

3) join audio and video with ffmpeg:
ffmpeg.exe -r 30 -i recovered.h264 -i recovered.aac -bsf:a aac_adtstoasc -c:v copy -c:a copy recovered.mp4

recover_mp4 : https://codecpack.co/download/recover-mp4.html ffmpeg: https://www.ffmpeg.org/

I've just covered a mp4 with the above method - although sound is still corrupted, video is all good.