前几天需要把视频剪成5秒5秒的小段,手动剪显然太不靠谱,就写了个剪视屏的小程序。
先上程序:
#include "opencv.hpp" #include "iostream" using namespace cv; using namespace std; int main(int argc, char** argv) { VideoCapture cap; // 用于打开视频的类 VideoWriter writer; //用于写视频的类 Mat frame; // 暂存视频帧图像 char c = NULL; string name1="E:\\1\\test.avi"; //原视频路径 string name2="E:\\1\\1.avi"; //视频保存路径 string tmp; stringstream sstr; //string流,用于把int转为string cap.open(name1); //打开原视频 int i=0,j=0; while(cap.isOpened()) //循环到视频最后一帧 { if(i%145==0) //每145帧存一个视频 { j=i/145; //新视频名,用数字命名 sstr.str(""); //清空string流,不能用clear() sstr << j; //int读入sstr tmp=sstr.str(); //.str()将int转为string name2="E:\\1\\"+tmp+".avi"; //新视频保存的完整路径 writer.open(name2,CV_FOURCC('D', 'I', 'V', '3'), 25.0, Size(432, 240)); //打开写视频类 } cap>>frame; //视频帧流入 writer << frame; //视频帧写入 imshow("Video", frame); //播放视频帧 ++i; // 数字名累加 c = waitKey(50); // 每50ms播放一帧,按Esc退出 if (c == 27) break; } destroyAllWindows(); cap.release(); return 0; }
程序里最重要的是这行代码:
writer.open(name2,CV_FOURCC('D', 'I', 'V', '3'), 25.0, Size(432, 240));
具体可以参照一下下面的链接:
http://blog.csdn.net/yang_xian521/article/details/7440190
大概的东西都在注释里说了,就不罗嗦了。