SDカードから失われた動画を復旧する

ffmpeg で -i オプションにワイルドカードを使ったらSDカード内のAVIがごっそり0バイトになって焦った。

ここは本気を出さねばならない。

selfImageで、メディアまるごとのバイナリイメージを取って、以下のコードを実行し、「”RIFF”から始まるファイル」に分割。なんせ元のファイルサイズが失われてるのでほんとはきちんとRIFFフォーマットを解析しなきゃならないのだが、面倒なので。

あとは、出来上がった「後ろにおまけのついた動画ファイル」を無理やり動画コンバータに放り込んで変換成功。

ふぅ、冷汗かいた。

int _tmain(int argc, _TCHAR* argv[])
{
char buf[BUF_SIZE];
FILE* fp;
::fopen_s(&fp, "sd_card.img", "rb");
FILE* fOut=NULL;
int count=0;
while(!::feof(fp)){
::fread(buf, 1, BUF_SIZE, fp);
if(fOut)::fwrite(buf, 1, BUF_SIZE,fOut);
long cur=0;
while(cur<BUF_SIZE){
const char* pos=(const char*)::memchr(buf+cur, 'R', BUF_SIZE-cur);
if(!pos){
break;
}
if(::memcmp(pos, "RIFF", 4)==0){
if(fOut)::fclose(fOut);
char fname[20];
::sprintf(fname, "%d.avi", count);
fOut=::fopen(fname, "wb");
::fwrite(pos, 1, BUF_SIZE-(pos-buf), fOut);
count++;
}
cur=pos-buf+1;
}
}
if(fOut)::fclose(fOut);
::fclose(fp);
return 0;
}
Comment are closed.