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; }