Permalink
Browse files

atelier devoxx 2018 trucage video labyrinthe

  • Loading branch information...
sdpython committed Jan 15, 2018
1 parent ef53506 commit 3d7a57c7414bd3d0226a4ce543e7aa05367d32ba
View
@@ -273,3 +273,4 @@ _doc/notebooks/ateliers/devoxx2018/.ipynb_checkpoints
_doc/notebooks/ateliers/devoxx2018/*.mp4
_doc/notebooks/ateliers/devoxx2018/*.mp3
_doc/notebooks/ateliers/devoxx2018/Untitled.ipynb
_doc/notebooks/ateliers/devoxx2018/example.ipynb

Large diffs are not rendered by default.

Oops, something went wrong.
@@ -3,7 +3,7 @@
.. _l-montage_video:
Petit montage vidéo avec Python
Petit trucage vidéo avec Python
===============================
A partir de 7 ans.
@@ -21,19 +21,25 @@ sur la réalisation de petits films.
Mise en scène
-------------
On souhaite réaliser un dialogue imaginaire à partir de
personnages qui appartiennent à des films ou à des vidéos
différentes.
On souhaite réaliser des trucages vidéos comme
celui de passer à travers un mur, de changer sa voix,
ou courir à toute allure. Ce jeu se joue à deux ou trois,
un metteur en scène, un ou deux acteurs.
Exercice 1
----------
.. video:: mur.mp4
:width: 50%
:height: 50%
#. Ecrire un petit scénario avec deux ou trois répliques
qu'on pourra réaliser à partir de vidéos :epkg:`youtube`.
On peut choisir des films, des chansons...
#. Télécharger les vidéos si besoin avec le module
:epkg:`pytube` ou la fonction
:func:`download_youtube_video <code_beatrix.faq.faq_video.download_youtube_video>`.
Ce petit notebook pour vous aider tout au long
de l'atelier : :ref:`exemplevideodevoxx2018rst`.
Exercice 1 - passer à travers un mur
------------------------------------
#. Choisir un mur, supposer qu'on peut trafiquer un film,
imaginer ce qu'il faudrait faire pour passer à travers
un mur.
#. Filmer les séquences nécessaires.
#. Visionner les vidéos et noter à la seconde près les extraits
des vidéos.
#. Extraire chaque bout avec la fonction
@@ -43,34 +49,35 @@ Exercice 1
#. Enregister la vidéo avec la fonction
:func:`video_save <code_beatrix.faq.faq_video.video_save>`.
Exercice 2
----------
Exercice 2 - ajouter du texte
-----------------------------
#. On reprend la vidéo précédente et on y inscrute
#. On reprend la vidéo précédente et on y incruste
du texte et des images pour commenter ce que les personnages,
pour s'en moquer ou font ou pour les doubler.
**fonction non implémentée**
pour s'en moquer ou font ou pour les doubler :
:func:`video_text <code_beatrix.faq.faq_video.video_text>`.
#. Enregister la vidéo avec la fonction
:func:`video_save <code_beatrix.faq.faq_video.video_save>`.
Exercice 3
----------
Exercice 3 - changer la musique
-------------------------------
#. Choisir une musique pour en faire une bande son,
sur :epkg:`youtube` par exemple, avec le module :epkg:`pytube`
ou la fonction :func:`download_youtube_video <code_beatrix.faq.faq_video.download_youtube_video>`.
#. Extraire la bande de la vidéo précédente avec la fonction
:func:`video_extract_audio <code_beatrix.faq.faq_video.video_extract_audio>`.
#. Choisir une musique pour en faire une bande son.
#. Superposer les deux sons avec la fonction
:func:`audio_compose <code_beatrix.faq.faq_video.audio_compose>`.
#. S'il y a plusieurs sons, il faudra les concaténer la fonction
:func:`audio_concatenate <code_beatrix.faq.faq_video.audio_concatenate>`.
#. Enregister la vidéo avec la fonction
:func:`video_save <code_beatrix.faq.faq_video.video_save>`.
Exercice 4
----------
Exercice 4 - accélérer
----------------------
On reprend toutes les opérations pour un faire une seul programme
qu'on exécute pour vérifier qu'il donne bien la même chose qu'avant.
On choisit un des personnages et le faire parler deux plus vite
avec la fonction
On accélère la vidéo obtenue avec la fonction
:func:`video_modification <code_beatrix.faq.faq_video.video_modification>`.
Solution
@@ -3,19 +3,19 @@
.. _l-montage_video_sol:
Petit montage vidéo avec Python (solution)
Petit trucage vidéo avec Python (solution)
==========================================
Solution de :ref:`l-montage_video`.
Exercice 1
----------
Exercice 1 - passer à travers un mur
------------------------------------
Exercice 2
----------
Exercice 2 - ajouter du texte
-----------------------------
Exercice 3
----------
Exercice 3 - changer la musique
-------------------------------
Exercice 4
----------
Exercice 4 - accélérer
----------------------
View
Binary file not shown.
@@ -71,6 +71,7 @@
imgmath_latex_preamble += custom_preamble
latex_elements['preamble'] += custom_preamble
mathdef_link_only = True
html_split_index = True
epkg_dictionary['AudioClip'] = 'https://zulko.github.io/moviepy/ref/AudioClip/AudioClip.html'
epkg_dictionary['deep learning'] = 'https://en.wikipedia.org/wiki/Deep_learning'
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -40,3 +40,10 @@ Voir :ref:`l-algo_labyrinthe`.
A quoi ça sert ?
----------------
Le problème du plus court chemin consiste à trouver le chemin
le plus rapide d'un point A à un point B sur un réseau routier,
un réseau informatique... Ce problème cache deux problématiques,
trouver la longueur du plus court chemin et le chemin lui-même.
C'est lors de cette seconde étape que l'idée du labyrinthe est
intéressante.
@@ -5,3 +5,32 @@ Retrouver son chemin (solution)
===============================
.. image:: labyrinthe.png
Comme toutes les équipes avaient une vue d'ensemble du
labyrinthe, la stratégie est devenue simplement :
*"suivez les gobelets"*. La dernière personne de l'équipe
devait suivre le chemin dans le labyrinthe marqué par les
gobelets pour ramasser le trésor et trouver la sortie.
Tous ont trouvé que les aiguillages posaient problème
et qu'il suffisait de placer un gobelet devant la branche
à suivre pour résoudre le problème.
.. image:: images/aiguillage.png
:width: 500
Mais voilà, arrivé à l'aiguillage, une personne ne sachant
pas ce qui se cache dans chacune des branches ne saura pas quelle
direction choisir si on dépose un gobelet devant chaque chemin
à moins de différencier l'une des deux branches avec un code
comme celui de poser deux gobelets devant la branche trésor.
.. image:: images/aiguillage2.png
:width: 500
La prochaine fois, il faudra que je trace un labyrinthe un peu
plus grand que celui-ci avec les gobelets placés aux bons endroits.
.. image:: images/labyrinthe_sol.png
:width: 300
Il faudra faire plus grand la prochaine fois.
@@ -0,0 +1,73 @@
# -*- coding: utf-8 -*-
"""
@brief test log(time=1000s)
Duraction is around a few seconds but the test needs to be run
at the end of the series of unitests as it interferes
with the notebook unittesting (it uses Popen too).
"""
import sys
import os
import unittest
try:
import pyquickhelper
except ImportError:
path = os.path.normpath(
os.path.abspath(
os.path.join(
os.path.split(__file__)[0],
"..",
"..",
"..",
"pyquickhelper",
"src")))
if path not in sys.path:
sys.path.append(path)
import pyquickhelper
try:
import src
except ImportError:
path = os.path.normpath(
os.path.abspath(
os.path.join(
os.path.split(__file__)[0],
"..",
"..")))
if path not in sys.path:
sys.path.append(path)
import src
from pyquickhelper.loghelper import fLOG
from pyquickhelper.pycode import get_temp_folder, ExtTestCase
from src.code_beatrix.faq.faq_video import video_save, video_modification, video_replace_audio, video_extract_audio, video_concatenate, audio_concatenate
class TestVideoAudioBug(ExtTestCase):
def test_video_audio_bug(self):
fLOG(
__file__,
self._testMethodName,
OutputPrint=__name__ == "__main__")
temp = get_temp_folder(__file__, "temp_video_audio_bug")
vid = os.path.join(temp, '..', 'data', 'videxa.mp4')
audio = video_extract_audio(vid)
vid2 = video_modification(vid, speed=2., mirrory=True, mirrorx=True)
audio1 = video_extract_audio(vid2)
audio3 = audio_concatenate([audio1, audio, audio1, audio1])
vid3 = video_concatenate([vid, vid2])
vid4 = video_replace_audio(vid3, audio3)
exp = os.path.join(temp, "courte2x.mp4")
video_save(vid4, exp)
self.assertExists(exp)
if __name__ == "__main__":
unittest.main()
View
@@ -20,7 +20,7 @@ pydocstyle
pyensae
pymmails
pymyinstall
pyquickhelper>=1.5.2259
pyquickhelper>1.6.2346
pyshp
pytube>=8.0.0
qgrid
@@ -16,7 +16,7 @@
import moviepy.video.fx.all as vfx
from moviepy.video.VideoClip import ImageClip, VideoClip
from moviepy.video.io.ImageSequenceClip import ImageSequenceClip
from moviepy.audio.AudioClip import AudioArrayClip, CompositeAudioClip
from moviepy.audio.AudioClip import CompositeAudioClip
from moviepy.video.compositing.CompositeVideoClip import CompositeVideoClip
from moviepy.video.compositing.concatenate import concatenate_videoclips
from moviepy.audio.AudioClip import concatenate_audioclips
@@ -100,6 +100,10 @@ def download_youtube_video(tag, output_path=None, res='720p', mime_type="video/m
yt = YouTube('https://www.youtube.com/watch?v={0}'.format(tag))
st = yt.streams.filter(mime_type=mime_type, res=res, **kwargs)
fi = st.first()
if fi is None:
raise ValueError("By default the function downloads a video with resolution = 720, " +
"if it is not available, switch to res=None " +
"to choose the first one available.")
fi.download(output_path=output_path)
return fi.default_filename
@@ -171,8 +175,8 @@ def audio_modification(audio, loop_duration=None, volumex=1.,
with AudioContext(audio) as audio:
if speed:
audio = audio.fl_time(lambda t: t * speed, keep_duration=True)
wav = audio.to_soundarray(fps=audio.fps)
audio = AudioArrayClip(wav, audio.fps)
# wav = audio.to_soundarray(fps=audio.fps)
# audio = AudioArrayClip(wav, audio.fps)
if volumex != 1.:
audio = audio.fx(afx.volumex, volumex)
if loop_duration:

0 comments on commit 3d7a57c

Please sign in to comment.