81 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| author: einar
 | |
| comments: true
 | |
| date: 2007-10-16 20:44:46+00:00
 | |
| layout: page
 | |
| slug: script-to-make-captures-of-movie-files
 | |
| title: Script to make captures of movie files
 | |
| wordpress_id: 312
 | |
| categories:
 | |
| - General
 | |
| - Linux
 | |
| tags:
 | |
| - bash
 | |
| - Linux
 | |
| - python
 | |
| - script
 | |
| ---
 | |
| 
 | |
| The other day I was thinking about how to make screencaps for the anime I watch. Windows users often use [Media Player Classic](http://sourceforge.net/projects/guliverkli/), which can create a video contact sheet (i.e., a series of captures) out of a movie file. I had two problems with this:
 | |
| 
 | |
| 
 | |
| 
 | |
| 	
 | |
|   * The biggest is that it runs on Windows, and I don't use Windows;
 | |
| 
 | |
| 	
 | |
|   * The frames needed to be manually cropped every time, which was slow.
 | |
| 
 | |
| 
 | |
| Therefore, inspired by [a video contact sheet script for Linux](http://freshmeat.net/projects/video-contact-sheet/), I decided to write a small piece of code to make captures. It works rather easy, by taking snapshots every X minutes, where X is an integer number.
 | |
| 
 | |
| The code is here: it requires bash, python (just for checks) and [mplayer](http://mplayerhq.hu) to work correctly. It should work with every format mplayer suppports. It's hackish, but if you find it useful, let me know.
 | |
| 
 | |
| **EDIT**: I changed a line (thanks, greg) because this syntax highlighter messes up some formatting.
 | |
| 
 | |
| [code lang='c']
 | |
| 
 | |
| #!/bin/bash
 | |
| # (C) 2007 Luca Beltrame - licensed under the terms of the GPL v2
 | |
| 
 | |
| # Simple script to output video frames with MPlayer. It takes the file
 | |
| # and a step argument to indicate how  many minutes a capture should
 | |
| # be taken. The step must be an integer!
 | |
| 
 | |
| if [ $# -ne "2" ]
 | |
| then
 | |
| echo "Usage: $0  "
 | |
| exit
 | |
| fi
 | |
| 
 | |
| file=$1
 | |
| step=$2
 | |
| i=1
 | |
| 
 | |
| # Requires python 2.5
 | |
| verification=`python -c "value = 0 if isinstance($step,float) else 1;print value"`
 | |
| echo $verification
 | |
| 
 | |
| if [ $verification -eq "0" ]
 | |
| then
 | |
| echo "Step must be an integer!"
 | |
| fi
 | |
| 
 | |
| length=`mplayer -benchmark -ao null -vo null -identify -frames 0 -quiet $file 2>/dev/null | grep ID_LENGTH | cut -f2 -d'='`
 | |
| 
 | |
| end=`echo $length/60| bc`
 | |
| 
 | |
| while [ $i -lt $end ]
 | |
| do
 | |
| minutes="00:"$i":00"
 | |
| name="capture_"$i"min.png"
 | |
| # We take two captures as the first will be always black - mplayer bug?
 | |
| mplayer -sws 9 -ao null -quiet -benchmark -vo "png:z=0" -frames 2 -ss $minutes "$1" &> /dev/null
 | |
| mv 00000002.png $name
 | |
| rm -f 00000001.png
 | |
| i=$[$i+$step]
 | |
| done
 | |
| 
 | |
| echo "Screenshots saved."
 | |
| 
 | |
| [/code]
 |