ffmpeg で -i オプションにワイルドカードを使ったらSDカード内のAVIがごっそり0バイトになって焦った。
ここは本気を出さねばならない。
selfImageで、メディアまるごとのバイナリイメージを取って、以下のコードを実行し、「”RIFF”から始まるファイル」に分割。なんせ元のファイルサイズが失われてるのでほんとはきちんとRIFFフォーマットを解析しなきゃならないのだが、面倒なので。
あとは、出来上がった「後ろにおまけのついた動画ファイル」を無理やり動画コンバータに放り込んで変換成功。
ふぅ、冷汗かいた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<span class="synType">int</span> _tmain(<span class="synType">int</span> argc, _TCHAR* argv[]) { <span class="synType">char</span> buf[BUF_SIZE]; <span class="synType">FILE</span>* fp; ::fopen_s(&fp, <span class="synConstant">"sd_card.img"</span>, <span class="synConstant">"rb"</span>); <span class="synType">FILE</span>* fOut=<span class="synConstant">NULL</span>; <span class="synType">int</span> count=<span class="synConstant">0</span>; <span class="synStatement">while</span>(!::feof(fp)){ ::fread(buf, <span class="synConstant">1</span>, BUF_SIZE, fp); <span class="synStatement">if</span>(fOut)::fwrite(buf, <span class="synConstant">1</span>, BUF_SIZE,fOut); <span class="synType">long</span> cur=<span class="synConstant">0</span>; <span class="synStatement">while</span>(cur<BUF_SIZE){ <span class="synType">const</span> <span class="synType">char</span>* pos=(<span class="synType">const</span> <span class="synType">char</span>*)::memchr(buf+cur, <span class="synConstant">'R'</span>, BUF_SIZE-cur); <span class="synStatement">if</span>(!pos){ <span class="synStatement">break</span>; } <span class="synStatement">if</span>(::memcmp(pos, <span class="synConstant">"RIFF"</span>, <span class="synConstant">4</span>)==<span class="synConstant">0</span>){ <span class="synStatement">if</span>(fOut)::fclose(fOut); <span class="synType">char</span> fname[<span class="synConstant">20</span>]; ::sprintf(fname, <span class="synConstant">"</span><span class="synSpecial">%d</span><span class="synConstant">.avi"</span>, count); fOut=::fopen(fname, <span class="synConstant">"wb"</span>); ::fwrite(pos, <span class="synConstant">1</span>, BUF_SIZE-(pos-buf), fOut); count++; } cur=pos-buf+<span class="synConstant">1</span>; } } <span class="synStatement">if</span>(fOut)::fclose(fOut); ::fclose(fp); <span class="synStatement">return</span> <span class="synConstant">0</span>; } |