In version 11.1.1 I used MathMF by Simon Woods to extract png images from large avi files (up to 100GB in size). His package was MUCH faster than using something like that:
nImages = Length@Import["D:\\movie.avi", "Frames"];
Do[
image = Import["D:\\movie.avi", {"Frames", i}];
strCounter = ToString@PaddedForm[i, 5, NumberPadding -> {"0", ""}];
Export[StringJoin[outputPath, "image_", strCounter, ".png"], image,
"png"], {i, 1, nImages}
];
Already only reading the number of images of a large avi file of 6GB (containing 640*480 pixel images) takes a long time (45s). If somebody does not belive it, the file is available here: https://photos.app.goo.gl/1g2kffBySogQgtsS9).
The reading of a single image at a certain position i=1
takes also about 45 sec.
Why is this so slow? (I have 32 GB of RAM, processsor: i7-4940MX 3.1 GHz)
See this:
image = Import["D:\\movie.avi", {"Frames", 1}]; // AbsoluteTiming
{44.1149, Null}
FOR SMALL AVI FILES THIS PROBLEM IS "INVISIBLE"!
For comparison I took VirtualDub (for Windows) and opened the 6GB avi file. In less than a second it shows the first image and the total number of files (20159).
In versions 11.3 MathMF
does not work any more (see this question and the comment of Simon).
Simon mentioned the following:
Looking at the MediaTools package it seems like it might do everything that MathMF can do anyway. If you do
Needs["MediaTools`"]
and then?MediaTools`Private`$MF*
there appear to be functions for frame-by-frame reading and writing.
If I execute ?MediaTools`Private`$MF*
I get a list of fuctions.
How can I substitute with these functions my upper code to increase the performance?