These days I just use this command and hit CTRL-C when the video frames (V:) stop moving:
mplayer -vo jpeg:outdir=screenshots -sstep 10 filename.mp4
But, this post remains for the sake of historical record – lol!
I admit… I do love PHP in the command line. Does that make me a bad person? 😉
Here’s a tiny little script that I wrote to create many JPG screenshots of a video file. I use this each week to create a bunch of stills from our broadcast so I can use them as thumbnails and so-on. I didn’t want it to depend on ffmpeg since I don’t have that on any of my modern systems.
It requires just three packages: mplayer mediainfo php-5
Save it as whatever.php and run it like this: php whatever.php file.wmv
It will create a folder called file-Screenshots/ and will save one picture per 10 seconds for any video source. Just change “file.wmv” to the name of your video. Include the path if it’s not in the current folder.
<?php // Depends: mplayer mediainfo // Does not need ffmpeg (deprecated) if ($_GET) { $file = $_GET['file']; } else { $file = $argv[1]; } if (strlen($file) < 3) exit('Need a proper filename for input.' . PHP_EOL); $dir = array_shift(explode('.',$file)) . '-Screenshots'; $duration = duration($file); echo 'Duration in Seconds: ' . $duration . PHP_EOL; echo 'Saving to folder: ' . $dir . PHP_EOL; echo 'Creating ' . ($duration/10) . ' JPG images from source...'; exec('mplayer -vo jpeg:outdir=' . $dir . ' -sstep 10 -endpos ' . ($duration-2) . ' ' . $file . ' > /dev/null 2>&1'); echo ' Done.' . PHP_EOL; function duration($file) { if (file_exists($file)) { exec('mediainfo -Inform="Audio;%ID%:%Format%:%Language/String%\n" ' . $file . ' | grep -m1 Duration | cut -d\':\' -f2',$result); $tmp = explode('h',$result[0]); $seconds = ((intval($tmp[0]*60)+intval($tmp[1]))*60); return intval(trim($seconds)); } else { exit('File ' . $file . ' not found.' . PHP_EOL); } } ?>
Hope it helps you out.
-Robbie