Reputation: 2731
I'm using jupyter notebook. I have also tried from anaconda console as well.
Tried importing with both the ways shown below
from moviepy.editor import VideoFileClip
from moviepy.video.io.VideoFileClip import VideoFileClip
Both of them gave me same error. Full trace is below
AttributeError Traceback (most recent call last)
<ipython-input-10-9afa9d6e87c4> in <module>()
6 import glob
7 import math
----> 8 from moviepy.editor import VideoFileClip
9 from moviepy.video.io.VideoFileClip import VideoFileClip
C:\Program Files\Anaconda3\lib\site-packages\moviepy\editor.py in <module>()
20 # Clips
21
---> 22 from .video.io.VideoFileClip import VideoFileClip
23 from .video.io.ImageSequenceClip import ImageSequenceClip
24 from .video.io.downloader import download_webfile
C:\Program Files\Anaconda3\lib\site-packages\moviepy\video\io\VideoFileClip.py in <module>()
1 import os
2
----> 3 from moviepy.video.VideoClip import VideoClip
4 from moviepy.audio.io.AudioFileClip import AudioFileClip
5 from moviepy.Clip import Clip
C:\Program Files\Anaconda3\lib\site-packages\moviepy\video\VideoClip.py in <module>()
18
19 import moviepy.audio.io as aio
---> 20 from .io.ffmpeg_writer import ffmpeg_write_image, ffmpeg_write_video
21 from .io.ffmpeg_tools import ffmpeg_merge_video_audio
22 from .io.gif_writers import (write_gif,
C:\Program Files\Anaconda3\lib\site-packages\moviepy\video\io\ffmpeg_writer.py in <module>()
13 DEVNULL = open(os.devnull, 'wb')
14
---> 15 from moviepy.config import get_setting
16 from moviepy.tools import verbose_print
17
C:\Program Files\Anaconda3\lib\site-packages\moviepy\config.py in <module>()
49 success, err = try_cmd([FFMPEG_BINARY])
50 if not success:
---> 51 raise IOError(err.message +
52 "The path specified for the ffmpeg binary might be wrong")
53
AttributeError: 'PermissionError' object has no attribute 'message'
Python version info
Python 3.5.2 |Anaconda custom (64-bit)| (default, Jul 5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
Running ffmpeg -version in a console gives me
ffmpeg version N-83507-g8fa18e0 Copyright (c) 2000-2017 the FFmpeg developers
built with gcc 5.4.0 (GCC)
configuration: --enable-gpl --enable-version3 --enable-cuda --enable-cuvid --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-zlib
libavutil 55. 47.100 / 55. 47.100
libavcodec 57. 80.100 / 57. 80.100
libavformat 57. 66.102 / 57. 66.102
libavdevice 57. 2.100 / 57. 2.100
libavfilter 6. 73.100 / 6. 73.100
libswscale 4. 3.101 / 4. 3.101
libswresample 2. 4.100 / 2. 4.100
libpostproc 54. 2.100 / 54. 2.100
I'm running 64 bit version of Windows 10.
I can't find any solution anywhere and its driving me crazy! Seems like its not finding the ffmpeg binary but I have put it in C:\ffmpeg\bin and added this to path environment variable. Followed the instruction from here.
Upvotes: 1
Views: 7427
Reputation: 6169
I just had to figure this out myself tonight. There are two parts to this error:
1> the message
attribute doesn't exist on an exception object anymore in Python 3, and
2> as you guessed, you need to tell MoviePy where FFMpeg is
To work around the err.message
attribute error, you can replace it with str(err)
:
raise IOError(str(err) +
"The path specified for the ffmpeg binary might be wrong")
But the real solution is to make sure MoviePy knows where FFMpeg is. Look in your moviepy\config_defaults.py
file and see what it says for FFMPEG_BINARY
. The default is os.getenv('FFMPEG_BINARY', 'ffmpeg-imageio')
which means it will look at the first value as an environment variable containing the path of the FFMpeg executable, and if not found will use the second value. That one means it should use the FFMpeg that was installed by the imageio
module.
Since you have FFMpeg already installed somewhere on your computer you can just set the FFMPEG_BINARY variable in config_defaults.py to point to it:
FFMPEG_BINARY = "c:\FFMPEG\ffmpeg.exe" # where ever it is on your system
Or you could create an environment variable with that value.
If you hadn't installed FFMpeg, you can install it via ImageIO which is a module used and installed by MoviePy. In the MoviePy install instructions, they mention that FFMpeg should be installed automatically by ImageIO, but that didn't happen for me. When it causes an error, it gives you instructions to install it manually:
imageio.core.fetching.NeedDownloadError: Need ffmpeg exe. You can download it by calling:
imageio.plugins.ffmpeg.download()
This is what I did, and didn't have to edit config_defaults.py
for that. I haven't used Anaconda, but am doing this in WinPython which is another type of Python all-in-one distribution.
The reason I came across this error is that I mis-entered the path for ImageMagick in config_defaults.py
, causing the "raise" branch to be run, exposing the Python 2 code to set err.message.
Hope this circuitous story helps you or anyone else.
Upvotes: 1