Commit e44ce565 authored by paul's avatar paul

Le projet est fonctionnel ! Via l'interface WEB, on peut

enregistrer, encoder, créer la miniature, ainsi que de 
mettre à disposition la vidéo en streaming.


git-svn-id: file:///mnt/marvin-var/svn/magneto/trunk@122 f61d8a82-367e-4513-8f0b-2a88b49b8d76
parent 5d5f41dd
......@@ -9,20 +9,6 @@
\end{figure}
\end{frame}
\begin{frame}
\begin{block}{Fonctionnement}
\begin{itemize}
\item \textsc{http} :
\begin{itemize}
\item Entre le serveur et un ordinateur client
\item Entre le serveur et un boitier \textsc{ip}
\end{itemize}
\item Streaming ;
\item Liaisons analogiques.
\end{itemize}
\end{block}
\end{frame}
\subsection*{boîtier \textsc{iptv}}
\begin{frame}
......
......@@ -90,7 +90,7 @@ class Schedule(SQLObject):
def get_path(self):
"""Retoune la position de la video sur le disque"""
return "%s%s.%s" % (conf.VIDEO_PATH, self.id, conf.VIDEO_MUXER)
return "%s/%s.%s" % (conf.VIDEO_PATH, self.id, conf.VIDEO_MUXER)
def get_streaming_URL(self):
""" Renvoie une url de streaming RTSP."""
......@@ -114,7 +114,7 @@ class Schedule(SQLObject):
indiquée. L'enregistre au format brut dans le raw_video_path.
"""
recorder = api.VlcRecorder(self.channel.frequency, "%s%s.avi" % (conf.TMP_PATH, self.id))
recorder = api.VlcRecorder(self.channel.frequency, "%s/%s.avi" % (conf.TMP_PATH, self.id))
recorder.start(self.duration)
self.recorded = True
#TODO: virer le CronJob.
......@@ -126,7 +126,7 @@ class Schedule(SQLObject):
VLC lit la vidéo dans tmp_path, le compresse dans
et l'écrit dans video_path.
"""
encoder = api.VlcEncoder("%s%s.avi" % (conf.TMP_PATH, self.id), "%s%s.%s" % (conf.VIDEO_PATH, self.id, conf.VIDEO_MUXER))
encoder = api.VlcEncoder("%s/%s.avi" % (conf.TMP_PATH, self.id), "%s/%s.%s" % (conf.VIDEO_PATH, self.id, conf.VIDEO_MUXER))
encoder.start()
encoder.create_thumbnail(self.duration / 2, conf.THUMBS_PATH)
self.encoded = True
......@@ -134,7 +134,7 @@ class Schedule(SQLObject):
def stream(self):
"""Ajoute la vidéo au serveur de VOD"""
vod = api.VlcVod()
vod.add_ressource("%s%s.%s" % (conf.VIDEO_PATH, self.id, conf.VIDEO_MUXER), self.id)
vod.add_ressource("%s/%s.%s" % (conf.VIDEO_PATH, self.id, conf.VIDEO_MUXER), self.id)
class TvChannel(SQLObject):
......@@ -186,7 +186,7 @@ class TvCard(SQLObject):
scan_card = TvCard.get_a_free(scan_start_date, 3)
#TODO: vrai scan (ici: valeurs bidons).
return (503250, 2000, 3000)
return (479250, 2000, 3000)
@classmethod
......
......@@ -19,7 +19,7 @@ DB_PASSWORD = 'magneto'
#
# Où seront stockée temporairement les vidéos brutes ?
# NB: prévoir un grand espace, ~10GiO par H de vidéo
TMP_PATH="/tmp/"
TMP_PATH="/tmp"
# Racine du projet
PROJECT_PATH="/usr/share/magneto"
......
......@@ -13,7 +13,7 @@ class VlcWrapper:
def run_cmd(self, args):
# Méthode permettant par la suite de faciliter le lancement des commandes Vlc
program = subprocess.Popen(("vlc","-Irc") + args)
program = subprocess.Popen(("cvlc",) + args)
return program
......@@ -22,18 +22,19 @@ class VlcVod(VlcWrapper):
def connexion(self):
tn = telnetlib.Telnet("127.0.0.1", conf.TELNET_PORT)
tn.write(conf.TELNET_PASSWD + "\n")
return tn
def add_ressource(self, video_path, url_name):
# Ajouter une ressource au processus vlc
# 1ère étape : Connexion telnet Vlc
self.connexion()
tn = self.connexion()
# 2ème étape : Ajout d'une entrée VOD : "new Test vod enabled"
tn.write("new %s vod enabled" % (url_name))
tn.write("new %s vod enabled\n" % (url_name))
# 3ème étape : association de la vidéo au chemin indiqué sur l'entrée VOD : "setup Test input [chemin de la vidéo].avi"
tn.write("setup %s input %s" % (url_name,video_path))
tn.write("setup %s input %s\n" % (url_name,video_path))
# 4ème étape : déconnexion de telnet
tn.close()
......@@ -54,6 +55,9 @@ class VlcVod(VlcWrapper):
"--rtsp-host", "%s:%s" % ("0.0.0.0", conf.RTSP_PORT))
self.pid=self.run_cmd(args).pid
# On attend que l'interface TCP soit lancée
time.sleep(1)
def stop_server(self):
# Arrêt du serveur Telnet
os.kill(self.pid, signal.SIGTERM)
......@@ -68,6 +72,9 @@ class VlcEncoder(VlcWrapper):
def start(self):
log = open("/tmp/log",'a')
sys.stderr = log
sys.stdout = log
cmd = ("%s" % (self.src), "--sout",
"#transcode{vcodec=%s,vb=%s,acodec=%s,ab=%s,channels=%s}:duplicate{dst=std{access=file,mux=%s,dst=%s}}"
......@@ -90,7 +97,7 @@ class VlcEncoder(VlcWrapper):
"--stop-time", "%s" % (position * 60 + 1),
"--image-out-format", "%s" % (conf.IMAGE_TYPE),
"--image-out-ratio", "%s" % (conf.IMAGE_RATIO),
"--image-out-prefix", "%s%s" % (dest_path, name),
"--image-out-prefix", "%s/%s" % (dest_path, name),
"--image-out-replace", self.dest, "vlc://quit")
program = self.run_cmd(cmd)
program.wait()
......@@ -114,7 +121,7 @@ class VlcRecorder(VlcWrapper):
def start(self, nbminutes):
cmd = ("v4l2://%s:standard=2:tuner-frenquency=%s:adev=%s"
cmd = ("v4l2://%s:standard=1:tuner-frenquency=%s:adev=%s"
% (conf.VIDEO_DEVICE, self.frequency, conf.AUDIO_DEVICE),
"--sout",
"#std{mux=avi,access=file,dst=%s}" % (self.dest))
......
......@@ -7,5 +7,5 @@ from magneto.core import models
if __name__ == "__main__":
#TODO: faire un test sur argv[0], il ne s'agit pas de passer n'importe quoi au script...
models.Schedule.get(id=sys.argv[0]).encode()
models.Schedule.get(id=sys.argv[1]).encode()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment