FileNotFoundError: [WinError 2] 系統(tǒng)找不到指定的文件缭黔。Couldn't find ffprobe or avprobe - defaulting to ffpro...

報錯現(xiàn)場

報錯反復出現(xiàn)入问,每次解決一個問題丹锹,又因為下一個文件找不到而報錯。

C:\etc\Python\Python39\python.exe "C:/Program Files/JetBrains/PyCharm 2022.2.2/plugins/python/helpers/pydev/pydevd.py" --multiprocess --qt-support=auto --client 127.0.0.1 --port 51307 --file C:\workplace\github.com\***\sources\medias\BMedia.py 
Connected to pydev debugger (build 222.4167.33)
Traceback (most recent call last):
  File "C:\etc\Python\Python39\lib\subprocess.py", line 951, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "C:\etc\Python\Python39\lib\subprocess.py", line 1420, in _execute_child
    hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
  File "C:\Program Files\JetBrains\PyCharm 2022.2.2\plugins\python\helpers\pydev\_pydev_bundle\pydev_monkey.py", line 578, in new_CreateProcess
    return getattr(_subprocess, original_name)(app_name, patch_arg_str_win(cmd_line), *args)
FileNotFoundError: [WinError 2] 系統(tǒng)找不到指定的文件芬失。
python-BaseException
Backend QtAgg is interactive backend. Turning interactive mode on.

解決辦法

Windows 系統(tǒng)

  1. 下載安裝 ImageMagick ; ffmpeg-release-essentials.zip
  2. 設置環(huán)境變量


    IMAGEMAGICK_BINARY

    FFMPEG_BINARY

    ffmpeg_bin_path

關鍵代碼展示

moviepy.config.py

config_defaults.py 編寫了針對 ffmpeg, imagemagick 的默認值獲取

import os

FFMPEG_BINARY = os.getenv('FFMPEG_BINARY', 'ffmpeg-imageio')
IMAGEMAGICK_BINARY = os.getenv('IMAGEMAGICK_BINARY', 'auto-detect')

config.py 嘗試加載 ffmpeg, imagemagick 資源

if IMAGEMAGICK_BINARY=='auto-detect':
    if os.name == 'nt':
        try:
            key = wr.OpenKey(wr.HKEY_LOCAL_MACHINE, 'SOFTWARE\\ImageMagick\\Current')
            IMAGEMAGICK_BINARY = wr.QueryValueEx(key, 'BinPath')[0] + r"\convert.exe"
            key.Close()
        except:
            IMAGEMAGICK_BINARY = 'unset'
    elif try_cmd(['convert'])[0]:
        IMAGEMAGICK_BINARY = 'convert'
    else:
        IMAGEMAGICK_BINARY = 'unset'
else:
    if not os.path.exists(IMAGEMAGICK_BINARY):
        raise IOError(
            "ImageMagick binary cannot be found at {}".format(
                IMAGEMAGICK_BINARY
            )
        )

    if not os.path.isfile(IMAGEMAGICK_BINARY):
        raise IOError(
            "ImageMagick binary found at {} is not a file".format(
                IMAGEMAGICK_BINARY
            )
        )

    success, err = try_cmd([IMAGEMAGICK_BINARY])
    if not success:
        raise IOError("%s - The path specified for the ImageMagick binary might "
                      "be wrong: %s" % (err, IMAGEMAGICK_BINARY))

moviepy.config_defaults.py

if FFMPEG_BINARY=='ffmpeg-imageio':
    from imageio.plugins.ffmpeg import get_exe
    FFMPEG_BINARY = get_exe()

elif FFMPEG_BINARY=='auto-detect':

    if try_cmd(['ffmpeg'])[0]:
        FFMPEG_BINARY = 'ffmpeg'
    elif try_cmd(['ffmpeg.exe'])[0]:
        FFMPEG_BINARY = 'ffmpeg.exe'
    else:
        FFMPEG_BINARY = 'unset'
else:
    success, err = try_cmd([FFMPEG_BINARY])
    if not success:
        raise IOError(
            str(err) +
            " - The path specified for the ffmpeg binary might be wrong")

很顯然楣黍, 系統(tǒng)沒有指定資源文件時,moviepy會自己嘗試加載棱烂。只不過找不到的時候拋出異常租漂。

pydub.utils.py

最關鍵的部分是,pydub借用了avprobe颊糜、ffprobe來完成它的邏輯哩治。
而借用的方式就是調用subprocess.Popen創(chuàng)建子線程,直接調用操作系統(tǒng)衬鱼,執(zhí)行ffprobe工具业筏。
此處報錯找不到文件就是因為在環(huán)境中我當時并未配置 ffprobe所在目錄,所以Popen在執(zhí)行命令ffprobe時鸟赫,自然就作為找不到ffprobe這個文件的異常爆出來了蒜胖。

def mediainfo_json(filepath, read_ahead_limit=-1):
    """Return json dictionary with media info(codec, duration, size, bitrate...) from filepath
    """
    prober = get_prober_name()
    command_args = [
        "-v", "info",
        "-show_format",
        "-show_streams",
    ]
    try:
        command_args += [fsdecode(filepath)]
        stdin_parameter = None
        stdin_data = None
    except TypeError:
        if prober == 'ffprobe':
            command_args += ["-read_ahead_limit", str(read_ahead_limit),
                             "cache:pipe:0"]
        else:
            command_args += ["-"]
        stdin_parameter = PIPE
        file, close_file = _fd_or_path_or_tempfile(filepath, 'rb', tempfile=False)
        file.seek(0)
        stdin_data = file.read()
        if close_file:
            file.close()

    command = [prober, '-of', 'json'] + command_args
    res = Popen(command, stdin=stdin_parameter, stdout=PIPE, stderr=PIPE)
    output, stderr = res.communicate(input=stdin_data)
    output = output.decode("utf-8", 'ignore')
    stderr = stderr.decode("utf-8", 'ignore')

    info = json.loads(output)
# ... 后續(xù)代碼省略

這段代碼就是他嘗試找到系統(tǒng)中的avprobe命令,或者ffprobe命令抛蚤。 如果都找不到就會警告:我只能使用默認配置台谢,但是可能運行不了~

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"

這段代碼就是具體尋找的過程了。顯然岁经,它遍歷了系統(tǒng)環(huán)境中配置的路徑朋沮,所有路徑都會嘗試找命令,本質上跟在cmd中輸入命令缀壤,系統(tǒng)查找可以運行的工具是一個邏輯樊拓。

def which(program):
    """
    Mimics behavior of UNIX which command.
    """
    # Add .exe program extension for windows support
    if os.name == "nt" and not program.endswith(".exe"):
        program += ".exe"

    envdir_list = [os.curdir] + os.environ["PATH"].split(os.pathsep)

    for envdir in envdir_list:
        program_path = os.path.join(envdir, program)
        if os.path.isfile(program_path) and os.access(program_path, os.X_OK):
            return program_path

再次運行效果

Success
Popen: returncode
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末纠亚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子骑脱,更是在濱河造成了極大的恐慌,老刑警劉巖苍糠,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叁丧,死亡現(xiàn)場離奇詭異,居然都是意外死亡岳瞭,警方通過查閱死者的電腦和手機拥娄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞳筏,“玉大人稚瘾,你說我怎么就攤上這事∫唬” “怎么了摊欠?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長柱宦。 經常有香客問我些椒,道長,這世上最難降的妖魔是什么掸刊? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任免糕,我火速辦了婚禮,結果婚禮上忧侧,老公的妹妹穿的比我還像新娘石窑。我一直安慰自己,他們只是感情好蚓炬,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布松逊。 她就那樣靜靜地躺著,像睡著了一般肯夏。 火紅的嫁衣襯著肌膚如雪棺棵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天熄捍,我揣著相機與錄音烛恤,去河邊找鬼。 笑死余耽,一個胖子當著我的面吹牛缚柏,可吹牛的內容都是我干的。 我是一名探鬼主播碟贾,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼币喧,長吁一口氣:“原來是場噩夢啊……” “哼轨域!你這毒婦竟也來了?” 一聲冷哼從身側響起杀餐,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤干发,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后史翘,有當地人在樹林里發(fā)現(xiàn)了一具尸體枉长,經...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年琼讽,在試婚紗的時候發(fā)現(xiàn)自己被綠了必峰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡钻蹬,死狀恐怖吼蚁,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情问欠,我是刑警寧澤肝匆,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站顺献,受9級特大地震影響术唬,放射性物質發(fā)生泄漏。R本人自食惡果不足惜滚澜,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一粗仓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧设捐,春花似錦借浊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至槐沼,卻和暖如春曙蒸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背岗钩。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工纽窟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人兼吓。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓臂港,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子审孽,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內容