我想使用openCV java从视频中提取一个特定的帧。为此,我使用了以下代码,
int tmsec;
VideoCapture cap = new VideoCapture();
String input = "/storage/emulated/0/DCIM/Camera/VID_20221005_013149.mp4";
cap.open(input);
Mat frame = new Mat();
cap.set(Videoio.CAP_PROP_POS_MSEC, tmsec);
cap.read(frame);
if (Imgcodecs.imwrite("/storage/emulated/0/Images/testImg.jpg", frame)) {
System.out.println("Success");
} else {
System.out.println("Failed");
}
帧的时间(以毫秒为单位)已正确分配给变量“tmsec”(没有错误。此处未显示该代码)。
在使用不同的'tmsec'值运行此代码几次后,每次我都得到第一帧,而不是指定的帧。
我的代码中有什么错误?“cap.set(Videoio.CAP_PROP_POS_MSEC,tmsec)”是否有任何错误?不支持吗?有人能告诉我我的代码或任何替代方法有什么错误吗?
1条答案
按热度按时间9rnv2umw1#
您可能需要使用支持
CAP_PROP_POS_MSEC
的某个后端来构建OpenCV从官方文件来看:
阅读/写入属性涉及许多层。**沿着此链可能会发生一些意外结果。**有效行为取决于设备硬件、驱动程序和API后端。
您可以使用
cap.getBackendName()
方法检查后端-文档下面是关于后端的一般信息:
https://docs.opencv.org/4.6.0/d0/da7/videoio_overview.html
还要注意
CAP_PROP_POS_MSEC
可能无法正常工作,例如在视频帧速率可变的情况下,即使使用FFmpeg等工作的后端。