Preview avec mplayer

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 280 fois - Téléchargée 17 fois

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

Ajouter un commentaire Commentaires
Messages postés
2107
Date d'inscription
mercredi 21 août 2002
Statut
Contributeur
Dernière intervention
19 février 2021
2
J'ai testé ce script et il ne fonctionne pas. Je tape pourtant la commande adéquat mais je retombe toujours sur l'usage ...
Messages postés
3
Date d'inscription
mercredi 28 novembre 2007
Statut
Membre
Dernière intervention
7 janvier 2008

Quel est exactement ton problème ?

Pour le faire fonctionner, il suffit de taper dans une console ./preview_mplayer.py (pense au chmod) puis le chemin d'accès puis le nombre de lignes et enfin le nombre colonnes.

Tu peux aussi placer un lien symbolique dans /usr/local/bin qui pointe sur le fichier. Comme ça tu peux le lancer de n'importe où avec la commande preview (si ton lien s'appelle preview) puis le chemin d'accès puis le nombre de lignes et enfin le nombre colonnes.

PS : il faut aussi avoir le fichier de la police FreeMono.ttf dans ~ (au début je voulais directement pointer sur /usr/share/fonts/truetype/freefont/FreeMono.ttf mais j'avais des problèmes de permissions).

PS 2 :merci pour ton idée de mode d'emploi. Je le coderai dès que j'aurai un peu de temps.
Messages postés
7
Date d'inscription
samedi 22 avril 2006
Statut
Membre
Dernière intervention
6 janvier 2008

heuuu,
j'ai un peu de mal a le faire fonctionner.

tu peu ajouter un petit mode d'emploie, je n'arrive pas a le faire tourner

def usage(): #fonction affichant l'aide
print "usage :" # a realiser

if __name__ == "__main__":
if ( "-h" in sys.argv[1:] ) or ( "--help" in sys.argv[1:] ) :
usage()
else :
main(sys.argv[1:])
Messages postés
7
Date d'inscription
samedi 22 avril 2006
Statut
Membre
Dernière intervention
6 janvier 2008

Effectivement c'est une tres bonne idee de realiser cette petite application.
De plus ca l'aire d'etre code proprement tout ca.
Bravo, je vais le tester et le garder des que je rentre

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.