OpenCV3-VideoWriter保存视频文件

最近使用网络摄像机做人脸检测、识别;在Ubuntu14.04下用opencv播放1029*1080P的rtsp视频流会出现画面卡顿、花屏;为确定时接收时问题还是sdl显示问题,将接收的视频码流直接保存到视频文件里,再播放查看。

 

OpenCV3中保存视频文件用的是VideoWriter,一下代码保存10分钟视频;


#include
#include
#include
#include

using namespace cv;
using namespace std;

int main(int, char**)
{
    Mat src;
    // use default camera as video source
    VideoCapture cap("rtsp://admin:[email protected]/h264/ch1/main/av_stream");
    // check if we succeeded
    if (!cap.isOpened()) {
        cerr << "ERROR! Unable to open camera\n";
        return -1;
    }
    // get one frame from camera to know frame size and type
    cap >> src;
    // check if we succeeded
    if (src.empty()) {
        cerr << "ERROR! blank frame grabbed\n";
        return -1;
    }
    bool isColor = (src.type() == CV_8UC3);

    //--- INITIALIZE VIDEOWRITER
    VideoWriter writer;
    int codec = CV_FOURCC('M', 'J', 'P', 'G');  // select desired codec (must be available at runtime)
    double fps = 25.0;                          // framerate of the created video stream
    string filename = "./live.avi";             // name of the output video file
    writer.open(filename, codec, fps, src.size(), isColor);
    // check if we succeeded
    if (!writer.isOpened()) {
        cerr << "Could not open the output video file for write\n";
        return -1;
    }

    //--- GRAB AND WRITE LOOP
    cout << "Writing videofile: " << filename << endl;
//         << "Press any key to terminate" << endl;
    int time = 600;
    struct timeval start;
    struct timeval end;
    //struct timezone tz; //后面有说明
    gettimeofday(&start,NULL); //gettimeofday(&start,&tz);结果一样


    for (;;)
    {
        // check if we succeeded
        if (!cap.read(src)) {
            cerr << "ERROR! blank frame grabbed\n";
            break;
        }
        // encode the frame into the videofile stream
        writer.write(src);
        gettimeofday(&end,NULL);
        if( (int)(end.tv_sec-start.tv_sec) > time )
            break;
        // show live and wait for a key with timeout long enough to show images
//        imshow("Live", src);
//        if (waitKey(5) == 27)
//            break;
    }
    // the videofile will be closed and released automatically in VideoWriter destructor
    return 0;
}

 

你可能感兴趣的:(OpenCV)