データはRedhat 9のLinuxでPCカードタイプのSDカードリーダに入れて/dev/hdeでセクタサイズが493878で認識されていたので
# dd if=/dev/hde of=/home/ynishi/xiaostyle.img bs=512 count=493878
でデータをまるごと吸い上げました。
ちゃんとしたのはもっとちゃんとしているんでしょうが、要はムービーのデータさえ拾いあげれればいいのでいい加減なプログラムでなんとかしてみました。
データの内容は以下のように仮定してます。
(1)ASFのムービーとJPEGの画像しか入ってない
(2)フラグメントはされてなくて連続領域にデータが入っている
(3)読み込み時のバッファの境界にASFの開始位置があればあきらめる(^^;
(4)ムービーデータ中にJPEGやASFのヘッダと同じ並びで画像データが入っていれば切れてもあきらめる(^^;
こんなんでもなんとか10個程度は読めるように取り出せました。よかった。
================== asfsaru.c ===============================#include <stdio.h>
#include <string.h>
#include <stdlib.h>unsigned char asfdata[10] = {0x30, 0x26, 0xb2, 0x75, 0x8e, 0x66 };
unsigned char jpgdata[10] = {0xff, 0xd8, 0xff, 0xe1 };enum {
F_NONE,
F_ASF,
F_JPG,
};int fcount = 0;
int checkheader(unsigned char *datap)
{
if (memcmp(datap, asfdata, 6) == 0) {
printf("find ASF header?n");
return F_ASF;
}
if (memcmp(datap, jpgdata, 4) == 0) {
printf("find JPG header?n");
return F_JPG;
}
return F_NONE;
}int main(int argc, char *argv[])
{
FILE *ifp, *ofp = NULL;
unsigned char *buff;
char namebuff[256];;
int endflag = 0, oflag = 0, i1, sz, rc, cnt, r2 = 0;sz = 1024*1024;
buff = (unsigned char *)malloc(sz);
if (argc != 2) {
printf("Usage: %s imgfile?n", argv[0]);
exit (1);
}
if ((ifp=fopen(argv[1], "r")) == NULL) {
printf("cannot open %s?n", argv[1]);
exit (2);
}
while (endflag == 0) {
if ((cnt=fread(buff, 1, sz, ifp)) != sz)
endflag = 1;
printf("fread:%d(%d)?n",cnt, r2++);
for (i1 = 0; i1 < cnt; i1++) { if (i1 < cnt-6) { rc = checkheader(&buff[i1]); if (rc == F_ASF || rc == F_JPG) { if (oflag) { fclose(ofp); oflag = 0; } if (rc == F_ASF) { sprintf(namebuff, "%d.asf", fcount++); printf("open data file:%s?n", namebuff); if ((ofp = fopen(namebuff, "w")) == NULL) { printf("Cant open write file:%s?n", namebuff); exit (3); } oflag = 1; } } } if (oflag) fputc(buff[i1], ofp); } } fclose(ifp); if (oflag) fclose(ofp); return 0; }