-
基本的视频播放功能
引入头文件,声明命名空间。
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std;
声明全局变量
VideoCapture cap; // 读取视频 Mat frame; //储存每一帧
主函数框架如下
int main() { //读取视频 string path = "D://course//DigitalVideoProcess//labs//lab3//video//exp3.avi"; cap.open(path); if (!cap.isOpened()) { cout << "Error opening video file" << endl; return -1; } // 设置显示窗口大小 namedWindow("Video Player", WINDOW_NORMAL); resizeWindow("Video Player", 800, 600); /* 在这里执行对视频的操作*/ //释放内存 cap.release(); destroyAllWindows(); return 0; }
在“执行对视频的操作”的代码块中执行while循环,每一个循环获取下一帧,将获取到的帧显示在窗口中。循环的代码块如下。
while (true) { //读入帧 cap >> frame; if (frame.empty()) { cout << "End of video" << endl; break; } //显示当前帧 imshow("Video Player", frame); }
-
暂停和恢复播放功能
在播放循环的过程中通过消息响应机制捕捉用户在键盘上的输入。
通过
1000 / fps
可以计算出每一帧显示所需要的时间。waitKey()
函数会等待这段时间,以便在每一帧之间保持一定的间隔,从而控制视频的播放速度。在每一帧的循环过程中都等待一帧的时间来获取键盘输入(空格)来判断是否要暂停播放。这里用一个bool变量isPlaying来储存是否正在播放的状态。
while(true){ .... int key = waitKey(1000 / fps); // 控制视频播放速度 if (key == ' ') { // 按空格键暂停或播放 isPlaying = !isPlaying; }
通过isPlaying的true或者false来实现视频的暂停。wa
while (true) { if (isPlaying) { cap >> frame; if (frame.empty()) { cout << "End of video" << endl; break; } imshow("Video Player", frame); int key = waitKey(1000 / cap.get(CAP_PROP_FPS)); if (key == ' ') { isPlaying = !isPlaying; // 暂停/播放切换 } } else { Mat pausedFrame = frame.clone(); //在复制帧图像上显示PAUSED putText(pausedFrame, "PAUSED", Point(50, 50), FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 0, 255), 2); //显示当前帧 imshow("Video Player", pausedFrame); int key = waitKey(0); if (key == ' ') { isPlaying = !isPlaying; // 暂停/播放切换 } } }
完整代码、
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
VideoCapture cap;
Mat frame;
string path = "D://course//DigitalVideoProcess//labs//lab3//video//exp3.avi";
cap.open(path);
if (!cap.isOpened()) {
cout << "Error opening video file" << endl;
return -1;
}
namedWindow("Video Player", WINDOW_NORMAL);
resizeWindow("Video Player", 800, 600);
bool isPlaying = true;
while (true) {
if (isPlaying) {
cap >> frame;
if (frame.empty()) {
cout << "End of video" << endl;
break;
}
imshow("Video Player", frame);
int key = waitKey(1000 / cap.get(CAP_PROP_FPS));
if (key == ' ') {
isPlaying = !isPlaying; // 暂停/播放切换
}
}
else {
Mat pausedFrame = frame.clone();
//在复制帧图像上显示PAUSED
putText(pausedFrame, "PAUSED", Point(50, 50), FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 0, 255), 2);
//显示当前帧
imshow("Video Player", pausedFrame);
int key = waitKey(0);
if (key == ' ') {
isPlaying = !isPlaying; // 暂停/播放切换
}
}
}
cap.release();
destroyAllWindows();
return 0;
}
运行结果