From 891b7ef8db29e9df4bae99d212a2b737c2d7e0b3 Mon Sep 17 00:00:00 2001 From: Zulko Date: Wed, 27 Nov 2024 16:32:56 +0000 Subject: [PATCH] deploy: 9ff9d1a128b64fc7c4a4eb46f2d57b0d6ff1977a --- .../moviepy/audio/io/ffmpeg_audiowriter.html | 2 +- .../audio/io/ffplay_audiopreviewer.html | 6 +-- _modules/moviepy/video/VideoClip.html | 2 +- .../moviepy/video/io/ffplay_previewer.html | 6 +-- .../developers_install.rst.txt | 4 +- _sources/getting_started/FAQ.rst.txt | 6 +-- _sources/getting_started/docker.rst.txt | 2 +- _sources/getting_started/install.rst.txt | 10 ++-- .../moviepy_10_minutes.rst.txt | 22 ++++----- .../quick_presentation.rst.txt | 17 ++++--- .../getting_started/updating_to_v2.rst.txt | 28 +++++------ _sources/index.rst.txt | 4 +- _sources/user_guide/compositing.rst.txt | 10 ++-- _sources/user_guide/create_effects.rst.txt | 8 +-- _sources/user_guide/index.rst.txt | 4 +- _sources/user_guide/loading.rst.txt | 30 ++++++------ _sources/user_guide/modifying.rst.txt | 34 ++++++------- _sources/user_guide/rendering.rst.txt | 8 +-- .../moviepy_10_minutes/trailer.py | 16 +++--- .../code/user_guide/effects/custom_effect.py | 2 +- .../user_guide/effects/modify_copy_example.py | 2 +- .../code/user_guide/loading/AudioArrayClip.py | 2 +- _static/code/user_guide/loading/ColorClip.py | 2 +- .../user_guide/loading/UpdatedVideoClip.py | 2 +- developer_guide/developers_install.html | 4 +- getting_started/FAQ.html | 4 +- getting_started/docker.html | 2 +- getting_started/install.html | 10 ++-- getting_started/moviepy_10_minutes.html | 40 +++++++-------- getting_started/quick_presentation.html | 17 ++++--- getting_started/updating_to_v2.html | 40 +++++++-------- index.html | 4 +- objects.inv | Bin 13460 -> 13459 bytes ...ffmpeg_audiowriter.FFMPEG_AudioWriter.html | 2 +- ..._audiopreviewer.FFPLAY_AudioPreviewer.html | 2 +- .../moviepy.video.VideoClip.VideoClip.html | 2 +- ...ffplay_previewer.ffplay_preview_video.html | 4 +- searchindex.js | 2 +- user_guide/compositing.html | 10 ++-- user_guide/create_effects.html | 12 ++--- user_guide/index.html | 4 +- user_guide/loading.html | 40 +++++++-------- user_guide/modifying.html | 46 +++++++++--------- user_guide/rendering.html | 6 +-- 44 files changed, 243 insertions(+), 237 deletions(-) diff --git a/_modules/moviepy/audio/io/ffmpeg_audiowriter.html b/_modules/moviepy/audio/io/ffmpeg_audiowriter.html index 3021d530e..f9fe9c0d9 100644 --- a/_modules/moviepy/audio/io/ffmpeg_audiowriter.html +++ b/_modules/moviepy/audio/io/ffmpeg_audiowriter.html @@ -400,7 +400,7 @@

Source code for moviepy.audio.io.ffmpeg_audiowriter

Size (width,height) in pixels of the output video. fps_input - Frames per second of the input audio (given by the AUdioClip being + Frames per second of the input audio (given by the AudioClip being written down). codec diff --git a/_modules/moviepy/audio/io/ffplay_audiopreviewer.html b/_modules/moviepy/audio/io/ffplay_audiopreviewer.html index 965779732..8d3f7262c 100644 --- a/_modules/moviepy/audio/io/ffplay_audiopreviewer.html +++ b/_modules/moviepy/audio/io/ffplay_audiopreviewer.html @@ -392,7 +392,7 @@

Source code for moviepy.audio.io.ffplay_audiopreviewer

---------- fps_input - Frames per second of the input audio (given by the AUdioClip being + Frames per second of the input audio (given by the AudioClip being written down). nbytes: @@ -413,8 +413,8 @@

Source code for moviepy.audio.io.ffplay_audiopreviewer

# order is important cmd = [ FFPLAY_BINARY, - "-autoexit", # If you dont precise, ffplay dont stop at end - "-nodisp", # If you dont precise a window is + "-autoexit", # If you don't precise, ffplay won't stop at end + "-nodisp", # If you don't precise a window is "-f", "s%dle" % (8 * nbytes), "-ar", diff --git a/_modules/moviepy/video/VideoClip.html b/_modules/moviepy/video/VideoClip.html index 0e92dd489..1716cc9b2 100644 --- a/_modules/moviepy/video/VideoClip.html +++ b/_modules/moviepy/video/VideoClip.html @@ -1366,7 +1366,7 @@

Source code for moviepy.video.VideoClip

     ):
         """Returns a new clip in which just a rectangular subregion of the
         original clip is conserved. x1,y1 indicates the top left corner and
-        x2,y2 is the lower right corner of the croped region.
+        x2,y2 is the lower right corner of the cropped region.
         All coordinates are in pixels. Float numbers are accepted.
         For info on the parameters, please see ``vfx.Crop``
         """
diff --git a/_modules/moviepy/video/io/ffplay_previewer.html b/_modules/moviepy/video/io/ffplay_previewer.html
index dadb2bf8b..9c865b9c8 100644
--- a/_modules/moviepy/video/io/ffplay_previewer.html
+++ b/_modules/moviepy/video/io/ffplay_previewer.html
@@ -412,7 +412,7 @@ 

Source code for moviepy.video.io.ffplay_previewer

# order is important cmd = [ FFPLAY_BINARY, - "-autoexit", # If you dont precise, ffplay dont stop at end + "-autoexit", # If you don't precise, ffplay won't stop at end "-f", "rawvideo", "-pixel_format", @@ -482,9 +482,9 @@

Source code for moviepy.video.io.ffplay_previewer

pixel_format : str, optional Warning: This is not used anywhere in the code and should probably - be remove. + be removed. It is believed pixel format rgb24 does not work properly for now because - it require applying mask on CompositeVideoClip and thoses are believed to + it requires applying a mask on CompositeVideoClip and that is believed to not be working. Pixel format for the output video file, ``rgb24`` for normal video, ``rgba`` diff --git a/_sources/developer_guide/developers_install.rst.txt b/_sources/developer_guide/developers_install.rst.txt index d16d88cb4..0b2520104 100644 --- a/_sources/developer_guide/developers_install.rst.txt +++ b/_sources/developer_guide/developers_install.rst.txt @@ -4,7 +4,7 @@ Installation for MoviePy developers ====================================== .. warning:: - This part is only destined to people who want to build the MoviePy documentation by themself, or to contribute to MoviePy, normal user dont need it. + This part is only destined to people who want to build the MoviePy documentation by themselves, or to contribute to MoviePy. Normal users don't need it. In addition to MoviePy main libraries, MoviePy developers will also need to install additional libraries to be able to run MoviePy tests and build the MoviePy documentation. @@ -40,7 +40,7 @@ Once libraries installed you can test with: $ python -m pytest -And you can lint with : +And you can lint with: .. code:: bash diff --git a/_sources/getting_started/FAQ.rst.txt b/_sources/getting_started/FAQ.rst.txt index 56903801e..ffac76e9d 100644 --- a/_sources/getting_started/FAQ.rst.txt +++ b/_sources/getting_started/FAQ.rst.txt @@ -8,7 +8,7 @@ Common errors that are not bugs These are very common errors which are not considered as bugs to be solved (but you can still ask for this to change). If these answers -don't work for you, please open a bug report on Github_, or on the dedicated forum on Reddit_. +don't work for you, please open a bug report on Github_, or on the dedicated Subreddit_. MoviePy generated a video that cannot be read by my favorite player. @@ -23,7 +23,7 @@ readable only on some readers like VLC. I can't seem to read any video with MoviePy """""""""""""""""""""""""""""""""""""""""""""" -Known reason: you have a deprecated version of FFMPEG, install a recent version from the +Known reason: you have a deprecated version of FFmpeg, install a recent version from the website, not from your OS's repositories! (see :ref:`install`). @@ -33,5 +33,5 @@ Previewing videos make them slower than they are It means that your computer is not good enough to render the clip in real time. Don't hesitate to play with the options of ``preview``: for instance, lower the fps of the sound (11000 Hz is still fine) and the video. Also, downsizing your video with ``resize`` can help. .. _Github: https://github.com/Zulko/moviepy -.. _Reddit: https://www.reddit.com/r/moviepy/ +.. _Subreddit: https://www.reddit.com/r/moviepy/ diff --git a/_sources/getting_started/docker.rst.txt b/_sources/getting_started/docker.rst.txt index 8b983c20a..50bc6e41c 100644 --- a/_sources/getting_started/docker.rst.txt +++ b/_sources/getting_started/docker.rst.txt @@ -4,7 +4,7 @@ MoviePy Docker Prerequisites ------------- -Docker installed `Docker for Mac, Docker for windows, linux, etc `_ +Docker installed: `Docker Engine for Linux `_ or `Docker Desktop for Windows/Mac/Linux `_. Build the docker ----------------- diff --git a/_sources/getting_started/install.rst.txt b/_sources/getting_started/install.rst.txt index 08c83ccd0..99ad09f9a 100644 --- a/_sources/getting_started/install.rst.txt +++ b/_sources/getting_started/install.rst.txt @@ -3,9 +3,9 @@ Installation ========================== -Installation is done with ``pip`` if you dont have ``pip`` take a look at `how to install it `_. +Installation is done with ``pip``. If you don't have ``pip``, take a look at `how to install it `_. -With ``pip`` installed, just type this in a terminal : +With ``pip`` installed, just type this in a terminal: .. code:: bash @@ -21,14 +21,14 @@ MoviePy depends on the software ffmpeg_ for video reading and writing and on ``f You don't need to worry about ffmpeg_, as it should be automatically downloaded/installed by ImageIO during your first use of MoviePy (it takes a few seconds). -You do need to worry ``ffplay`` if you plan on using video/audio previewing though. In such case, make sure to have ``ffplay`` installed (it can usually be found alongside ``ffmpeg``) and -make sure it is accessible to Python, or look how to set a custom path (see below). +You do need to worry about ``ffplay`` if you plan on using video/audio previewing. For these cases, make sure to have ``ffplay`` installed (it can usually be found alongside ``ffmpeg``) and +make sure it is accessible to Python, or define a custom path (see below). Define custom paths to binaries ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -If you want to use a specific version of FFMPEG and FFPLAY, you can do so using environment variables. +If you want to use a specific version of FFmpeg and FFplay, you can do so using environment variables. There are a couple of environment variables used by MoviePy that allow you to configure custom paths to the external tools. diff --git a/_sources/getting_started/moviepy_10_minutes.rst.txt b/_sources/getting_started/moviepy_10_minutes.rst.txt index 033a37eb7..6f8e61ecc 100644 --- a/_sources/getting_started/moviepy_10_minutes.rst.txt +++ b/_sources/getting_started/moviepy_10_minutes.rst.txt @@ -12,7 +12,7 @@ In this tutorial, you will learn the basics of how to use the MoviePy library in
@@ -99,12 +99,12 @@ To do so, we are going to use the ``with_section_cut_out`` method to remove a po :language: python :lines: 41-54 -In that particular case, we have used the ``with_section_cut_out``, but this is only one of the many clip manipulation methods starting with ``with_*``. We will see a few others +In that particular case, we have used the ``with_section_cut_out``, but this is only one of the many clip manipulation methods starting with ``with_``. We will see a few others in this tutorial, but we will miss a lot more. If you want an exhaustive list, go see :ref:`reference_manual`. .. note:: You may have noticed that we have reassigned the ``rodents_clip`` variable instead of just calling a method on it. - This is because in MoviePy, any function starting with ``with_*`` is out-of-place instead of in-place, meaning it does not modify the original data but instead copies it and modifies/returns the copy. + This is because in MoviePy, any function starting with ``with_`` is out-of-place instead of in-place, meaning it does not modify the original data but instead copies it and modifies/returns the copy. So you need to store the result of the method and, if necessary, reassign the original variable to update your clip. @@ -132,19 +132,19 @@ Feel free to experiment with different effects and transitions to achieve the de Step 6: Timing the clips -------------------------- -We have all the clips we need, but if we were to combine all those clips into a single one using composition (we will see that in the next step), all our clips would start at the same time and play on top of each other, which is obviously not what we want. -Also, some video clips, like the images and texts, have no endpoint/duration at creation (except if you have provided a duration parameter), which means trying to render them will throw an error as it would result in an infinite video. +We have all the clips we need, but if we were to combine all the clips into a single one using composition (we will see that in the next step), all our clips would start at the same time and play on top of each other, which is obviously not what we want. +Also, some video clips, like images and texts, have no endpoint/duration at creation (unless you have provided a duration parameter), which means trying to render them will throw an error as it would result in an infinite video. -To fix that, we need to specify when a clip should start and stop in the final clip. So, let's start by indicating when each clip must start and end with the appropriate with_* methods. +To fix that, we need to specify when a clip should start and stop in the final clip. So, let's start by indicating when each clip must start and end using the appropriate with_* methods. .. literalinclude:: /_static/code/getting_started/moviepy_10_minutes/trailer.py :language: python :lines: 85-111 .. note:: - By default, all clips have a start point at ``0``. If a clip has no duration but you set the ``endtime``, then the duration will be calculated for you. The reciprocity is also true. + By default, all clips have a start point at ``0``. If a clip has no ``duration`` but you set the ``end_time``, then the ``duration`` will be calculated for you. The reciprocity is also true. - So in our case, we either use duration or endtime, depending on what is more practical for each specific case. + So in our case, we either use ``duration`` or ``end_time``, depending on what is more practical for each specific case. Step 7: Seeing how all clips combine -------------------------------------- @@ -211,7 +211,7 @@ Well, this looks a lot nicer! For this tutorial, we want to keep things simple, For a more in-depth presentation, see :py:mod:`moviepy.video.fx`, :py:mod:`moviepy.audio.fx`, and :ref:`create_effects`. .. note:: - Looking at the result, you may notice that crossfading makes clips go from transparent to opaque, and reciprocally, and wonder how it works. + Looking at the result, you may notice that cross-fading makes clips go from transparent to opaque, and reciprocally, and wonder how it works. We won't get into details, but know that in MoviePy, you can declare some sections of a video clip to be transparent by using masks. Masks are nothing more than special kinds of video clips that are made of values ranging from ``0`` for a transparent pixel to ``1`` for a fully opaque one. @@ -223,7 +223,7 @@ Step 10: Modifying the appearance of a clip using filters -------------------------------------------------------------- Finally, to make it more epic, we will apply a custom filter to our Rambo clip to make the image sepia. -MoviePy does not come with a sepia effect out of the box, and creating a full custom effect is beyond the scope of this tutorial. However, we will see how we can apply a simple filter to our clip using the ``image_transform`` method. +MoviePy does not come with a sepia effect out of the box, and creating a full custom effect is beyond the scope of this tutorial. However, we will see how we can apply a simple filter to our clip using the :py:meth:`~moviepy.video.VideoClip.VideoClip.image_transform` method. To understand how filters work, you first need to understand that in MoviePy, a clip frame is nothing more than a numpy ``ndarray`` of shape ``HxWx3``. This means we can modify how a frame looks like by applying simple math operations. Doing that on all the frames allows us to apply a filter to our clip! @@ -248,7 +248,7 @@ Step 11: Rendering the final clip to a file So, our final clip is ready, and we have made all the cutting and modifications we want. We are now ready to save the final result into a file. In video editing, this operation is known as rendering. -Again, we will keep things simple and just do video rendering without much tweaking. In most cases, MoviePy and FFMPEG automatically find the best settings. Take a look at the ``write_videofile`` doc for more info. +Again, we will keep things simple and just do video rendering without much tweaking. In most cases, MoviePy and FFmpeg will automatically find the best settings. Take a look at :py:meth:`~moviepy.video.VideoClip.VideoClip.write_videofile` for more info. .. literalinclude:: /_static/code/getting_started/moviepy_10_minutes/trailer.py :language: python diff --git a/_sources/getting_started/quick_presentation.rst.txt b/_sources/getting_started/quick_presentation.rst.txt index da68f00e2..93ae2a725 100644 --- a/_sources/getting_started/quick_presentation.rst.txt +++ b/_sources/getting_started/quick_presentation.rst.txt @@ -19,7 +19,7 @@ Here are a few reasons why you may want to edit videos in Python: And here are a few uses for which MoviePy is NOT the best solution: - You only need to do frame-by-frame video analysis (with face detection or other fancy stuff). This could be done with MoviePy in association with other libraries, but really, just use imageio_, OpenCV_ or SimpleCV, these are libraries that specialize in these tasks. -- You only want to convert a video file, or turn a series of image files into a movie. In this case it is better to directly call ``ffmpeg`` (or ``avconv`` or ``mencoder``...) it will be faster more memory-efficient than going through MoviePy. +- You only want to convert a video file, or turn a series of image files into a movie. In this case it is better to directly call ``ffmpeg`` (or ``avconv`` or ``mencoder``...) as it will be faster and more memory-efficient than going through MoviePy. Advantages and limitations @@ -29,9 +29,12 @@ MoviePy has been developed with the following goals in mind: - **Simple and intuitive**. Basic operations can be done in one line. The code is easy to learn and easy to understand for newcomers. - **Flexible**. You have total control over the frames of the video and audio, and creating your own effects is easy as Py. -- **Portable**. The code uses very common software (Numpy and FFMPEG) and can run on (almost) any machine with (almost) any version of Python. +- **Portable**. The code uses very common software (Numpy and FFmpeg) and can run on (almost) any machine with (almost) any version of Python. -For the limitations: MoviePy cannot (yet) stream videos (read from a webcam, or render a video live on a distant machine), and is not really designed for video processing involving many successive frames of a movie (like video stabilization, you'll need another software for that). You can also have memory problems if you use many video, audio, and image sources at the same time (>100), but this will be fixed in future versions. +Limitations: +- MoviePy cannot stream videos (e.g. reading from a webcam, or rendering a video live on a distant machine). +- MoviePy is not really designed for video processing involving many successive frames of a movie (e.g. video stabilization - there is other software better suited for that). +- You can also have memory problems if you use many video, audio, and image sources at the same time (>100). Example code ~~~~~~~~~~~~~~ @@ -57,18 +60,18 @@ Internally, the representation and manipulation of the different media is done u The central concept, the clips ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The central object of MoviePy is the :py:class:`the clips `, with either :py:class:`~moviepy.audio.AudioClip.AudioClip` for any audio element, or :py:class:`~moviepy.video.VideoClip.VideoClip` for any visual element. Clips really are the base unit of MoviePy, everything you do is with and on them. +The central object of MoviePy is the the :py:class:`Clip `, with either :py:class:`~moviepy.audio.AudioClip.AudioClip` for any audio element, or :py:class:`~moviepy.video.VideoClip.VideoClip` for any visual element. Clips really are the base unit of MoviePy, everything you do is with and on them. -Clips can be created from more than just videos or audios though. They can also be created from an image, a text, a custom animation, a folder of images, and even a simple lambda function ! +Clips can be created from more than just videos or audios though. They can also be created from an image, a text, a custom animation, a folder of images, and even a simple lambda function! -To create your final video, what you will do is essentially : +To create your final video, what you will do is essentially: #. Load different resources as clips (see :ref:`loading`) #. Modify them (see :ref:`modifying`) #. Mixing them into one final clip (see :ref:`compositing`) #. Render them into a file (see :ref:`rendering`) -Of course, MoviePy offer multiple handy solution and tools to facilitate all thoses steps, and let you add new ones by writing your own effects (see :ref:`create_effects`) ! +Of course, MoviePy offer multiple handy solution and tools to facilitate all these steps, and lets you add new ones by writing your own effects (see :ref:`create_effects`)! .. _imageio: https://imageio.github.io/ diff --git a/_sources/getting_started/updating_to_v2.rst.txt b/_sources/getting_started/updating_to_v2.rst.txt index 92db38411..c32353e7a 100644 --- a/_sources/getting_started/updating_to_v2.rst.txt +++ b/_sources/getting_started/updating_to_v2.rst.txt @@ -10,20 +10,20 @@ some changes. Dropping support of Python 2 ----------------------------- -Starting with version 2.0 MoviePy **no longer supports Python 2**, which makes sense since Python 2 reached its end of life over three years ago. +Starting with version 2.0, MoviePy **no longer supports Python 2**, since Python 2 reached its end of life in 2020. Focusing on Python 3.7+ allows MoviePy to take advantage of the latest language features and improvements while maintaining code quality and security. Users are encouraged to upgrade to a supported version of Python to continue using MoviePy. -``moviepy.editor`` supression and simplified importation +``moviepy.editor`` suppression and simplified importation --------------------------------------------------------- Before v2.0, it was advised to import from ``moviepy.editor`` whenever you needed to do some sort of manual operations, -such as previewing or hand editing, because the ``editor`` package was in charge of a lot of magic and initialization, making your life +such as previewing or hand editing, because the ``editor`` package handled a lot of magic and initialization, making your life easier, at the cost of initializing some complex modules like ``pygame``. With version 2.0, the ``moviepy.editor`` namespace simply no longer exists. You simply import everything from ``moviepy`` like this: :: - from moviepy import * # Simple and nice, the __all__ is set in moviepy so only usefull things will be loaded + from moviepy import * # Simple and nice, the __all__ is set in moviepy so only useful things will be loaded from moviepy import VideoFileClip # You can also import only the things you really need @@ -74,10 +74,10 @@ If you previously used effect by calling them as clips method, you must now use Dropping many external dependencies and unifying environment ------------------------------------------------------------- -With v1.0, MoviePy relied on many optional external dependencies, trying to gracefully dropback from one library to another in the event one of them was missing, eventually dropping some features when no library was available. +With v1.0, MoviePy relied on many optional external dependencies, trying to gracefully fallback from one library to another in the event one of them was missing, eventually dropping some features when no library was available. This resulted in complex and hard to maintain code for the MoviePy team, as well as fragmented and hard to understand environment for the users. -With v2.0 the MoviePy team tried to offer a simpler, smaller and more unified dependicy list, with focusing on ``pillow`` for all complex image manipulation, and dropping altogether the usage of ``ImageMagick``, ``PyGame``, ``OpenCV``, ``scipy``, ``scikit``, and a few others. +With v2.0 the MoviePy team tried to offer a simpler, smaller and more unified dependency list, with focusing on ``pillow`` for all complex image manipulation, and dropping altogether the usage of ``ImageMagick``, ``PyGame``, ``OpenCV``, ``scipy``, ``scikit``, and a few others. Removed features ----------------- @@ -88,30 +88,30 @@ Sadly, reducing the scope of MoviePy and limiting the external libraries mean th - ``moviepy.video.tools.segmenting`` - ``moviepy.video.io.sliders`` -Miscleanous signature changes +Miscellaneous signature changes ------------------------------ -When updating the API and moving from previous libraries to ``pillow``, some miscleanous changes also happen, meaning some methods signatures may have changed. +When updating the API and moving from previous libraries to ``pillow``, some miscellaneous changes also happen, meaning some methods signatures may have changed. You should check the new signatures if you used any of the following: -- ``TextClip`` some arguments named have changed and a path to a font file is now needed at object instanciation +- ``TextClip`` some arguments named have changed and a path to a font file is now needed at object instantiation - ``clip.resize`` is now ``clip.resized`` - ``clip.crop`` is now ``clip.cropped`` - ``clip.rotate`` is now ``clip.rotated`` - Any previous ``Clip`` method not starting by ``with_`` now probably start with it -Why all thoses changes and updating from v1.0 to v2.0? +Why all these changes and updating from v1.0 to v2.0? ------------------------------------------------------- -You may ask yourself why all thoses changes was introduced? The answer is: time. +You may ask yourself why were all these changes introduced? The answer is: time. MoviePy have seen many evolution since his first release and have became kind of a complex project, with ambitions sometimes too important in regards to available manpower on the development team. -Over time, as in any project, inconsistencies have been introduced in order to support new functionnalities without breaking current API, and some initial choices no longer reflected the current state of things. +Over time, as in any project, inconsistencies have been introduced in order to support new functionalities without breaking current API, and some initial choices no longer reflected the current state of things. Due to multiple factors, MoviePy have also undergone a long period of time during which the main version distributed through PiPy diverged from the GitHub distributed version, introducing confusion and chaos. -In a global effort to simplify futur development and limit confusion by providing a unified environment, it has been decided to release a new major version including the many evolutions than happened over the years, which meant breaking changes, and so a new major version released was required. +In a global effort to simplify future development and limit confusion by providing a unified environment, it has been decided to release a new major version including the many evolutions than happened over the years, which meant breaking changes, and so a new major version released was required. -For thoses interested in how and why all of thoses things have been decided, you can find a lot of the discussion that went into this in GitHub issues `#1874 `_, `#1089 `_ and `#2012 `_. \ No newline at end of file +For anyone interested in how and why all of these things have been decided, you can find a lot of the discussion that went into this in GitHub issues `#1874 `_, `#1089 `_ and `#2012 `_. \ No newline at end of file diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt index cc2ca3745..31f6baf5b 100644 --- a/_sources/index.rst.txt +++ b/_sources/index.rst.txt @@ -32,7 +32,7 @@ and manipulation tools for the `Python `__ programming :shadow: md New to *MoviePy*? Check out the getting started guides. They contain instructions - to install *MoviePy'* as well as introduction concepts and tutorials. + to install *MoviePy* as well as introduction concepts and tutorials. +++ @@ -88,7 +88,7 @@ and manipulation tools for the `Python `__ programming Saw a typo in the documentation? Want to improve existing functionalities? The contributing guidelines will guide - you through the process of improving moviepy. + you through the process of improving *MoviePy*. +++ diff --git a/_sources/user_guide/compositing.rst.txt b/_sources/user_guide/compositing.rst.txt index 4078ed14e..27501b6f2 100644 --- a/_sources/user_guide/compositing.rst.txt +++ b/_sources/user_guide/compositing.rst.txt @@ -33,7 +33,7 @@ Concatenation can be done very easily with the function :py:func:`~moviepy.video The ``final_clip`` is a clip that plays the clips 1, 2, and 3 one after the other. .. note:: - The clips do not need to be the same size. If they arent's they will all appear centered in a clip large enough to contain the biggest of them, with optionally a color of your choosing to fill the background. + The clips do not need to be the same size. If they aren't, they will all appear centered in a clip large enough to contain the biggest of them, with optionally a color of your choosing to fill the background. For more info, see :py:func:`~moviepy.video.compositing.CompositeVideoClip.concatenate_videoclips`. @@ -73,7 +73,7 @@ Unless ``clip3`` and/or ``clip2`` have masks which hide parts of them. To do so, just pass the size of the final composition as ``size`` parameter of :py:class:`~moviepy.video.compositing.CompositeVideoClip.CompositeVideoClip`. For now we have stacked multiple clip on top of each others, but this is obviously not enough for doing real video compositing. -For that, we will need to change when some clip start et stop to play, as well as define the x:y, position of thoses clips in the final video. +For that, we will need to change when some clip starts and stops playing, as well as define the x:y, position of these clips in the final video. For more info, see :py:class:`~moviepy.video.compositing.CompositeVideoClip.CompositeVideoClip`. @@ -111,7 +111,7 @@ When indicating the position keep in mind that the ``y`` coordinate has its zero Adding transitions effects """""""""""""""""""""""""" -The last part of composition is adding transition effects. For example, when a clip start while another is still playing, it would be nice to make the new one fadein instead of showing abruptly. +The last part of composition is adding transition effects. For example, when a clip start while another is still playing, it would be nice to make the new one fade-in instead of showing abruptly. To do so, we can use the transitions offered by MoviePy in :py:mod:`~moviepy.video.compositing.transitions`, like :py:func:`~moviepy.video.compositing.transitions.crossfadein` : @@ -119,7 +119,7 @@ To do so, we can use the transitions offered by MoviePy in :py:mod:`~moviepy.vid :language: python -MoviePy offer only few transitions in :py:mod:`~moviepy.video.compositing.transitions`. But technically, transitions are mostly effects applyed to the mask of a clip ! +MoviePy offer only few transitions in :py:mod:`~moviepy.video.compositing.transitions`. But technically, transitions are mostly effects applied to the mask of a clip! That means you can actually use any of the already existing effects, and use them as transitions by applying them on the mask of your clip (see . For more info, see :py:mod:`~moviepy.video.compositing.transitions` and :py:mod:`moviepy.video.fx`. @@ -130,7 +130,7 @@ Compositing audio clips When you mix video clips together, MoviePy will automatically compose their respective audio tracks to form the audio track of the final clip, so you don't need to worry about compositing these tracks yourself. -If you want to make a custom audiotrack from several audio sources, audio clips can be mixed together like video clips, with :py:class:`~moviepy.audio.AudioClip.CompositeAudioClip` and :py:func:`~moviepy.audio.AudioClip.concatenate_audioclips`: +If you want to make a custom audio track from several audio sources, audio clips can be mixed together like video clips, with :py:class:`~moviepy.audio.AudioClip.CompositeAudioClip` and :py:func:`~moviepy.audio.AudioClip.concatenate_audioclips`: .. literalinclude:: /_static/code/user_guide/compositing/CompositeAudioClip.py :language: python diff --git a/_sources/user_guide/create_effects.rst.txt b/_sources/user_guide/create_effects.rst.txt index 5866ce7d6..8eeda09fe 100644 --- a/_sources/user_guide/create_effects.rst.txt +++ b/_sources/user_guide/create_effects.rst.txt @@ -3,7 +3,7 @@ Creating your own effects ======================================================== -In addition to the existings effects already offered by MoviePy, we can create our own effects to modify a clip as we want. +In addition to the existing effects already offered by MoviePy, we can create our own effects to modify a clip however we want. Why creating your own effects? @@ -15,10 +15,10 @@ For simple enough tasks, we've seen that we can :ref:`modifying#filters`. Though - We cannot pass pass arguments to them - They are hard to maintain and re-use -To allow for more complexe and reusable clip modifications, we can create our own custom effects, that we will later apply with :py:func:`~moviepy.Clip.Clip.with_effects`. +To allow for more complex and reusable clip modifications, we can create our own custom effects, that we will later apply with :py:func:`~moviepy.Clip.Clip.with_effects`. For example, imagine we want to add a progress bar to a clip, to do so we will not only need the time and image of the current frame, but also the total duration of the clip. -We will also probably want to be able to pass parameters to define the apparence of the progress bar, such as color or height. This is a perfect task for an effect! +We will also probably want to be able to pass parameters to define the appearance of the progress bar, such as color or height. This is a perfect task for an effect! Creating an effect @@ -26,7 +26,7 @@ Creating an effect In MoviePy, effects are objects of type :py:class:`moviepy.Effect.Effect`, which is the base ``abstract class`` for all effects (kind of the same as :py:class:`~moviepy.Clip.Clip` is the base for all :py:class:`~moviepy.video.VideoClip.VideoClip` and :py:class:`~moviepy.audio.AudioClip.AudioClip`). -So, to create an effect, we will need to inherint the :py:class:`~moviepy.Effect.Effect` class, and do two things: +So, to create an effect, we will need to inherit the :py:class:`~moviepy.Effect.Effect` class, and do two things: - Create an ``__init__`` method to be able to received the parameters of our effect. - Implement the inherited :py:meth:`~moviepy.Effect.Effect.apply` method, which must take as an argument the clip we want to modify, and return the modified version. diff --git a/_sources/user_guide/index.rst.txt b/_sources/user_guide/index.rst.txt index bb4b162c5..4013de0c8 100644 --- a/_sources/user_guide/index.rst.txt +++ b/_sources/user_guide/index.rst.txt @@ -4,9 +4,9 @@ The MoviePy User Guide ------------------------------ -The User Guide covers all of MoviePy main concepts grouped by tasks (loading, editing, composing, rendering), with a presentation of the differents concept/elements relative to the tasks, as well of short code example. +The User Guide covers all of MoviePy's main concepts grouped by tasks (loading, editing, composing, rendering), with a presentation of the different concept/elements relative to the tasks along with short code example. -It is a good place for users whishing to understand more precisely one of these aspects and to discover the different MoviePy elements relative to it. +It is a good place for users wishing to understand more precisely one of these aspects and to discover the different MoviePy elements relative to it. For users wanting to have a quick overview of how to use MoviePy, a better place to start is the :ref:`getting_started` section, and more specifically the :ref:`moviepy_10_minutes` tutorial. diff --git a/_sources/user_guide/loading.rst.txt b/_sources/user_guide/loading.rst.txt index 28bdb87d0..b27b64aaa 100644 --- a/_sources/user_guide/loading.rst.txt +++ b/_sources/user_guide/loading.rst.txt @@ -8,7 +8,7 @@ The first step for making a video with MoviePy is to load the resources you wish In this section we present the different sorts of clips and how to load them. For information on modifying a clip, see :ref:`modifying`. For how to put clips together see :ref:`compositing`. And for how to see/save theme, see :ref:`rendering` (we will usually save them in example, but we wont explain here). -There's a lot of different resources you can use with MoviePy, and you will load those differents resources with different subtypes of :py:class:`~moviepy.Clip.Clip`, and more preciselly of :py:class:`~moviepy.audio.AudioClip.AudioClip` for any audio element, or :py:class:`~moviepy.video.VideoClip.VideoClip` for any visual element. +There's a lot of different resources you can use with MoviePy, and you will load different resources with different subtypes of :py:class:`~moviepy.Clip.Clip`, and more precisely of :py:class:`~moviepy.audio.AudioClip.AudioClip` for any audio element, or :py:class:`~moviepy.video.VideoClip.VideoClip` for any visual element. The following code summarizes the base clips that you can create with moviepy: @@ -19,10 +19,10 @@ The following code summarizes the base clips that you can create with moviepy: The best to understand all these clips more thoroughly is to read the full documentation for each in the :ref:`reference_manual`. -Realasing resources by closing a clip +Releasing resources by closing a clip --------------------------------------- -When you create some types of clip instances - e.g. ``VideoFileClip`` or ``AudioFileClip`` - MoviePy creates a subprocess and locks the file. In order to release those resources when you are finished you should call the ``close()`` method. +When you create some types of clip instances - e.g. ``VideoFileClip`` or ``AudioFileClip`` - MoviePy creates a subprocess and locks the file. In order to release these resources when you are finished you should call the ``close()`` method. This is more important for more complex applications and is particularly important when running on Windows. While Python's garbage collector should eventually clean up the resources for you, closing them makes them available earlier. @@ -59,7 +59,7 @@ A video clip can carry around an audio clip (:py:class:`~moviepy.audio.AudioClip Animated clips ~~~~~~~~~~~~~~~ -Thoses are clips whose image will change in time, and who have a duration and a number of Frames Per Second. +These are clips whose image will change over time, and which have a duration and a number of Frames Per Second. VideoClip """""""""" @@ -141,7 +141,7 @@ UpdatedVideoClip This is particularly practical in science where some algorithm needs to make some steps before a new frame can be generated, or maybe when trying to make a video based on a live exterior context. -When you use this, you pass a world object to it. A world object is an object who respect thoses 3 rules : +When you use this, you pass a world object to it. A world object is an object who respect these 3 rules: #. It has a ``clip_t`` property, indicating the current world time. #. It has an ``update()`` method, that will update the world state and is responsible for increasing ``clip_t`` when a new frame can be drown. @@ -157,7 +157,7 @@ On :py:meth:`~moviepy.video.io.VideoClip.UpdatedVideoClip.get_frame` call, your Unanimated clips ~~~~~~~~~~~~~~~~ -Thoses are clips whose image will, at least before modifications, stay the same. By default they have no duration nor FPS. Meaning you will need to define thoses if you try to do operation needing such information (for example rendering). +These are clips whose image will, at least before modifications, stay the same. By default they have no duration nor FPS, meaning you will need to define them before doing operations needing such information (for example, rendering). ImageClip @@ -177,8 +177,8 @@ TextClip A :py:class:`~moviepy.video.VideoClip.TextClip` is a clip that will turn a text string into an image clip. -:py:class:`~moviepy.video.VideoClip.TextClip` accept many parameters, letting you configure the apparence of the text, such as font and font size, -color, interlining, text alignement, etc. +:py:class:`~moviepy.video.VideoClip.TextClip` accept many parameters, letting you configure the appearance of the text, such as font and font size, +color, interlining, text alignment, etc. The font you want to use must be an `OpenType font `_, and you will set it by passing the path to the font file. @@ -188,15 +188,15 @@ Here are a few example of using :py:class:`~moviepy.video.VideoClip.TextClip` : :language: python .. note:: - The parameter ``method`` let you define if text should be written and overflow if too long (``label``) or be automatically breaked (``caption``). + The parameter ``method`` let you define if text should be written and overflow if too long (``label``) or be automatically broken over multiple lines (``caption``). -For a more detailed explaination of all the parameters, see :py:class:`~moviepy.video.VideoClip.TextClip`. +For a more detailed explanation of all the parameters, see :py:class:`~moviepy.video.VideoClip.TextClip`. ColorClip """"""""""""""" -A :py:class:`~moviepy.video.VideoClip.ColorClip` is a clip that will return an image of only one color. It is sometimes usefull when doing compositing (see :ref:`compositing`). +A :py:class:`~moviepy.video.VideoClip.ColorClip` is a clip that will return an image of only one color. It is sometimes useful when doing compositing (see :ref:`compositing`). .. literalinclude:: /_static/code/user_guide/loading/ColorClip.py :language: python @@ -213,7 +213,7 @@ Masks are a special kind of :py:class:`~moviepy.video.VideoClip.VideoClip` with When a clip as a mask attached to it, this mask will indicate which pixels will be visible when the clip is composed with other clips (see :ref:`compositing`). Masks are also used to define transparency when you export the clip as GIF file or as a PNG. -The fundamental difference between masks and standard clips is that standard clips output frames with 3 components (R-G-B) per pixel, comprised between 0 and 255, while a mask has just one composant per pixel, between 0 and 1 (1 indicating a fully visible pixel and 0 a transparent pixel). Seen otherwise, a mask is always in greyscale. +The fundamental difference between masks and standard clips is that standard clips output frames with 3 components (R-G-B) per pixel, comprised between 0 and 255, while a mask has just one component per pixel, between 0 and 1 (1 indicating a fully visible pixel and 0 a transparent pixel). Seen otherwise, a mask is always in greyscale. When you create or load a clip that you will use as a mask you need to declare it. You can then attach it to a clip with the same dimensions : @@ -223,7 +223,7 @@ When you create or load a clip that you will use as a mask you need to declare i .. note:: In the case of video and image files, if these are not already black and white they will be converted automatically. - Also, when you load an image with an *alpha layer*, like a PNG, MoviePy will use this layer as a mask, except if you pass ``transparent=False``. + Also, when you load an image with an *alpha layer*, like a PNG, MoviePy will use this layer as a mask unless you pass ``transparent=False``. Any video clip can be turned into a mask with :py:meth:`~moviepy.video.VideoClip.VideoClip.to_mask`, and a mask can be turned to a standard RGB video clip with :py:meth:`~moviepy.video.VideoClip.VideoClip.to_RGB()`. @@ -255,9 +255,9 @@ For more, see :py:class:`~moviepy.audio.AudioClip.AudioClip`. AudioFileClip ~~~~~~~~~~~~~~~~~~~~ -:py:class:`~moviepy.audio.io.AudioFileClip.AudioFileClip` is used to load an audio file, this is probably the only kind of audio clip you will use. +:py:class:`~moviepy.audio.io.AudioFileClip.AudioFileClip` is used to load an audio file. This is probably the only kind of audio clip you will use. -You simply pass him the file you want to load : +You simply pass it the file you want to load : .. literalinclude:: /_static/code/user_guide/loading/AudioFileClip.py :language: python diff --git a/_sources/user_guide/modifying.rst.txt b/_sources/user_guide/modifying.rst.txt index 23b857b1d..122dce70d 100644 --- a/_sources/user_guide/modifying.rst.txt +++ b/_sources/user_guide/modifying.rst.txt @@ -20,7 +20,7 @@ Clip copy during modification The first thing you must know is that when modifying a clip, MoviePy **will never modify that clip directly**. Instead it will return **a modified copy of the original** and let the original untouched. This is known as out-place instead of in-place behavior. -To illustrate : +To illustrate: .. literalinclude:: /_static/code/user_guide/effects/modify_copy_example.py :language: python @@ -39,7 +39,7 @@ Time representations in MoviePy ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Many methods that we will see accept duration or timepoint as arguments. For instance :py:meth:`clip.subclipped(t_start, t_end) ` which cuts the clip between two timepoints. -MoviePy usually accept duration and timepoint as either : +MoviePy usually accept duration and timepoint as either: * a number of seconds as a ``float``. * a ``tuple`` with ``(minutes, seconds)`` or ``(hours, minutes, seconds)``. @@ -53,14 +53,14 @@ Modify a clip using the ``with_*`` methods The first way to modify a clip is by modifying internal properties of your object, thus modifying his behavior. -Thoses methods usually starts with the prefix ``with_`` or ``without_``, indicating that they will return a copy of the clip with the properties modified. +These methods usually start with the prefix ``with_`` or ``without_``, indicating that they will return a copy of the clip with the properties modified. -So, you may write something like : +So, you may write something like: .. literalinclude:: /_static/code/user_guide/effects/using_with_methods.py :language: python -In addition to the ``with_*`` methods, a handful of very common methods are also accessible under shorter name, thoses are: +In addition to the ``with_*`` methods, a handful of very common methods are also accessible under shorter names: - :py:meth:`~moviepy.video.VideoClip.VideoClip.resized` - :py:meth:`~moviepy.video.VideoClip.VideoClip.crop` @@ -79,17 +79,17 @@ The second way to modify a clip is by using effects that will modify the frames MoviePy come with many effects implemented in :py:mod:`moviepy.video.fx` for visual effects and :py:mod:`moviepy.audio.fx` for audio effects. For practicality, these two modules are loaded in MoviePy as ``vfx`` and ``afx``, letting you import them as ``from moviepy import vfx, afx``. -To use thoses effects, you simply need to instanciate them as object and apply them on your :py:class:`~moviepy.Clip.Clip` using method :py:meth:`~moviepy.Clip.Clip.with_effects`, with a list of :py:class:`~moviepy.Effect.Effect` objects you want to apply. +To use these effects, you simply need to instantiate them as object and apply them on your :py:class:`~moviepy.Clip.Clip` using method :py:meth:`~moviepy.Clip.Clip.with_effects`, with a list of :py:class:`~moviepy.Effect.Effect` objects you want to apply. For convenience the effects are also dynamically added as method of :py:class:`~moviepy.video.VideoClip.VideoClip` and :py:class:`~moviepy.video.AudioClip.AudioClip` classes at runtime, letting you call them as simple method of your clip. -So, you may write something like : +So, you may write something like: .. literalinclude:: /_static/code/user_guide/effects/using_effects.py :language: python .. note:: - MoviePy effects are automatically applied to both the sound and the mask of the clip if it is relevant, so that you don’t have to worry about modifying these. + MoviePy effects are automatically applied to both the sound and the mask of the clip if it is relevant, so that you don't have to worry about modifying these. For a list of those effects, see :py:mod:`moviepy.video.fx` and :py:mod:`moviepy.audio.fx`. @@ -97,18 +97,18 @@ In addition to the effects already provided by MoviePy, you can obviously :ref:` .. _modifying#filters: -Modify a clip apparence and timing using filters +Modify a clip appearance and timing using filters ---------------------------------------------------------- -In addition to modify a clip properties and using effects, you can also modify the apparence or timing of a clip by using your own custom *filters* with :py:func:`~moviepy.Clip.Clip.time_transform`, :py:func:`~moviepy.Clip.Clip.image_transform`, and more generally with :py:func:`~moviepy.Clip.Clip.transform`. +In addition to modifying a clip's properties and using effects, you can also modify the appearance or timing of a clip by using your own custom *filters* with :py:func:`~moviepy.Clip.Clip.time_transform`, :py:func:`~moviepy.Clip.Clip.image_transform`, and more generally with :py:func:`~moviepy.Clip.Clip.transform`. -All thoses methods works by taking as first parameter a callback function that will receive either a clip frame, a timepoint, or both, and return a modified version of thoses. +All these methods work by taking as first parameter a callback function that will receive either a clip frame, a timepoint, or both, and return a modified version of these. Modify only the timing of a Clip ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can change the timeline of the clip with :py:meth:`time_transform(your_filter) `. -Where ``your_filter`` is a callback function taking clip time as a parameter and returning a new time : +Where ``your_filter`` is a callback function taking clip time as a parameter and returning a new time: .. literalinclude:: /_static/code/user_guide/effects/time_transform.py :language: python @@ -121,11 +121,11 @@ Now the clip ``modified_clip1`` plays three times faster than ``my_clip``, while If you wish to also modify audio and/or mask you can provide the parameter ``apply_to`` with either ``'audio'``, ``'mask'``, or ``['audio', 'mask']``. -Modifying only the apparence of a Clip +Modifying only the appearance of a Clip ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -For :py:class:`~moviepy.video.VideoClip.VideoClip`, you can change the apparence of the clip with :py:meth:`image_transform(your_filter) `. -Where ``your_filter`` is a callback function, taking clip frame (a numpy array) as a parameter and returning the transformed frame : +For :py:class:`~moviepy.video.VideoClip.VideoClip`, you can change the appearance of the clip with :py:meth:`image_transform(your_filter) `. +Where ``your_filter`` is a callback function, taking clip frame (a numpy array) as a parameter and returning the transformed frame: .. literalinclude:: /_static/code/user_guide/effects/image_transform.py :language: python @@ -139,7 +139,7 @@ Now the clip ``modified_clip1`` will have his green and blue canals inverted. Sometimes need to treat clip frames and mask frames in a different way. To distinguish between the two, you can always look at their shape, clips are ``H*W*3``, and masks ``H*W``. -Modifying both the apparence and the timing of a Clip +Modifying both the appearance and the timing of a Clip ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Finally, you may want to process the clip by taking into account both the time and the frame picture, for example to apply visual effects variating with time. @@ -156,6 +156,6 @@ This will scroll down the clip, with a constant height of 360 pixels. .. note:: When programming a new effect, whenever it is possible, prefer using ``time_transform`` and ``image_transform`` instead of ``transform`` when implementing new effects. - The reason is that, though they both internally relly on ``transform`` when these effects are applied to ``ImageClip`` objects, MoviePy will recognize they only need to be applied once instead of on each frame, resulting in faster renderings. + The reason is that, though they both internally rely on ``transform`` when these effects are applied to ``ImageClip`` objects, MoviePy will recognize they only need to be applied once instead of on each frame, resulting in faster renderings. To keep things simple, we have only addressed the case of :py:class:`~moviepy.video.VideoClip.VideoClip`, but know that the same principle applies to :py:class:`~moviepy.audio.AudioClip.AudioClip`, except that instead of a picture frame, you will have an audio frame, which is also a numpy array. \ No newline at end of file diff --git a/_sources/user_guide/rendering.rst.txt b/_sources/user_guide/rendering.rst.txt index 52474c530..1b1531755 100644 --- a/_sources/user_guide/rendering.rst.txt +++ b/_sources/user_guide/rendering.rst.txt @@ -16,7 +16,7 @@ Preview a clip as a video ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. warning:: - You must have ``FFPLAY`` installed and accessible to MoviePy to be able to use :py:func:`~moviepy.video.io.preview.preview`. + You must have ``ffplay`` installed and accessible to MoviePy to be able to use :py:func:`~moviepy.video.io.preview.preview`. If you'r not sure, take a look :ref:`install#binaries` The first thing you can do is to preview your clip as a video, by calling method :py:func:`~moviepy.video.io.preview.preview` on your clip: @@ -29,7 +29,7 @@ You will probably frequently want to preview only a small portion of your clip, .. note:: It is quite frequent for a clip preview to be out of sync, or to play slower than it should. It means that your computer is not powerful enough to render the clip in real time. - Don’t hesitate to play with the options of preview: for instance, lower the fps of the sound (11000 Hz is still fine) and the video. Also, downsizing your video with resize can help. + Don't hesitate to play with the options of preview: for instance, lower the fps of the sound (11000 Hz is still fine) and the video. Also, downsizing your video with resize can help. For more info, see :py:func:`~moviepy.video.io.preview.preview`. @@ -40,7 +40,7 @@ For more info, see :py:func:`~moviepy.video.io.preview.preview`. Preview just one frame of a clip ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -In a lot of situation, you dont really need to preview your all clip, seeing only one frame is enough to see how it looks like and to make sure everything goes as expected. +In a lot of situation, you don't really need to preview your all clip, seeing only one frame is enough to see how it looks like and to make sure everything goes as expected. To do so, you can use the method :py:func:`~moviepy.video.io.preview.show` on your clip, passing the frame time as an argument: @@ -96,7 +96,7 @@ MoviePy can find the a default codec name for the most common file extensions. I There are many many options when you are writing a video (bitrate, parameters of the audio writing, file size optimization, number of processors to use, etc.), and we will not go in details into each. So, for more info, see :py:meth:`~moviepy.video.VideoClip.VideoClip.write_videofile`. .. note:: - Though you are encouraged to play with settings of ``write_videofile``, know that lowering the optimization preset, or increasing the number of threads will not necessarly + Though you are encouraged to play with settings of ``write_videofile``, know that lowering the optimization preset or increasing the number of threads will not necessarily improve the rendering time, as the bottleneck may be on MoviePy computation of each frame and not in ffmpeg encoding. Also, know that it is possible to pass additional parameters to ffmpeg command line invoked by MoviePy by using the ``ffmpeg_params`` argument. diff --git a/_static/code/getting_started/moviepy_10_minutes/trailer.py b/_static/code/getting_started/moviepy_10_minutes/trailer.py index a914f8950..00adda81f 100644 --- a/_static/code/getting_started/moviepy_10_minutes/trailer.py +++ b/_static/code/getting_started/moviepy_10_minutes/trailer.py @@ -85,7 +85,7 @@ ################ # CLIPS TIMING # ################ -# We have all the clips we need, but if we was to turn all thoses clips into a single one with composition (we will see that during next step) +# We have all the clips we need, but if we was to turn all the clips into a single one with composition (we will see that during next step) # all our clips would start at the same time and play on top of each other, which is obviously not what we want. # To fix that, we need to say when a clip should start and stop in the final clip. # So, lets start by telling when each clip must start and end with appropriate with_* methods @@ -114,7 +114,7 @@ ######################## # CLIPS TIMING PREVIEW # ######################## -# Lets make a first compositing of thoses clips into one single clip and do a quick preview to see if everything is synchro +# Lets make a first compositing of the clips into one single clip and do a quick preview to see if everything is synchro quick_compo = CompositeVideoClip( [ @@ -179,7 +179,7 @@ ################################ # Now that our clip are timed and positionned, lets add some transition to make it more natural # To do so we use the with_effects method and the video effects in vfx -# We call with_effects on our clip and pass him an array of effect objects to apply +# We call with_effects on our clip and pass it an array of effect objects to apply # We'll keep it simple, nothing fancy just cross fading intro_text = intro_text.with_effects([vfx.CrossFadeIn(1), vfx.CrossFadeOut(1)]) logo_clip = logo_clip.with_effects([vfx.CrossFadeIn(1), vfx.CrossFadeOut(1)]) @@ -208,10 +208,10 @@ [vfx.CrossFadeIn(1.5), vfx.FadeOut(1), afx.AudioFadeIn(1.5), afx.AudioFadeOut(1)] ) -# Effects are not only for transition, they can also change a clip timing or apparence +# Effects are not only for transition, they can also change a clip timing or appearance # To show that, lets also modify the Rambo-like part of our clip to be in slow motion -# PS : We do it for effect, but this is one of the few effects that have a direct shortcut, with_speed_scaled -# the others are with_volume_scaled, resized, croped and rotated +# PS: We do it for effect, but this is one of the few effects that have a direct shortcut, with_speed_scaled +# the others are with_volume_scaled, resized, cropped and rotated rambo_clip = rambo_clip.with_effects([vfx.MultiplySpeed(0.5)]) # Because we modified timing of rambo_clip with our MultiplySpeed effect, we must re-assign the following clips timing @@ -247,7 +247,7 @@ # We will start by defining a function that turn a numpy image into sepia # It takes the image as numpy array in entry and return the modified image as output -def sepia_fitler(frame: np.ndarray): +def sepia_filter(frame: np.ndarray): # Sepia filter transformation matrix # Sepia transform works by applying to each pixel of the image the following rules # res_R = (R * .393) + (G *.769) + (B * .189) @@ -277,7 +277,7 @@ def sepia_fitler(frame: np.ndarray): # Now, we simply apply the filter to our clip by calling image_transform, which will call our filter on every frame -rambo_clip = rambo_clip.image_transform(sepia_fitler) +rambo_clip = rambo_clip.image_transform(sepia_filter) # Let's see how our filter look rambo_clip.preview(fps=10) diff --git a/_static/code/user_guide/effects/custom_effect.py b/_static/code/user_guide/effects/custom_effect.py index bfe75a00b..8bde76e99 100644 --- a/_static/code/user_guide/effects/custom_effect.py +++ b/_static/code/user_guide/effects/custom_effect.py @@ -6,7 +6,7 @@ # Here you see a decorator that will verify if our clip have a duration -# MoviePy offer a few of thoses that may come handy when writing your own effects +# MoviePy offer a few of them that may come handy when writing your own effects @requires_duration def progress_bar(clip: VideoClip, color: tuple, height: int = 10): """ diff --git a/_static/code/user_guide/effects/modify_copy_example.py b/_static/code/user_guide/effects/modify_copy_example.py index 6cb001c11..bfde35b74 100644 --- a/_static/code/user_guide/effects/modify_copy_example.py +++ b/_static/code/user_guide/effects/modify_copy_example.py @@ -5,7 +5,7 @@ clip = VideoFileClip("example.mp4") # This does nothing, as multiply_volume will return a copy of clip -# which you will loose immediatly as you dont store it +# which you will loose immediatly as you don't store it # If you was to render clip now, the audio would still be at full volume clip.with_volume_scaled(0.1) diff --git a/_static/code/user_guide/loading/AudioArrayClip.py b/_static/code/user_guide/loading/AudioArrayClip.py index fafc80269..571af157b 100644 --- a/_static/code/user_guide/loading/AudioArrayClip.py +++ b/_static/code/user_guide/loading/AudioArrayClip.py @@ -3,7 +3,7 @@ import numpy as np from moviepy import AudioArrayClip -# We want to play those notes +# We want to play these notes notes = {"A": 440, "B": 494, "C": 523, "D": 587, "E": 659, "F": 698} note_duration = 0.5 diff --git a/_static/code/user_guide/loading/ColorClip.py b/_static/code/user_guide/loading/ColorClip.py index 9c85d962b..b56144211 100644 --- a/_static/code/user_guide/loading/ColorClip.py +++ b/_static/code/user_guide/loading/ColorClip.py @@ -2,5 +2,5 @@ # Color is passed as a RGB tuple myclip = ColorClip(size=(200, 100), color=(255, 0, 0), duration=1) -# We really dont need more than 1 fps do we ? +# We really don't need more than 1 fps do we ? myclip.write_videofile("result.mp4", fps=1) diff --git a/_static/code/user_guide/loading/UpdatedVideoClip.py b/_static/code/user_guide/loading/UpdatedVideoClip.py index c9a7a4920..7959fc36e 100644 --- a/_static/code/user_guide/loading/UpdatedVideoClip.py +++ b/_static/code/user_guide/loading/UpdatedVideoClip.py @@ -39,7 +39,7 @@ def update(self): return # Different face, we increment clip_t and set reset so we will reset on next update. - # We dont reset immediately because we will need current state to make frame + # We don't reset immediately because we will need current state to make frame self.reset = True self.clip_t += 1 / self.fps diff --git a/developer_guide/developers_install.html b/developer_guide/developers_install.html index 9e672ff5a..a4b317af2 100644 --- a/developer_guide/developers_install.html +++ b/developer_guide/developers_install.html @@ -397,7 +397,7 @@

Installation for MoviePy developers#

Warning

-

This part is only destined to people who want to build the MoviePy documentation by themself, or to contribute to MoviePy, normal user dont need it.

+

This part is only destined to people who want to build the MoviePy documentation by themselves, or to contribute to MoviePy. Normal users don’t need it.

In addition to MoviePy main libraries, MoviePy developers will also need to install additional libraries to be able to run MoviePy tests and build the MoviePy documentation.

@@ -422,7 +422,7 @@

Libraries for testing and linting
$ python -m pytest
 

-

And you can lint with :

+

And you can lint with:

$ python -m black .
 
diff --git a/getting_started/FAQ.html b/getting_started/FAQ.html index e8eb483f5..c8f6705cd 100644 --- a/getting_started/FAQ.html +++ b/getting_started/FAQ.html @@ -404,7 +404,7 @@

FAQ and troubleshootingCommon errors that are not bugs#

These are very common errors which are not considered as bugs to be solved (but you can still ask for this to change). If these answers -don’t work for you, please open a bug report on Github, or on the dedicated forum on Reddit.

+don’t work for you, please open a bug report on Github, or on the dedicated Subreddit.

MoviePy generated a video that cannot be read by my favorite player.#

Known reason: one of the video’s dimensions were not even, @@ -414,7 +414,7 @@

MoviePy generated a video that cannot be read by my favorite player.

I can’t seem to read any video with MoviePy#

-

Known reason: you have a deprecated version of FFMPEG, install a recent version from the +

Known reason: you have a deprecated version of FFmpeg, install a recent version from the website, not from your OS’s repositories! (see Installation).

diff --git a/getting_started/docker.html b/getting_started/docker.html index 18d4b161d..ea84bd92a 100644 --- a/getting_started/docker.html +++ b/getting_started/docker.html @@ -401,7 +401,7 @@

MoviePy Docker#

Prerequisites#

-

Docker installed Docker for Mac, Docker for windows, linux, etc

+

Docker installed: Docker Engine for Linux or Docker Desktop for Windows/Mac/Linux.

Build the docker#

diff --git a/getting_started/install.html b/getting_started/install.html index 0c34e18dd..1edb49b20 100644 --- a/getting_started/install.html +++ b/getting_started/install.html @@ -399,8 +399,8 @@

Installation#

-

Installation is done with pip if you dont have pip take a look at how to install it.

-

With pip installed, just type this in a terminal :

+

Installation is done with pip. If you don’t have pip, take a look at how to install it.

+

With pip installed, just type this in a terminal:

$ (sudo) pip install moviepy
 
@@ -408,11 +408,11 @@

Installation of additional binaries#

MoviePy depends on the software ffmpeg for video reading and writing and on ffplay for video previewing.

You don’t need to worry about ffmpeg, as it should be automatically downloaded/installed by ImageIO during your first use of MoviePy (it takes a few seconds).

-

You do need to worry ffplay if you plan on using video/audio previewing though. In such case, make sure to have ffplay installed (it can usually be found alongside ffmpeg) and -make sure it is accessible to Python, or look how to set a custom path (see below).

+

You do need to worry about ffplay if you plan on using video/audio previewing. For these cases, make sure to have ffplay installed (it can usually be found alongside ffmpeg) and +make sure it is accessible to Python, or define a custom path (see below).

Define custom paths to binaries#

-

If you want to use a specific version of FFMPEG and FFPLAY, you can do so using environment variables.

+

If you want to use a specific version of FFmpeg and FFplay, you can do so using environment variables.

There are a couple of environment variables used by MoviePy that allow you to configure custom paths to the external tools.

To setup any of these variables, the easiest way is to do it in Python before importing objects from MoviePy. For example:

import os
diff --git a/getting_started/moviepy_10_minutes.html b/getting_started/moviepy_10_minutes.html
index b79c9d6ed..dd43a0fcf 100644
--- a/getting_started/moviepy_10_minutes.html
+++ b/getting_started/moviepy_10_minutes.html
@@ -406,7 +406,7 @@
 

In this tutorial, you will learn the basics of how to use the MoviePy library in just 10 minutes. As an example project for this tutorial, we will create the following trailer for the movie “Big Buck Bunny.”.

@@ -516,12 +516,12 @@

Step 4: Modify a Clip by Cutting Out a Part of Itrodents_clip.preview(fps=10)

-

In that particular case, we have used the with_section_cut_out, but this is only one of the many clip manipulation methods starting with with_*. We will see a few others +

In that particular case, we have used the with_section_cut_out, but this is only one of the many clip manipulation methods starting with with_. We will see a few others in this tutorial, but we will miss a lot more. If you want an exhaustive list, go see Api Reference.

Note

You may have noticed that we have reassigned the rodents_clip variable instead of just calling a method on it. -This is because in MoviePy, any function starting with with_* is out-of-place instead of in-place, meaning it does not modify the original data but instead copies it and modifies/returns the copy. +This is because in MoviePy, any function starting with with_ is out-of-place instead of in-place, meaning it does not modify the original data but instead copies it and modifies/returns the copy. So you need to store the result of the method and, if necessary, reassign the original variable to update your clip.

@@ -569,13 +569,13 @@

Step 5: Creating Text/Logo Clips

Step 6: Timing the clips#

-

We have all the clips we need, but if we were to combine all those clips into a single one using composition (we will see that in the next step), all our clips would start at the same time and play on top of each other, which is obviously not what we want. -Also, some video clips, like the images and texts, have no endpoint/duration at creation (except if you have provided a duration parameter), which means trying to render them will throw an error as it would result in an infinite video.

-

To fix that, we need to specify when a clip should start and stop in the final clip. So, let’s start by indicating when each clip must start and end with the appropriate with_* methods.

+

We have all the clips we need, but if we were to combine all the clips into a single one using composition (we will see that in the next step), all our clips would start at the same time and play on top of each other, which is obviously not what we want. +Also, some video clips, like images and texts, have no endpoint/duration at creation (unless you have provided a duration parameter), which means trying to render them will throw an error as it would result in an infinite video.

+

To fix that, we need to specify when a clip should start and stop in the final clip. So, let’s start by indicating when each clip must start and end using the appropriate with_* methods.

################
 # CLIPS TIMING #
 ################
-# We have all the clips we need, but if we was to turn all thoses clips into a single one with composition (we will see that during next step)
+# We have all the clips we need, but if we was to turn all the clips into a single one with composition (we will see that during next step)
 # all our clips would start at the same time and play on top of each other, which is obviously not what we want.
 # To fix that, we need to say when a clip should start and stop in the final clip.
 # So, lets start by telling when each clip must start and end with appropriate with_* methods
@@ -603,8 +603,8 @@ 

Step 6: Timing the clips

Note

-

By default, all clips have a start point at 0. If a clip has no duration but you set the endtime, then the duration will be calculated for you. The reciprocity is also true.

-

So in our case, we either use duration or endtime, depending on what is more practical for each specific case.

+

By default, all clips have a start point at 0. If a clip has no duration but you set the end_time, then the duration will be calculated for you. The reciprocity is also true.

+

So in our case, we either use duration or end_time, depending on what is more practical for each specific case.

@@ -619,7 +619,7 @@

Step 7: Seeing how all clips combine
########################
 # CLIPS TIMING PREVIEW #
 ########################
-# Lets make a first compositing of thoses clips into one single clip and do a quick preview to see if everything is synchro
+# Lets make a first compositing of the clips into one single clip and do a quick preview to see if everything is synchro
 
 quick_compo = CompositeVideoClip(
     [
@@ -712,7 +712,7 @@ 

Step 9: Adding transitions and effects################################ # Now that our clip are timed and positionned, lets add some transition to make it more natural # To do so we use the with_effects method and the video effects in vfx -# We call with_effects on our clip and pass him an array of effect objects to apply +# We call with_effects on our clip and pass it an array of effect objects to apply # We'll keep it simple, nothing fancy just cross fading intro_text = intro_text.with_effects([vfx.CrossFadeIn(1), vfx.CrossFadeOut(1)]) logo_clip = logo_clip.with_effects([vfx.CrossFadeIn(1), vfx.CrossFadeOut(1)]) @@ -741,10 +741,10 @@

Step 9: Adding transitions and effects[vfx.CrossFadeIn(1.5), vfx.FadeOut(1), afx.AudioFadeIn(1.5), afx.AudioFadeOut(1)] ) -# Effects are not only for transition, they can also change a clip timing or apparence +# Effects are not only for transition, they can also change a clip timing or appearance # To show that, lets also modify the Rambo-like part of our clip to be in slow motion -# PS : We do it for effect, but this is one of the few effects that have a direct shortcut, with_speed_scaled -# the others are with_volume_scaled, resized, croped and rotated +# PS: We do it for effect, but this is one of the few effects that have a direct shortcut, with_speed_scaled +# the others are with_volume_scaled, resized, cropped and rotated rambo_clip = rambo_clip.with_effects([vfx.MultiplySpeed(0.5)]) # Because we modified timing of rambo_clip with our MultiplySpeed effect, we must re-assign the following clips timing @@ -776,7 +776,7 @@

Step 9: Adding transitions and effectsmoviepy.video.fx, moviepy.audio.fx, and Creating your own effects.

Note

-

Looking at the result, you may notice that crossfading makes clips go from transparent to opaque, and reciprocally, and wonder how it works.

+

Looking at the result, you may notice that cross-fading makes clips go from transparent to opaque, and reciprocally, and wonder how it works.

We won’t get into details, but know that in MoviePy, you can declare some sections of a video clip to be transparent by using masks. Masks are nothing more than special kinds of video clips that are made of values ranging from 0 for a transparent pixel to 1 for a fully opaque one.

For more info, see Mask clips.

@@ -785,14 +785,14 @@

Step 9: Adding transitions and effects

Step 10: Modifying the appearance of a clip using filters#

Finally, to make it more epic, we will apply a custom filter to our Rambo clip to make the image sepia. -MoviePy does not come with a sepia effect out of the box, and creating a full custom effect is beyond the scope of this tutorial. However, we will see how we can apply a simple filter to our clip using the image_transform method.

+MoviePy does not come with a sepia effect out of the box, and creating a full custom effect is beyond the scope of this tutorial. However, we will see how we can apply a simple filter to our clip using the image_transform() method.

To understand how filters work, you first need to understand that in MoviePy, a clip frame is nothing more than a numpy ndarray of shape HxWx3. This means we can modify how a frame looks like by applying simple math operations. Doing that on all the frames allows us to apply a filter to our clip!

The “apply to all frames” part is done by the image_transform method. This method takes a callback function as an argument, and at render time, it will trigger the callback for each frame of the clip, passing the current frame.

Warning

This is a bit of an advanced usage, and the example involves matrix multiplication. If this is too much for you, you can simply ignore it until you really need to make custom filters, -then go look for a more detailed explanation on how to do filtering (Modify a clip apparence and timing using filters) and create custom effects (Creating your own effects) in the user guide.

+then go look for a more detailed explanation on how to do filtering (Modify a clip appearance and timing using filters) and create custom effects (Creating your own effects) in the user guide.

What you need to remember is just that we can apply filters on images. Here we do it mathematically, but you could very well use a library such as Pillow (provided it can understand numpy images) to do the maths for you!

###############
@@ -803,7 +803,7 @@ 

Step 10: Modifying the appearance of a clip using filters# We will start by defining a function that turn a numpy image into sepia # It takes the image as numpy array in entry and return the modified image as output -def sepia_fitler(frame: np.ndarray): +def sepia_filter(frame: np.ndarray): # Sepia filter transformation matrix # Sepia transform works by applying to each pixel of the image the following rules # res_R = (R * .393) + (G *.769) + (B * .189) @@ -833,7 +833,7 @@

Step 10: Modifying the appearance of a clip using filters# Now, we simply apply the filter to our clip by calling image_transform, which will call our filter on every frame -rambo_clip = rambo_clip.image_transform(sepia_fitler) +rambo_clip = rambo_clip.image_transform(sepia_filter) # Let's see how our filter look rambo_clip.preview(fps=10) @@ -844,7 +844,7 @@

Step 10: Modifying the appearance of a clip using filters#

So, our final clip is ready, and we have made all the cutting and modifications we want. We are now ready to save the final result into a file. In video editing, this operation is known as rendering.

-

Again, we will keep things simple and just do video rendering without much tweaking. In most cases, MoviePy and FFMPEG automatically find the best settings. Take a look at the write_videofile doc for more info.

+

Again, we will keep things simple and just do video rendering without much tweaking. In most cases, MoviePy and FFmpeg will automatically find the best settings. Take a look at write_videofile() for more info.

##################
 # CLIP RENDERING #
 ##################
diff --git a/getting_started/quick_presentation.html b/getting_started/quick_presentation.html
index 7937ee518..53749b4be 100644
--- a/getting_started/quick_presentation.html
+++ b/getting_started/quick_presentation.html
@@ -413,7 +413,7 @@ 

Do I need MoviePy?
  • You only need to do frame-by-frame video analysis (with face detection or other fancy stuff). This could be done with MoviePy in association with other libraries, but really, just use imageio, OpenCV or SimpleCV, these are libraries that specialize in these tasks.

  • -
  • You only want to convert a video file, or turn a series of image files into a movie. In this case it is better to directly call ffmpeg (or avconv or mencoder…) it will be faster more memory-efficient than going through MoviePy.

  • +
  • You only want to convert a video file, or turn a series of image files into a movie. In this case it is better to directly call ffmpeg (or avconv or mencoder…) as it will be faster and more memory-efficient than going through MoviePy.

  • @@ -422,9 +422,12 @@

    Advantages and limitations
  • Simple and intuitive. Basic operations can be done in one line. The code is easy to learn and easy to understand for newcomers.

  • Flexible. You have total control over the frames of the video and audio, and creating your own effects is easy as Py.

  • -
  • Portable. The code uses very common software (Numpy and FFMPEG) and can run on (almost) any machine with (almost) any version of Python.

  • +
  • Portable. The code uses very common software (Numpy and FFmpeg) and can run on (almost) any machine with (almost) any version of Python.

  • -

    For the limitations: MoviePy cannot (yet) stream videos (read from a webcam, or render a video live on a distant machine), and is not really designed for video processing involving many successive frames of a movie (like video stabilization, you’ll need another software for that). You can also have memory problems if you use many video, audio, and image sources at the same time (>100), but this will be fixed in future versions.

    +

    Limitations: +- MoviePy cannot stream videos (e.g. reading from a webcam, or rendering a video live on a distant machine). +- MoviePy is not really designed for video processing involving many successive frames of a movie (e.g. video stabilization - there is other software better suited for that). +- You can also have memory problems if you use many video, audio, and image sources at the same time (>100).

    Example code#

    @@ -462,16 +465,16 @@

    How MoviePy works

    The central concept, the clips#

    -

    The central object of MoviePy is the the clips, with either AudioClip for any audio element, or VideoClip for any visual element. Clips really are the base unit of MoviePy, everything you do is with and on them.

    -

    Clips can be created from more than just videos or audios though. They can also be created from an image, a text, a custom animation, a folder of images, and even a simple lambda function !

    -

    To create your final video, what you will do is essentially :

    +

    The central object of MoviePy is the the Clip, with either AudioClip for any audio element, or VideoClip for any visual element. Clips really are the base unit of MoviePy, everything you do is with and on them.

    +

    Clips can be created from more than just videos or audios though. They can also be created from an image, a text, a custom animation, a folder of images, and even a simple lambda function!

    +

    To create your final video, what you will do is essentially:

    1. Load different resources as clips (see Loading resources as clips)

    2. Modify them (see Modifying clips and apply effects)

    3. Mixing them into one final clip (see Compositing multiple clips)

    4. Render them into a file (see Previewing and saving video clips)

    -

    Of course, MoviePy offer multiple handy solution and tools to facilitate all thoses steps, and let you add new ones by writing your own effects (see Creating your own effects) !

    +

    Of course, MoviePy offer multiple handy solution and tools to facilitate all these steps, and lets you add new ones by writing your own effects (see Creating your own effects)!

    diff --git a/getting_started/updating_to_v2.html b/getting_started/updating_to_v2.html index 1c1090363..59436edee 100644 --- a/getting_started/updating_to_v2.html +++ b/getting_started/updating_to_v2.html @@ -405,17 +405,17 @@ some changes.

    Dropping support of Python 2#

    -

    Starting with version 2.0 MoviePy no longer supports Python 2, which makes sense since Python 2 reached its end of life over three years ago. +

    Starting with version 2.0, MoviePy no longer supports Python 2, since Python 2 reached its end of life in 2020. Focusing on Python 3.7+ allows MoviePy to take advantage of the latest language features and improvements while maintaining code quality and security.

    Users are encouraged to upgrade to a supported version of Python to continue using MoviePy.

    -
    -

    moviepy.editor supression and simplified importation#

    +
    +

    moviepy.editor suppression and simplified importation#

    Before v2.0, it was advised to import from moviepy.editor whenever you needed to do some sort of manual operations, -such as previewing or hand editing, because the editor package was in charge of a lot of magic and initialization, making your life +such as previewing or hand editing, because the editor package handled a lot of magic and initialization, making your life easier, at the cost of initializing some complex modules like pygame.

    With version 2.0, the moviepy.editor namespace simply no longer exists. You simply import everything from moviepy like this:

    -
    from moviepy import * # Simple and nice, the __all__ is set in moviepy so only usefull things will be loaded
    +
    from moviepy import * # Simple and nice, the __all__ is set in moviepy so only useful things will be loaded
     from moviepy import VideoFileClip # You can also import only the things you really need
     
    @@ -453,9 +453,9 @@

    Removing effects as clip methods

    Dropping many external dependencies and unifying environment#

    -

    With v1.0, MoviePy relied on many optional external dependencies, trying to gracefully dropback from one library to another in the event one of them was missing, eventually dropping some features when no library was available. +

    With v1.0, MoviePy relied on many optional external dependencies, trying to gracefully fallback from one library to another in the event one of them was missing, eventually dropping some features when no library was available. This resulted in complex and hard to maintain code for the MoviePy team, as well as fragmented and hard to understand environment for the users.

    -

    With v2.0 the MoviePy team tried to offer a simpler, smaller and more unified dependicy list, with focusing on pillow for all complex image manipulation, and dropping altogether the usage of ImageMagick, PyGame, OpenCV, scipy, scikit, and a few others.

    +

    With v2.0 the MoviePy team tried to offer a simpler, smaller and more unified dependency list, with focusing on pillow for all complex image manipulation, and dropping altogether the usage of ImageMagick, PyGame, OpenCV, scipy, scikit, and a few others.

    Removed features#

    @@ -466,26 +466,26 @@

    Removed featuresmoviepy.video.io.sliders

    -
    -

    Miscleanous signature changes#

    -

    When updating the API and moving from previous libraries to pillow, some miscleanous changes also happen, meaning some methods signatures may have changed.

    +
    +

    Miscellaneous signature changes#

    +

    When updating the API and moving from previous libraries to pillow, some miscellaneous changes also happen, meaning some methods signatures may have changed.

    You should check the new signatures if you used any of the following:

      -
    • TextClip some arguments named have changed and a path to a font file is now needed at object instanciation

    • +
    • TextClip some arguments named have changed and a path to a font file is now needed at object instantiation

    • clip.resize is now clip.resized

    • clip.crop is now clip.cropped

    • clip.rotate is now clip.rotated

    • Any previous Clip method not starting by with_ now probably start with it

    -
    -

    Why all thoses changes and updating from v1.0 to v2.0?#

    -

    You may ask yourself why all thoses changes was introduced? The answer is: time.

    +
    +

    Why all these changes and updating from v1.0 to v2.0?#

    +

    You may ask yourself why were all these changes introduced? The answer is: time.

    MoviePy have seen many evolution since his first release and have became kind of a complex project, with ambitions sometimes too important in regards to available manpower on the development team. -Over time, as in any project, inconsistencies have been introduced in order to support new functionnalities without breaking current API, and some initial choices no longer reflected the current state of things.

    +Over time, as in any project, inconsistencies have been introduced in order to support new functionalities without breaking current API, and some initial choices no longer reflected the current state of things.

    Due to multiple factors, MoviePy have also undergone a long period of time during which the main version distributed through PiPy diverged from the GitHub distributed version, introducing confusion and chaos.

    -

    In a global effort to simplify futur development and limit confusion by providing a unified environment, it has been decided to release a new major version including the many evolutions than happened over the years, which meant breaking changes, and so a new major version released was required.

    -

    For thoses interested in how and why all of thoses things have been decided, you can find a lot of the discussion that went into this in GitHub issues #1874, #1089 and #2012.

    +

    In a global effort to simplify future development and limit confusion by providing a unified environment, it has been decided to release a new major version including the many evolutions than happened over the years, which meant breaking changes, and so a new major version released was required.

    +

    For anyone interested in how and why all of these things have been decided, you can find a lot of the discussion that went into this in GitHub issues #1874, #1089 and #2012.

    @@ -531,7 +531,7 @@

    Why all thoses changes and updating from v1.0 to v2.0?

    diff --git a/index.html b/index.html index 8d16d26e2..1366ec49e 100644 --- a/index.html +++ b/index.html @@ -371,7 +371,7 @@

    MoviePy documentation Getting started

    New to MoviePy? Check out the getting started guides. They contain instructions -to install MoviePy’ as well as introduction concepts and tutorials.

    +to install MoviePy as well as introduction concepts and tutorials.

    For now we have stacked multiple clip on top of each others, but this is obviously not enough for doing real video compositing. -For that, we will need to change when some clip start et stop to play, as well as define the x:y, position of thoses clips in the final video.

    +For that, we will need to change when some clip starts and stops playing, as well as define the x:y, position of these clips in the final video.

    For more info, see CompositeVideoClip.

    Changing starting and stopping times of clips#

    @@ -566,7 +566,7 @@

    Positioning clips

    Adding transitions effects#

    -

    The last part of composition is adding transition effects. For example, when a clip start while another is still playing, it would be nice to make the new one fadein instead of showing abruptly.

    +

    The last part of composition is adding transition effects. For example, when a clip start while another is still playing, it would be nice to make the new one fade-in instead of showing abruptly.

    To do so, we can use the transitions offered by MoviePy in transitions, like crossfadein() :

    """In this example, we will concatenate two clips with a 1-second
     crossfadein of the second clip."""
    @@ -585,13 +585,13 @@ 

    Adding transitions effectsfinal_clip.write_videofile("final_clip.mp4")

    -

    MoviePy offer only few transitions in transitions. But technically, transitions are mostly effects applyed to the mask of a clip ! +

    MoviePy offer only few transitions in transitions. But technically, transitions are mostly effects applied to the mask of a clip! That means you can actually use any of the already existing effects, and use them as transitions by applying them on the mask of your clip (see .

    For more info, see transitions and moviepy.video.fx.

    Compositing audio clips#

    When you mix video clips together, MoviePy will automatically compose their respective audio tracks to form the audio track of the final clip, so you don’t need to worry about compositing these tracks yourself.

    -

    If you want to make a custom audiotrack from several audio sources, audio clips can be mixed together like video clips, with CompositeAudioClip and concatenate_audioclips():

    +

    If you want to make a custom audio track from several audio sources, audio clips can be mixed together like video clips, with CompositeAudioClip and concatenate_audioclips():

    """Let's first concatenate (one after the other) then composite
     (on top of each other) three audio clips."""
     
    diff --git a/user_guide/create_effects.html b/user_guide/create_effects.html
    index 7b0185ffa..f70853d27 100644
    --- a/user_guide/create_effects.html
    +++ b/user_guide/create_effects.html
    @@ -398,23 +398,23 @@
                       
       

    Creating your own effects#

    -

    In addition to the existings effects already offered by MoviePy, we can create our own effects to modify a clip as we want.

    +

    In addition to the existing effects already offered by MoviePy, we can create our own effects to modify a clip however we want.

    Why creating your own effects?#

    -

    For simple enough tasks, we’ve seen that we can Modify a clip apparence and timing using filters. Though it might be enough for simple tasks, filters are kind of limited:

    +

    For simple enough tasks, we’ve seen that we can Modify a clip appearance and timing using filters. Though it might be enough for simple tasks, filters are kind of limited:

    • They can only access frame and/or timepoint

    • We cannot pass pass arguments to them

    • They are hard to maintain and re-use

    -

    To allow for more complexe and reusable clip modifications, we can create our own custom effects, that we will later apply with with_effects().

    +

    To allow for more complex and reusable clip modifications, we can create our own custom effects, that we will later apply with with_effects().

    For example, imagine we want to add a progress bar to a clip, to do so we will not only need the time and image of the current frame, but also the total duration of the clip. -We will also probably want to be able to pass parameters to define the apparence of the progress bar, such as color or height. This is a perfect task for an effect!

    +We will also probably want to be able to pass parameters to define the appearance of the progress bar, such as color or height. This is a perfect task for an effect!

    Creating an effect#

    In MoviePy, effects are objects of type moviepy.Effect.Effect, which is the base abstract class for all effects (kind of the same as Clip is the base for all VideoClip and AudioClip).

    -

    So, to create an effect, we will need to inherint the Effect class, and do two things:

    +

    So, to create an effect, we will need to inherit the Effect class, and do two things: