Я создал приложение для извлечения каждого кадра из видео. Это еще не идеально, и с ним много проблем. Одна из проблем заключается в том, сколько времени это займет. Извлечение кадров 3-минутного видео заняло целых 2 часа, а исходное видео заняло четыре минуты, но после того, как видео было почти закончено, возникла ошибка памяти:
'OpenCV: не удалось выделить 2764800 байт '
Итак, выполнение задачи занимает много времени, и у нее есть несколько ошибок. Я использую Emgu.CV и MediaToolkit
Вот мой код:
using Emgu.CV;
using MediaToolkit;
using MediaToolkit.Model;
string file;
private void CreateFrames()
{
int i = 0;
VideoCapture _video = new VideoCapture(file);
var videoInfo = new MediaFile { Filename = file };
using (var engine = new Engine()) { engine.GetMetadata(videoInfo); }
while (i <= videoInfo.Metadata.Duration.Milliseconds * videoInfo.Metadata.VideoData.Fps)
{
Mat m = new Mat();
_video.Read(m);
_video.SetCaptureProperty(Emgu.CV.CvEnum.CapProp.PosFrames, i);
preview.Image = _video.QueryFrame().ToBitmap();
Bitmap bitmap = _video.QueryFrame().ToBitmap();
bitmap.Save(String.Format(@"C:\\frames\\videoframe-{0}.png", i),
ImageFormat.Png);
i++;
}
}
private async void browse_Click(object sender, EventArgs e)
{
DialogResult result = openFileDialog.ShowDialog();
if (result == DialogResult.OK)
{
file = openFileDialog.FileName;
var videoInfo = new MediaFile { Filename = file };
using (var engine = new Engine()) { engine.GetMetadata(videoInfo); }
label1.Text = videoInfo.Metadata.VideoData.Fps + " \n" +
videoInfo.Metadata.Duration.ToString();
// must be run on a second thread else it will not work and it will freeze
Task getframes = new Task(CreateFrames);
getframes.Start();
}
}
Я был бы признателен, если бы у кого-нибудь было решение сделать это быстрее и, возможно, решить проблему с памятью.