在你提供的代码中,如果录制的视频文件不能打开,可能有几个原因。下面是一些常见问题以及相应的解决方法:
1. 文件路径问题
确保你指定的文件路径是有效的,并且程序有权限写入该路径。请注意以下几点:
在 Windows 上,反斜杠
\
是转义字符。如果你想在字符串中使用它,通常需要写成\\
。例如:oss << "D:\\QT code\\last\\vid\\video_" << times.toStdString() << ".mp4";
确保目标目录 (
D:\QT code\last\vid\
) 已经存在。如果没有,你需要先创建这个目录。
2. 视频编码器支持
你正在使用 ‘XVID’ 编码器,这个编码器需要在你的系统上安装 Xvid 解码器。如果该编解码器不存在或未正确安装,则生成的视频可能无法打开。可以尝试其他编码格式,例如:
int codec = cv::VideoWriter::fourcc('M', 'J', 'P', 'G'); // 使用 MJPEG 编码
3. 检查 videoWriter.isOpened()
在调用 videoWriter.open()
后,应该检查其是否成功打开。在代码中加入如下检查:
if (!videoWriter.isOpened()) {
qDebug() << "视频文件未能成功打开!";
return;
}
这将帮助你确认是否是 VideoWriter
打开失败。
4. 确保获取到了帧数据
请确保你从摄像头捕获到帧数据并且 capture >> frame;
是成功的。在调用视频写入函数之前,可以添加一行检查,如下所示:
if (frame.empty()) {
qDebug() << "捕获的帧为空!";
return;
}
5. 正确设置视频参数
确保设置的视频参数(如宽度和高度)是有效的,并与捕获到的帧一致。
完整示例修改
结合上述建议,你可以修改相关部分如下:
// 获取当前时间作为视频文件名
QDateTime current = QDateTime::currentDateTime();
QString times = current.toString("yyyy-MM-dd HH mm ss");
std::ostringstream oss;
oss << "D:\\QT code\\last\\vid\\video_" << times.toStdString() << ".mp4";
recordViedo_fileName = oss.str();
cout <<"摄像头开启中,文件名:"<< recordViedo_fileName;
m_video_record=true;
cv::Mat frame;
// 捕获当前帧
capture >> frame;
if (frame.empty()) {
qDebug() << "捕获的帧为空!";
return;
}
// 设置视频编码和帧率
int codec = cv::VideoWriter::fourcc('X', 'V', 'I', 'D');
double fps = 25.0;
int width = capture.get(cv::CAP_PROP_FRAME_WIDTH);
int height = capture.get(cv::CAP_PROP_FRAME_HEIGHT);
// 尝试打开 VideoWriter
if (!videoWriter.open(recordViedo_fileName, codec, fps, cv::Size(width, height), true)) {
qDebug() << "视频文件未能成功打开!";
return;
}
connect(&timer_record, &QTimer::timeout, this, &MainWindow::updateFrame);
通过以上步骤,你应该能够找出导致录制后的视频文件无法打开的问题并进行修复。如果还有其他疑问,请随时告诉我!
内容由零声教学AI助手提供,问题来源于学员提问