Home > Enterprise >  Couldn't find ffmpeg or avconv - Python
Couldn't find ffmpeg or avconv - Python

Time:12-03

I'm working on a captcha solver and I need to use ffmpeg, though nothing works. Windows 10 user.

Warning when running the code for the first time:

C:\Users\user\AppData\Roaming\Python\Python310\site-packages\pydub\utils.py:170: RuntimeWarning: Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work
  warn("Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work", RuntimeWarning)

Then, when I tried running the script anyway and it required ffprobe, I got the following error:

C:\Users\user\AppData\Roaming\Python\Python310\site-packages\pydub\utils.py:198: RuntimeWarning: Couldn't find ffprobe or avprobe - defaulting to ffprobe, but may not work
  warn("Couldn't find ffprobe or avprobe - defaulting to ffprobe, but may not work", RuntimeWarning)
Traceback (most recent call last):
  File "D:\Scripts\captcha\main.py", line 164, in <module>
    main()
  File "D:\Scripts\captcha\main.py", line 155, in main
    captchaSolver()
  File "D:\Scripts\captcha\main.py", line 106, in captchaSolver
    sound = pydub.AudioSegment.from_mp3(
  File "C:\Users\user\AppData\Roaming\Python\Python310\site-packages\pydub\audio_segment.py", line 796, in from_mp3
    return cls.from_file(file, 'mp3', parameters=parameters)
  File "C:\Users\user\AppData\Roaming\Python\Python310\site-packages\pydub\audio_segment.py", line 728, in from_file
    info = mediainfo_json(orig_file, read_ahead_limit=read_ahead_limit)
  File "C:\Users\user\AppData\Roaming\Python\Python310\site-packages\pydub\utils.py", line 274, in mediainfo_json
    res = Popen(command, stdin=stdin_parameter, stdout=PIPE, stderr=PIPE)
  File "C:\Program Files\Python310\lib\subprocess.py", line 966, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "C:\Program Files\Python310\lib\subprocess.py", line 1435, in _execute_child
    hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
FileNotFoundError: [WinError 2] The system cannot find the file specified

I tried downloading it normally, editing environment variables, pasting them in the same folder as the script, installing with pip, tested ffmpeg manually to see if it works and indeed it converted a mkv to mp4, however my script has no intention of running

CodePudding user response:

As you can see by the error message, the issue is with ffprobe and not ffmpeg.

Make sure that both ffprobe.exe and ffmpeg.exe are in the executable path.

  • One option is placing ffprobe.exe and ffmpeg.exe in the same folder as the Python script (D:\Scripts\captcha\ in your case).
  • Other option is adding the folder of ffprobe.exe and ffmpeg.exe to Windows system path.
    (Placing the EXE files in a folder that is already in the system path may also work).

Debugging Pydub source code (pydub-0.25.1):

The code fails in the following code:

hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
                         # no special security
                         None, None,
                         int(not close_fds),
                         creationflags,
                         env,
                         os.fspath(cwd) if cwd is not None else None,
                         startupinfo)

Where args = 'ffprobe -of json -v info -show_format -show_streams test.mp3'

We are getting there from:

info = mediainfo_json(orig_file, read_ahead_limit=read_ahead_limit)

From:

prober = get_prober_name()

Here is the source code of get_prober_name method:

def get_prober_name():
    """
    Return probe application, either avconv or ffmpeg
    """
    if which("avprobe"):
        return "avprobe"
    elif which("ffprobe"):
        return "ffprobe"
    else:
        # should raise exception
        warn("Couldn't find ffprobe or avprobe - defaulting to ffprobe, but may not work", RuntimeWarning)
        return "ffprobe"

The which method looks for the command is in the execution path (returns None if it is not found).

As you can see from Pydub sources, ffprobe.exe should be in the execution path.


  • Note
    For setting FFmpeg path we may also apply something like:

     import pydub
     pydub.AudioSegment.converter = 'c:\\FFmpeg\\bin\\ffmpeg.exe'
     sound = pydub.AudioSegment.from_mp3("test.mp3")
    

But there is no such option for FFprobe.

CodePudding user response:

If you haven't installed the ffmpeg/ffprobe as @Rotem answered, you can use my ffmpeg-downloader package:

pip install ffmpeg-downloader
ffdl install --add-path

The --add-path option adds the installed FFmpeg folder to the user's system path. Re-open the Python window and both ffmpeg and ffprobe will be available to your program.

  • Related