網路城邦
上一篇 回創作列表 下一篇   字體:
如何搶救毀損的影片檔
2008/03/15 12:23:17瀏覽91817|回應15|推薦40

公告

由於本文點閱次數持續攀高,不時有朋友請託協助,特此聲明。此文是多年前因工作需要,所做研究的總結,然而現在,並不是我的職業,請別再留言求救。給有需要的朋友一點提示:本文上下週邊,不時會有現役資料救援專家的訊息,敬請多加參考利用。

生人迴避!

警告在先:本文是這個部落格成立以來所僅見、冷冰冰硬梆梆、無趣得可怕的技術題材,除了特定領域的科技狂人以外,通常都會在一分鐘內睡著。莫謂言之不預也。

在這裡發表是因為目前的工作用不上,擺久了餿掉可惜。如果有人看了有所啟發,深入鑽研甚至產品化,也算是造福社會罷。

事情源自兩三年前。有同事到國外參展,在同業攤位當「死敗」偷拍重要情資,自己卻不小心刪除。所幸這人還算精乖,拍了幾張照片後察覺不對,趕緊把記憶卡抽掉,想辦法搶救。結果檔案雖然救了回來,影片內容卻無法播放。不死心抓了幾個影片修復軟體,都豎白旗投降。由於敝人先前有和影音軟體打交道的經驗,這位老兄就把毀損的影片檔拿來,問我有沒有辦法救。

一看之下,原來影片檔的「七寸」被掐碎了。檔案頭尾的重要資訊毀損大半,難怪影片修復軟體都寧願放棄。好在影音資料區還有七八成沒壞,於是寫了兩三支小程式,硬是把堪用的部份還原給他,功德圓滿。可惜公司不做這方面,產品化也有實質困難,只好把過程記下,孤芳自賞一番啦。

(對技術細節無興趣者,可直接跳到末段)



這篇重點是談技術,不是介紹軟體;討論的是方法,而不是產品,目的在解決一個特定問題。

影片檔毀損的原因,包括檔案傳輸複製過程的錯誤疏失,和儲存媒介(如硬碟、光碟、記憶卡)的毀損或錯亂。毀損的位置和範圍通常無可預測,加以資料量龐大,需要以程式檢測修復。

修復各種影片檔的軟體很多,網路上不難找;有些是自由軟體,多數要付點費用。然而無論收費與否,大部份軟體遇上這個問題的反應是一致的,也就是兩手一攤,宣告不治。

什麼問題呢?就是萬一影片檔的檔頭毀損,還能不能救?

這個問題的答案要看影片檔的格式。來自VCDDVDMPEG檔案,由於編解碼器(CODEC)及其參數固定或變化有限,問題較小,救回的機率較大。相對而言,屬於container格式的AVIRM檔案,CODEC資訊放在檔頭,一旦損毀就無法解碼。本篇的重點就放在這兩種格式。

檔頭

影音資料

索引

圖一,影片檔的基本結構

上圖只是示意,並不符合實際比例。檔頭部份通常只有幾百上千個byte,相對動輒以MB甚至GB計算的資料區來說,比例小之又小,遭到毀損的風險也低。然而檔頭包含解碼所需的重要資訊,一旦損失,靠盲目猜測救回的機會卻又不高。難怪各種修復軟體寧可放棄。

靠人工有沒有機會呢?答案是有,但仍然需要許多程式幫忙。在討論如何搶救之前,先瞭解有關影片檔結構的基本知識,會比較有幫助。

觀念

AVI和RM是所謂container格式,意思是說,抽象觀念上它們只是一連串記錄(record)的組合,至於如何詮釋記錄,則是播放程式的工作。

Record 1

Record 2

Record 3

……

Record N

圖二,影片檔由連續的記錄組成

每個記錄的開頭,通常至少包括一個表明記錄型態的標籤(Tag),以及記錄的長度(Length)。記錄本身可以是另一個container,包含其他記錄。一如前述,如何詮釋記錄,是播放程式的工作。修復程式的工作,就是將檔案恢復到播放程式能夠判讀的程度。

TagLengthData

圖三,單一記錄的結構

為了簡化,這裡只討論AVI和RM格式的基本型,衍生加強的型態暫不考慮。詳細的格式資料請看參考文件,此地也不深入討論。

如圖一所示,基本型包括三大塊記錄,即檔頭、資料和索引。資料區是骨幹,包含若干個影音流(stream),通常會有一個視訊流(video stream)和兩聲道的音訊流(audio stream)。影音流資料量大,一般會切割成小塊以便處理。視訊以畫面為單位,音訊則視CODEC而定。

視訊資料幾乎沒有不壓縮的,絕大多數現代的壓縮法,都採用立體壓縮,亦即前後畫面交互參照,消除相同部份,以求最大程度的壓縮比。這種方法會每隔若干畫面設立一個主畫面。理論上說,當場景變化(scene change),就是設立主畫面的好時機,因為畫面變化大;實際得看CODEC如何施作。這部份屬於視訊壓縮的範疇,在此略過不提。音訊資料壓縮與否都有可能,通常切割成小塊和視訊流交錯排列,為的是避免播放程式讀取大檔案時來回移動浪費時間。

索引存在的目的,是當使用者任意選擇播放點的時候,程式可以迅速移動,找到指定的影音資料位置。如果有主畫面的設置,索引中存放的可能是主畫面的位置;也可能按固定間隔,比方說,一百筆記錄,安排一個索引。理論上說,索引並非不可或缺,然而很多播放程式發現索引不正常就哇哇叫甚至當掉。

播放時重要的是影音必須同步,否則對不上嘴事小,音響效果慢了半拍,味道就差多了。檔頭存放資料區的影音流起點、記錄總數、時間長度、CODEC及其附帶參數等資料。AVI和RM都假設影片是連續資料流,每筆記錄並沒有個別的時間戳,播放的時機和同步,都靠個別記錄和起點的相對距離來決定。當資料區遭受破壞時,這是不容易解決的問題。

破壞的型態和坊間修復程式的作為

索引遭到破壞,是最容易解決的問題,修復程式最擅長的也是這個。只需要讀取檔頭中各資料流的起點,整個檔案掃瞄一遍,索引就可以重建。甚至有些耐操的播放程式,如VLC,根本不加以理會,自行在記憶體中重建。

資料區的破壞,當索引仍然完整的時候,可以利用索引所記錄的位置,試圖評估損害,決定那些區域可以修復,同步的問題也比較容易掌握。如果索引不存在,當資料區被破壞時,重建也沒有意義,唯一的辦法是掃瞄資料區。由於影音流都是連續的,裝載資料的每筆記錄都有特定的標籤,和下一筆記錄的位置。先找尋特定標籤,再根據下一筆記錄的位置察看是否正確,反覆執行可以得到若干資料流片段。只不過影音流破壞的程度不一致,又缺乏索引做參考,同步問題極可能發生,甚至可能很嚴重。有些修復程式會試圖復原找到的第一塊資料流,而將其後全數捨棄,免得結果看起來令人不悅。

檔頭被破壞時,會產生幾個重要問題。首先各資料流的起點和總數會成為一個謎。這時候如果索引保持完好,可以提供參考。但由於檔頭通常很小,破壞則至少以幾個KB為單位,開頭的若干損失在所難免。萬一沒有索引可參考,靠掃瞄資料區也有機會找出答案,不過同步仍然是個問題。比較致命的是CODEC及相關參數,相信這是大多數修復程式束手無策之處。自古至今,CODEC的種類沒有一百也有八十。在沒有任何參考的情況下,可能的排列組合太多,放棄還比較輕鬆一點。

對策

這次工作的重點有二。第一是當檔頭損毀時設法重建,第二是儘可能恢復所有可用的影音資料,換句話說,萬一資料區被斷成好幾截,試圖將之儘量復原。

前面說過,一般修復程式在沒有任何參考的情況下,只好選擇放棄。如果我們有同一來源的其他檔案可參考,比方說出自同一台數位相機或製片軟體,將檔頭拷貝過來,可以解決CODEC參數的問題,至少縮小嘗試的範圍。當然資料流起點長度等資料,需要寫一個程式去掃瞄,這支程式同時分析出可用片段和主畫面的位置等。

萬一沒有可供參考的檔案,得要猜測,我們把視訊和音訊個別處理。利用前一支程式分析出、尚可使用的資料片段,以另一支程式調整各項參數試圖解碼。錯誤的CODEC可以經由這個程序過濾掉。找出正確的CODEC之後,再微調各項參數到輸出正確為止。其實時至今日,CODEC百家爭鳴的時代已經過去,除非檔案來源十分古老,否則應該不需要猜測到十次以上。

倘若運氣好,所有片段都能找出來,並且正確解碼,接下來要處理的,就是同步問題。若太過殘缺,又沒有原始索引供參考,恐怕就只能靠人工。用一支程式把原始檔的影音分離,各片段獨立建檔,再利用製片軟體重新接合,或許是比較可行的方式。當然如果資料大體完整,或同步與否沒那麼重要,那麼直接連綴再重建索引,也就可以了。


單以這次任務來說,由於數位相機還在,CODEC部份用不著猜測,解碼不費吹灰之力。然而資料斷成好幾截,同步就很困難了。好在同事只要得到視訊部份就很高興,音訊直接捨棄。是故文末兩段提到的方法只是構思而未實作,那也是產品化的困難所在。講得明白些,這種成功率沒法兒掛保證的事,充其量只能是「殺必死」;就像你把摔破的NB送到維修站,能活命就偷笑了,缺胳膊斷腿也只能摸摸鼻子認賬。

抱歉沒有附圖。手邊書籍當然有,不過都有著作權,不便翻貼。在Wikipedia也沒看到,而且,最重要的,自己作圖好累。還請看倌多多包涵。

 
( 知識學習科學百科 )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=jefnjil&aid=1694840

 回應文章 頁/共 2 頁  回應文章第一頁 回應文章上一頁 回應文章下一頁 回應文章最後一頁

郭子儀
請救救我吧
2009/06/23 10:05

不好意思,我再說得詳細點

我不小心將數位相機的影片(avi)直接從數位相機刪除,當時晴天霹靂,頭腦一陣暈眩,之後又笨笨的拍了一段影片後才想到是不是可以救回來,後來看到網友介紹,利用Digital Image Recovery把檔案救回了,可是卻發現不能播放,也許是檔案有部份損毀吧,我有問過我朋友,但他們都說没救了,因為是我小孩的影片,真的真的很珍貴,所以我仍不放棄繼續上網查詢,感謝終於看到你的這個標題,拜託幫幫我吧

Jeff & Jill(jefnjil) 於 2009-06-23 23:08 回覆:

AVI檔的話,可以試試VirtualDub這套軟體。除非檔頭毀損,它的積極復原模式(aggressive mode)能夠找回大多數失落的片段,運氣好可以存成一個可播放的新檔,差一點也有機會分段人工組合。英文還可以的話,他的網站有詳細說明和討論。

過去我寫的程式,唯一強過它的,只是檔頭損毀時,可以試圖重建或移植其他檔案的檔頭。但前提是資料部份損毀不能太大,否則即使還原也是零散破碎,以影片來說,會很難忍受。

依你的敘述,情況應該不太樂觀。刪除之後又拍了影片,極可能已經被蓋掉,救回來的機會不高。Digital Image Recovery還原的檔案多半用處不大,建議拿整張記憶卡找專家處理,試試還有沒有機會。


郭子儀
請救救我吧
2009/06/22 23:02
我有一個救回的AVI檔案無法播放,你可以幫忙救嗎,拜託拜託,那是很有意義的影片

Meitzu
請教要如何分離影音
2009/01/22 16:28

您好。

冒昧請教文中所提分離影音的方式(使用何種軟體?如何判讀?)

我個人遇到的狀況是:從HD傳資料到USB drive時,USB鬆脫了,資料傳到一半「變不見」。隨後網上爬文尋得FinalData救援,但救援下來的MP4檔顯示Continuous、Damage居多,無法開啟。我想既然救援軟體上顯示Continuous,是否資料流還在?請問我該如何把資料流「讀」出來?

已試用AviFixed與DivXRepair,因為格式非avi故無效......

Jeff & Jill(jefnjil) 於 2009-01-22 18:08 回覆:

待會兒下班,就要開始放年假了,所以沒辦法詳細答覆你的問題。

沒用過FinalData,猜想Continuous是指資料流仍然連續的部份,Damage就是毀啦。如果連續的部份還算大塊,救回來比較有意義。

建議用"fix repair mp4 file"當關鍵字,去google一下。乍看之下,覺得比較有希望的軟體是

  • NewLive All Media Fixer Pro (Shareware)
  • MP4Box (multiplexer)
  • Yamb (Windows GUI of MP4Box)
  • SUPER (Converter)

除了第一個以外,都不是修復專用程式。不過搞Open Source的仁人志士,大都有人溺己溺的精神,只要檔案壞得不是太離譜,有時候他們會想些辦法儘量還原。畢竟在檔案分享的過程中,毀損的可能性還不低

寫這篇文章的時候,只針對AVI和RM做了些研究。用過的軟體,記得有VirtualDub和RMA。這些軟體當時未能突破的地方,我才自己寫了一兩隻輔助程式。針對性太強,對其他格式可能幫助不大。這方面只好抱歉啦。


筱小姐
等級:8
留言加入好友
感謝
2008/03/16 12:16

看來我的狀況屬於後者

因為我一直以為影片不見了

是我重灌xp的原因  是軟體不足而看不到

於是仍不斷儲刪相片等其它資料

直到最後才驚覺 影片檔案根本不見了

你的熱心讓我深深感動 

我試著處理(先請老弟試看看)

如不行  就得煩勞請教你了

這件事最大的教訓是  要勤備份

Jeff & Jill(jefnjil) 於 2008-03-17 00:05 回覆:

備份確實是避免懊悔的不二法門。

像我,如果不確定一張記憶卡裡的資料到底備份了沒,就寧可不刪不用,或先多做一份拷貝再說。重複只是佔空間,一不小心殺錯就糟了。這是多次犯傻學到的教訓。

就算勉強救回來,支離破碎的影片也夠讓人傷心了。事先預防才是上上策。


筱小姐
等級:8
留言加入好友
好專業
2008/03/15 18:35

應該要說
懶人迴避

近來正好誤刪所有影片(外接硬碟中)
還好大部分有備份
只有近期的無
但還是有鬱卒

看到你的標題甚喜
但對我 真的很難懂

Jeff & Jill(jefnjil) 於 2008-03-16 01:37 回覆:

如果已經由資源回收筒清除,但沒有對那顆硬碟寫任何東西的話,馬上用所謂檔案復原或檔案救星軟體,或許有機會把影片檔完整地救回來,用不著本篇介紹的技巧。

一次刪除多個檔案,又已經寫資料到硬碟的時候,被刪除的影片即使救得回來,也多半支離破碎。這篇文章介紹的,就是在這種情況下,死馬當活馬醫的技術。若非內行人,看不懂是應該的。

要是有信得過的內行人,看過本文後知道該怎麼處理,或許能幫妳解除一點鬱卒。為什麼說「信得過」呢?經過陳姓藝人事件後,大家對於把私密資料交給不相干的外人,應該會多一份戒心。要救影片,得先從硬碟把檔案儘可能復原才行。這意味著即使我願意幫忙,也得拿到妳的硬碟才能著手。除了空間距離的限制之外,我想妳也未必放心把硬碟交給素不相識的人吧。

因此本文純屬技術交流。若要實際解決問題,可以找內行人和我對話,我很樂意切磋。

頁/共 2 頁  回應文章第一頁 回應文章上一頁 回應文章下一頁 回應文章最後一頁