public async Task<bool> DoFramesCaptureAsync(string videoPath, string savePath)
{
int interval = 10; // 设置抽帧间隔(单位s),根据需要调整
int frameCount = 0;
int num_count = 0;
if (videoPath != null && savePath != null)
{
VideoCapture videoCapture = new VideoCapture(videoPath);
var frameRate = Convert.ToInt32(videoCapture.Fps);
Console.Out.WriteLine($"{DateTime.Now}:【" + videoPath + "】文件抽帧处理(帧率:" + frameRate.ToString() + "/抽帧间隔:" + interval.ToString() + "秒)");
Console.Out.WriteLine($"{DateTime.Now}:【" + savePath + "】文件保存地址");
if (!videoCapture.IsOpened())
{
videoPath = videoPath.Split('.')[0] + "temp.mp4";
videoCapture = new VideoCapture(videoPath);
frameRate = Convert.ToInt32(videoCapture.Fps);
Console.Out.WriteLine($"{DateTime.Now}:" + "重新尝试");
Console.Out.WriteLine($"{DateTime.Now}:【" + videoPath + "】文件抽帧处理(帧率:" + frameRate.ToString() + "/抽帧间隔:" + interval.ToString() + "秒)");
Console.Out.WriteLine($"{DateTime.Now}:【" + savePath + "】文件保存地址");
if (!videoCapture.IsOpened())
{
Console.Out.WriteLine($"{DateTime.Now}:【" + videoPath + "】文件打开失败!");
return false;
}
}
var totalFrames = videoCapture.FrameCount;
while (totalFrames >= frameCount)
{
Mat processedFrame = new Mat();
videoCapture.Read(processedFrame);
try
{
Cv2.ImWrite(savePath + num_count.ToString() + "_output_image.jpg", processedFrame);
processedFrame.Dispose();
frameCount = frameCount + interval * frameRate;
videoCapture.PosFrames = frameCount;
num_count++;
await Task.Delay(5);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
return false;
}
}
videoCapture.Dispose();
return true;
}
return false;
}
C#利用OpenCvSharp实现视频抽帧
最新推荐文章于 2025-04-04 09:48:30 发布