GV-1394TVからffmpegで直接mpeg2/4がとれないかなぁと試してみた。
hcube:/home/DV# ffmpeg -dv1394 dada.avi
ffmpeg version 0.4.9-pre1, build 4718, Copyright (c) 2000-2004 Fabrice Bellard
built on Sep 12 2004 09:27:55, gcc: 3.3.4 (Debian 1:3.3.4-11)
Failed to initialize DV interface: Invalid argument
Could not find video grab device
うーん、なんじゃそれ。
ffmpeg-cvs-2004-07-12/libavformat/dv1394.cを見てみた。
/* Open and initialize DV1394 device */
video_device = ap->device;
if (!video_device)
video_device = "/dev/dv1394/0";
dv->fd = open(video_device, O_RDONLY);
if (dv->fd < 0) {
perror("Failed to open DV interface");
goto failed;
}
if (dv1394_reset(dv) < 0) {
perror("Failed to initialize DV interface");
goto failed;
}
openはうまくいっていて、その次が問題みたいだ。
dv1394_reset()を見てみると、
/*
* The trick here is to kludge around well known problem with kernel Ooopsing
* when you try to capture PAL on a device node configure for NTSC. That's
* why we have to configure the device node for PAL, and then read only NTSC
* amount of data.
*/
static int dv1394_reset(struct dv1394_data *dv)
{
struct dv1394_init init;
init.channel = dv->channel;
init.api_version = DV1394_API_VERSION;
init.n_frames = DV1394_RING_FRAMES;
init.format = DV1394_PAL;
if (ioctl(dv->fd, DV1394_INIT, &init) < 0)
return -1;
dv->avail = dv->done = 0;
return 0;
}
PALとして埋め込んでみるみたいだし、動いているのかなぁ(^^;。
dvts1.0b/dvrecv/ieee1394-linux.cを見てみると、
int
prepare_ieee1394 (struct dvrecv_param *dvrecv_param)
{
int fd;
fd = open(dvrecv_param->ieee1394dv.devname, O_RDWR);
if (fd < 0) {
printf("failed to open device : %s\n", dvrecv_param->ieee1394dv.devname);
return(-1);
}
dv1394_init_param.api_version = DV1394_API_VERSION;
dv1394_init_param.channel = 63;
dv1394_init_param.n_frames = 2;
dv1394_init_param.cip_n = 0;
dv1394_init_param.cip_d = 0;
dv1394_init_param.syt_offset = 0;
if (dvrecv_param->format == DV_FORMAT_NTSC) {
dv1394_init_param.format = DV1394_NTSC;
} else if (dvrecv_param->format == DV_FORMAT_PAL) {
dv1394_init_param.format = DV1394_PAL;
} else {
return(-1);
}
if (ioctl(fd, DV1394_INIT, &dv1394_init_param) < 0) {
perror("ioctl DV1394_INIT");
printf("channel : %d\n", dv1394_init_param.channel);
printf("n_frames : %d\n", dv1394_init_param.n_frames);
return(-1);
}
dvrecv_param->ieee1394dv.fd1394 = fd;
return(1);
}
このあたりから持ってくればいいかなぁ。
うーん、そもそもdvtsがきちんと動かない(^^;
返信削除dvgrabは動くんだけど、c++で書いてあって
私には解読が面倒。
時間かかりそうだなぁ。根気が続くかなぁ。