アプリケーションで奇妙な振る舞いに遭遇したときはいつでも、何が起こっているのかを理解するのに役立つ、短く、自己完結型の、正しい(コンパイル可能な)例を書きます。
私はあなたが何をすべきかを説明するために以下のコードを書きました。それが私のMacOSXで完全に機能することは注目に値します:
#include <cv.h>
#include <highgui.h>
#include <iostream>
#include <string>
int main(int argc, char* argv[])
{
// Load input video
cv::VideoCapture input_cap("Wildlife.avi");
if (!input_cap.isOpened())
{
std::cout << "!!! Input video could not be opened" << std::endl;
return -1;
}
// Setup output video
cv::VideoWriter output_cap("output.avi",
input_cap.get(CV_CAP_PROP_FOURCC),
input_cap.get(CV_CAP_PROP_FPS),
cv::Size(input_cap.get(CV_CAP_PROP_FRAME_WIDTH), input_cap.get(CV_CAP_PROP_FRAME_HEIGHT)));
if (!output_cap.isOpened())
{
std::cout << "!!! Output video could not be opened" << std::endl;
return -1;
}
// Loop to read frames from the input capture and write it to the output capture
cv::Mat frame;
while (true)
{
if (!input_cap.read(frame))
break;
output_cap.write(frame);
}
// Release capture interfaces
input_cap.release();
output_cap.release();
return 0;
}
入力ファイルをFFmpegで調べると、(ffmpeg -i Wildlife.avi
)がわかります。
Input #0, avi, from 'Wildlife.avi':
Metadata:
ISFT : Lavf52.13.0
Duration: 00:00:07.13, start: 0.000000, bitrate: 2401 kb/s
Stream #0.0: Video: msmpeg4v2, yuv420p, 1280x720, PAR 1:1 DAR 16:9, 29.97 tbr, 29.97 tbn, 29.97 tbc
Stream #0.1: Audio: mp3, 44100 Hz, 2 channels, s16, 96 kb/s
および出力:
Input #0, avi, from 'output.avi':
Metadata:
ISFT : Lavf52.61.0
Duration: 00:00:07.10, start: 0.000000, bitrate: 3896 kb/s
Stream #0.0: Video: msmpeg4v2, yuv420p, 1280x720, 29.97 tbr, 29.97 tbn, 29.97 tbc
したがって、2つのファイル間の唯一の重要な変更は、OpenCVによって生成された出力にオーディオストリームがないことです。これは、OpenCVがオーディオを処理しないため、正しい動作です。
アプリケーションを実行しているディレクトリで、ユーザーが読み取り/書き込み/実行するための適切な権限を持っていることを確認してください。また、コードに追加したデバッグは、おそらく入出力キャプチャに関連する問題を見つけるのに役立ちます。