Preview avec mplayer

Contenu du snippet

Il existe beaucoup logiciels sous windows pour faire une preview d'une vidéo. Mais sous linux je n'ai rien trouvé d'équivalent. Donc voici l'utilité de ce petit code.

Source / Exemple :


#!/usr/bin/env python
# -*- coding:Utf-8 -*-

import os
import sys
import shutil
import glob
import Image
import ImageDraw
import ImageFont
import re

def snapshot(path, nb_lgn, nb_col):
	buff=os.popen('mplayer -identify -frames 0 '+path+' 2>/dev/null| grep ID_') # ouvre un pipe qui va recevoir les informations de mplayer
	infos=buff.read()
	buff.close()
	longueur = int(re.findall('ID_LENGTH=([0-9]*)', infos)[0]) # recherche la longueur de la vidéo
	os.mkdir(os.path.expanduser("~")+'/rtemp') # création d'un répertoire temporaire
	interval=int(longueur/(int(nb_lgn)*int(nb_col)))
	for i in range(3, longueur-interval, interval):
		os.system('mplayer -nosound -ss '+str(i)+' -frames 4 -vo jpeg:quality=99 '+path) # fait des captures avec mplayer
		try:
			shutil.move('00000004.jpg', os.path.expanduser("~")+'/rtemp/'+str(i).zfill(5)+'.jpg') # déplace et renomme la dernière capture dans un répertoire temporaire
		except IOError:
			print "Capture introuvable !"
	for i in range(1, 4):
		os.remove('0000000'+str(i)+'.jpg')
	return (infos, longueur)

def trait_path(path):
	path=path.replace(' ', '\\ ')
	path=path.replace('[', '\\[')
	path=path.replace(']', '\\]')
	path=path.replace('(', '\\(')
	path=path.replace(')', '\\)')
	return (path)

def index_th(nb_col, nb_lgn):
	nb_col, nb_lgn = int(nb_col), int(nb_lgn)
	img_idx  =  Image.new("RGB", (250*nb_col+10, 190*nb_lgn+70), "#00FF00") # création d'une image de fond
	x = 0
	y = 60
	pre = glob.glob(os.path.expanduser("~")+'/rtemp/'+'*.jpg')
	pre.sort() # tri des captures
	for i in pre: # boucle qui permet de positionner chaque capture sur l'image de fond
		im=Image.open(i)
		im_t = im.resize((240, 180), Image.ANTIALIAS)
		img_idx.paste(im_t, (10+250*x, 10+y))
		if (x == nb_col-1):
			y+=190
			x=0
		else:
			x+=1
	img_idx.save(os.path.expanduser("~")+'/index.jpg' , "JPEG")

def img_infos(infos, duree, path):
	# recherche des infos de la vidéo
	width = re.findall('ID_VIDEO_WIDTH=([0-9]*)', infos)[0]
	height = re.findall('ID_VIDEO_HEIGHT=([0-9]*)', infos)[0]
	path = path.replace("\\", "")
	taille = os.stat(path)[6]
	image = Image.open(os.path.expanduser("~")+'/index.jpg') # ouvre l'image crée
	draw  =  ImageDraw.Draw(image) 
	font = ImageFont.truetype(os.path.expanduser("~")+'/FreeMono.ttf', 20) # choix de la police et de la taille
	nom = path.split("/")
	# écriture des infos sur l'image
	draw.text((10, 0), "Nom : " + nom[-1], font=font, fill="#0000ff")
	draw.text((10, 16), "Taille : " + str(int(float(taille)/1048576)) + " Mo", font=font, fill="#0000ff")
	draw.text((10, 32), "Duree : " + str(int(float(duree)/60)) + " min", font=font, fill="#0000ff")
	draw.text((10, 48), "Resolution : " + width + "x" + height, font=font, fill="#0000ff")
	image.save(os.path.expanduser("~")+'/index.jpg', "JPEG")
	shutil.move(os.path.expanduser("~")+'/index.jpg', os.path.expanduser("~")+'/'+nom[-1][0:20]+'.jpg') # renomme l'image de preview

def main(argv):
	if os.path.isdir(os.path.expanduser("~")+'/rtemp'):
		shutil.rmtree(os.path.expanduser("~")+'/rtemp')
	try:
		path = trait_path(argv[0])
		info, longueur = snapshot(path, argv[1], argv[2])
		index_th(argv[2], argv[1])
		img_infos(info, longueur, path)
	except IndexError:
		print "Erreur : Il manque des arguments ou ils sont invalides."
		print "Usage : preview_mplayer.py chemin d'accès [nbr lignes] [nbr colonnes]"
		sys.exit(2)
	if os.path.isdir(os.path.expanduser("~")+'/rtemp'):
		shutil.rmtree(os.path.expanduser("~")+'/rtemp')

if __name__ == "__main__":
	main(sys.argv[1:])

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.