Tahlil
Tahlil

Reputation: 2731

Error importing VideoFileClip from moviepy : AttributeError: 'PermissionError' object has no attribute 'message'

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

Answers (1)

Todd
Todd

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

Related Questions