OpenCV 1.1pre で mp4 を処理する

ようやっと出来るようになった.情報元はhttp://www.ar-lab.info/mt/weblog/archives/2009/03/opencvmpeg2mov.html.手順は,

  1. http://tech.groups.yahoo.com/group/OpenCV/ を参照
  2. yahoo.com sign up
  3. OpenCV の Yahoo Group に Join
  4. Files から ffopencv110.rar を入手
  5. 中身の ffopencv110.dll を OpenCV の bin/ に放る

問題は2点.

  • flv 読込実験をしていない
  • mpeg2 を読み込めない

実験

いくつかの動画ファイルを cvCaptureFromAVI() で読んでみた.

入力ファイル

入力した動画の詳細は 真空波動研Lite 081122 / DLL 081122 の出力で熟知すべし

[0001.avi]
720x480 24Bit DivX 5.x 29.97fps 1338f 1048.64kb/s
MPEG2-LayerIII 22.05kHz 96.00kb/s CBR Stereo
INFOTAG
[RIFF(AVI1.0)] 00:00:44.644 (44.644sec) / 6,440,650Bytes

[0001[cinepak,mp3].avi]
720x480 24Bit Radius Cinepak 29.97fps 1337f 3208.40kb/s
MPEG2-LayerIII 24.00kHz 56.00kb/s CBR JointStereo/I
[RIFF(AVI1.0)] 00:00:44.611 (44.611sec) / 18,252,536Bytes

[90frame.avi]
256x256 24Bit 無圧縮 5.00fps 90f 7864.64kb/s
[RIFF(AVI1.0)] 00:00:18.000 (18.000sec) / 17,700,984Bytes

[1000frames.avi]
256x256 24Bit 無圧縮 5.00fps 1858f 7864.64kb/s
[RIFF(AVI1.0)] 00:06:11.600 (371.600sec) / 365,346,360Bytes

[08bbc6e4-33b7-46d9-beef-b9e3c8b14423.avi]
256x256 24Bit XviD 1.1.-127 5.00fps 52675f 60.65kb/s
[RIFF(AVI1.0)] 02:55:35.000 (10535.000sec) / 80,715,776Bytes

[IDBJ.avi]
256x224 24Bit 3ivx Delta 4 60.00fps 663f 1334.43kb/s
PCM 22.05kHz 16Bit 2ch 705.60kb/s
[RIFF(AVI1.0)] 00:00:11.050 (11.050sec) / 2,843,136Bytes

[SM-Redesign_TAS-v1_Drewseph_512kb.mp4]
320x240 24Bit AVC/H.264 Baseline@1.3 60.00fps 408722f 512.26kb/s
AAC 44.10kHz 2.0ch(2/0 L+R) LC 64.00kb/s
[Extra][2]
MP4 Base Media v1
MetaData
[MPEG4] 01:53:32.033 (6812.033sec) / 495,134,927Bytes

[阪神x広島20070830から3分.mpg]
720x480 29.97fps 4:3 6000.00kb/s
MPEG1-LayerII 48.00kHz 224.00kb/s CBR Stereo
[Extra][3]
SCR  : 00:03:00.623 (180.623sec)
GOP  : 00:02:59.934 (179.934sec)
RATE : 00:02:50.037 (170.037sec)
[MPEG2] 00:03:00.623 (180.623sec) / 127,535,108Bytes

真空波動研Lite 081122 / DLL 081122
videoPlay.cpp
#include <iostream>
#include <cv.h>
#include <highgui.h>

using namespace std;

int main(void)
{
	char *in_video_file = "c:/data/video/roid/SM-Redesign_TAS-v1_Drewseph_512kb.mp4";
	// 事前から読込不能
	// 0001.avi
	// 0001[cinepak,mp3].avi
	// 90frame.avi
	// 1000frames.avi
	// 08bbc6e4-33b7-46d9-beef-b9e3c8b14423.avi
	// roid/IDBJ.avi
	// 新たに読込可能
	// roid/SM-Redesign_TAS-v1_Drewseph_512kb.mp4
	// 依然として読込不能
	// baseball/阪神x広島20070830から3分.mpg
	CvCapture *in_video_cap = cvCaptureFromFile(in_video_file);
	if(!in_video_cap)
	{
		// ビデオ読込失敗
		cout << "ビデオ読込失敗" << endl;
		cout << "  in_video_file: " << in_video_file << endl;
		return 1;
	}

	// ビデオ読込成功
	cout << "ビデオ読込成功" << endl;
	cout << "  in_video_file: " << in_video_file << endl;

	char *play_window_name = "映像表示";
	cvNamedWindow(play_window_name);
	IplImage *frame;
	int key;

	while( (frame = cvQueryFrame(in_video_cap) ) != NULL)
	{
		cvShowImage(play_window_name, frame);
		key = cvWaitKey(8);
		if(key == 0x1b) // ESC キーで中断
			break;
	}

	cvReleaseCapture(&in_video_cap);
	cvDestroyAllWindows();

	return 0;
}
結果

初期状態では入力した動画リストの下2つが読み込めなかった.ffopencv110.dll 導入後には新たに mp4 を読み込めるようになった.MPEG-2 ビデオは依然として読み込めなかった.本家は読めるのに.

C:\Software\AV\ffmpeg>ffmpeg -formats | grep mpeg2
FFmpeg version SVN-r12665, Copyright (c) 2000-2008 Fabrice Bellard, et al.
  configuration: --enable-gpl --enable-postproc --enable-swscale --enable-avfilt
er-lavf --enable-pthreads --enable-liba52 --enable-avisynth --enable-libfaac --e
nable-libfaad --enable-libgsm --enable-memalign-hack --enable-libmp3lame --enabl
e-libnut --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid
 --cpu=i686 --extra-ldflags=-static
  libavutil version: 49.6.0
  libavcodec version: 51.54.0
  libavformat version: 52.13.0
  libavdevice version: 52.0.0
  built on Apr  2 2008 22:35:11, gcc: 4.2.3
  E mpeg2video      MPEG2 video
 DEVSDT mpeg2video