I found myself needing to verify caller ID operation of a couple of troublesome telephone handsets. To properly test, I want to run 1,000 calls to the handsets and verify they decode caller ID every single time.
During early testing, I would manually call the handsets about 20 times to see if they looked good. Typically the error occurs every 3rd-4th call so that was a little slow but do-able. But there is no way I’m sitting still to watch 1,000 calls.
I could video record the handsets, but watching the video is no faster and trying to fast forward was going to be clumsy as well.
What I really need is a way to toss out most of the video frames then I could just advance a few frames to see the next call.
I recorded the video off a webcam using VLC using this procedure:
After some research I found a utility call ffmpeg which does many things, but for my current need, you can tell it to extract <n> frames per second and save them as a file.
ffmpeg can be found here:
My first test was to extract one frame per second which I did with this command:
ffmpeg -i myfile.mp4 -vf fps=1 c:\tmp\pics\out_%%03d.png
This created a PNG file once a second (1 frame per second), reading myfile.mp4 and creating a series of PNG files called out_001.png, … .
This worked pretty well, but a complete test cycle takes about 20 seconds so I was ending up with 20 PNG files / cycle to flip thru. That’s too many.
I watched the testing process, and both phones’ displays are on for about 10 seconds from the time the CID message comes thru. If I were to capture a frame every 5 seconds, that would be about perfect.
So I ended up using this command:
ffmpeg -i myfile.mp4 -vf fps=0.2 c:\tmp\pics\out_%%03d.png
Now I end up with about 5 frames per test call.
Using picasa to view the first file, I can go to the first picture showing the caller ID message. Then I just press the right key 5 times and I’m on the same spot in the next test. That I can do very quickly.
I can process roughly 1 test every 2-3 seconds flipping thru 5 pics verses having to watch hours of video which just isn’t going to happen.
I’ve went thru this process quite a few times now. Works well, but having to constantly click thru still images is a pain.
So using ffmpeg again as directed here:
I created a video to watch. I can then stare blankly at the video and just pause when I think an event has been missed.
When I did the extract, I was extracting 1 frame from the original video every 10 seconds. When I create the new video, I want to see each of those extracted frames every 1/2 second (2 frames per sec). This is the command I used to construct the video:
"\Program Files\ffmpeg\bin\ffmpeg.exe" -framerate 2 -i f11b_%%04d.jpg -c:v libx2 64 -r 30 -pix_fmt yuv420p outx.mp4
My input file is f11b_0001.jpg, f11b_0002.jpg, …
My output file is outx.mp4
I’m reading these jpg files at a rate of 2 / sec (-framerate 2).
The output MP4 file contains 30 frames per sec (-r 30).