Si vous avez déjà fait des tuto video, ou même juste imaginé en faire, vous vous retrouvez confronté à une tonne de problèmes : le montage, les incrustations, les génériques, le titrage, le stockage, l’encodage etc.

tuto_01

J’ai cherché sur le net sans rien trouver, et au vu du temps que cela commençait à prendre, je me suis dit : « Autant le faire ! » … Et Bim : on y go.

 

Alors trois  aspects sont à aborder :

  1. Le matériel
  2. Le logiciel
  3. Le contenu (si ! il faut en parler …)

1. Le matériel

La machine

J’utilise un PC portable classique pour faire le développement, mais je vais porter tout ça sur une RaspberryPi. J’hésite à utiliser la webcam dédiée, on verra…

La prise de vue

Je vais recycler un truc génial (car inventé par moi ;-D) : la LampCam :

La lampacam : Une caméra placée dans une lape de bureau !

La lampacam : Une caméra placée dans une lape de bureau !

Il s’agit d’une lampe de bureau, sur pied, que j’ai caniblisé pour la bonne cause :

  • Arrachage des cables électriques
  • Démontage de la douille et de la  lampe
  • Remplaçage par une webcam de PS3 (trop bonne petites cam : 30fps / 800×600, sans lag…)

ça donne une caméra qui regarde le bureau, sur une zone de 60cm*40 environ

Il faudrait ajouter une petite rangée de leds blanches, mais les tentatives sont vaines (trop flashy, trop de reflets, trop d’ombres … ), l’éclairage est à revoir. Il faut utiliser deux ou trois lampes de bureau à côte.

Le son

Le micro du PC, mais il fuadrait déporter un micro au niveau de la webcam. Celle utilisée, PS3eye a une rangée de 4 micros, je devrait bien réussir à les utiliser (au moins 1)

Micros de la cam PS3

2. Le logiciel

Je vais vite expliquer le concept du script que je développe :

  1. Enregistrement de la video avec une visualisation en temps réel.
  2. Possibilité de faire des pauses
  3. Possibilité de faire des annotations pendant la pause (qui s’affichent donc à la reprise de l’enregistrement)
  4. Saisie des infos : Auteur, titre, contenu, sous-titre, logo…
  5. Encodage de la video, incrust’ des logos, ajout des génériques début & fin, incrustation des commentaires.
  6. Sauvegarde & upload sur votre chaine (Youtube, ftp …)

Techniquement, à ce jour, j’arrive à enregistrr une video, et faire un post processing (logo, ajout des titres & génériques) et encodage du fichier de sortie.

Le reste ira assez vite.

Vous pouvez chopper le git du code ici :

https://github.com/AstHrO/tutobox

Aperçu à ce jour  (ha, oui, c’est du python 2.7 …)

[code language="python"]
#!/usr/bin/env python

from moviepy.editor import *
from moviepy.video.tools.credits import credits1
import multiprocessing
import Tkinter as tk
import cv2
from PIL import Image, ImageTk
from moviepy.editor import *
from moviepy.video.tools.credits import credits1


width, height = 640, 480
cap = cv2.VideoCapture(0)

root = tk.Tk()
lmain = tk.Label(root)
lmain.pack()
e = multiprocessing.Event()
p = None

# -------begin capturing and saving video
def startrecording(e):
    fourcc = cv2.cv.CV_FOURCC(*'MJPG')
    out = cv2.VideoWriter('tmp/output.avi',fourcc,  20.0, (640,480))
    while(cap.isOpened()):
        if e.is_set():
            cap.release()
            out.release()
           # cv2.destroyAllWindows()
           # e.clear()
        ret, frame = cap.read()
        if ret==True:
            out.write(frame)
        else:
            break

def pauserecording(e):
    e.set()
    p.join()

def start_recording_proc():
    global p
    p = multiprocessing.Process(target=startrecording, args=(e,))
    p.start()

# -------end video capture and stop tk
def stoprecording():
    e.set()
    p.join()
    clip = (VideoFileClip('tmp/output.avi', audio=False))
    

    credits = credits1('settings/credits.txt',3*clip.w/4,gap=10,fontsize=20,color="white")
    scrolling_credits = credits.set_pos(lambda t:('center',-10*t)).set_start(3).crossfadein(1)
    titre = TextClip(txt="Tuto XXX", color="white",bg_color="black",fontsize=20).set_pos((80,15))
    logo = ImageClip("settings/logo.png").set_pos((0,0)).resize(height=50)

    final = CompositeVideoClip([clip,logo,scrolling_credits,titre])
    
    final.subclip(0,clip.duration).write_videofile("output/demo.mp4",fps=20) 

def quit():
    e.set()
    p.join()
    root.quit()
    root.destroy()

def show_frame():
    _, frame = cap.read()
   # frame = cv2.flip(frame, )
    cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
    img = Image.fromarray(cv2image)
    imgtk = ImageTk.PhotoImage(image=img)
    lmain.imgtk = imgtk
    lmain.configure(image=imgtk)
    lmain.after(10, show_frame)

root.geometry("%dx%d+0+0" % (640, 560))
startbutton=tk.Button(root,width=10,height=1,text='Start',command=start_recording_proc)
stopbutton=tk.Button(root,width=10,height=1,text='Stop', command=stoprecording)
pausebutton=tk.Button(root,width=10,height=1,text='Pause', command=pauserecording)
quitbutton=tk.Button(root,width=10,height=1,text='Quit', command=quit)
startbutton.pack()
stopbutton.pack()
quitbutton.pack()
pausebutton.pack()
show_frame()
root.mainloop()

 [/code]

3. Le contenu

Là, c’est à vous de voir, mais l’outil aura une partie de paramètres « en dur » (logos, effets, durée des titres), et une autre que vous pourrez saisir au vol (Titre, auteur, intervenants, sous-titre).

Ainsi on garde un côté homogène des videos, et on ne s’embête pas à réinventer la roue à chaque fois !

Je vous laisse vous amuser et suivre le code qui avance petit à petit…