Исполняемый файл ffmpeg не найден при компиляции с помощью cx_freeze

1

Я построил исполняемый файл из кода ffmpy, который я скомпилировал с помощью cx_freeze. Он работает на моем ПК, как и ожидалось, я думаю, потому что у меня установлен ffmpeg на моей Windows.

Однако мне нужен этот скомпилированный код для работы на любом ПК, а не только там, где установлен ffmpeg.

Когда я запускаю исполняемый файл, ошибка ffmpy говорит: Executable "ffmpeg" not found.

Вот мой setup.py для cx_freeze. Этот setup.py работает для всего, что я хочу скомпилировать, кроме случаев, когда используется ffmpeg.

import sys
from cx_Freeze import setup, Executable
from cx_Freeze import setup
from distutils.core import Extension
import os   

os.environ['TCL_LIBRARY'] = r'C:\Users\Acer\Miniconda3\envs\updated\tcl\tcl8.6'
os.environ['TK_LIBRARY'] = r'C:\Users\Acer\Miniconda3\envs\updated\tcl\tk8.6'


addtional_mods = ['numpy.core._methods', 'numpy.lib.format']
setup(
      name = 'programm',
      version = '5.0.1',
      description = 'PyQt',
      options = {'build_exe': {'includes': addtional_mods}},
      executables = [Executable('ffmpy_test.py', base = "Win32GUI")])

Мой вопрос в том, как мой исполняемый файл ffmpy_test.py может найти ffmpeg.exe в скомпилированном каталоге. Я попытался разместить там каталог ffmpeg, но это не сработало.

Это тестовый код, который я скомпилировал:

from ffmpy import FFmpeg

ff = FFmpeg(inputs={'input.wmv': None}, outputs={'output.mp4': None})
ff.cmd
'ffmpeg -i input.ts output.mp4'
ff.run() 
Теги:
ffmpeg
cx-freeze
ffmpy

1 ответ

1
Лучший ответ

Этот оператор импорта: from ffmpy import FFmpeg в моем коде python импортирует класс FFmpeg из ffmpy ffmpy. Этот класс ищет ffmpeg.exe на C: /ffmpeg/bin/ffmpeg.exe, где ffmpeg установлен на моей Windows.

Вдохновленный комментарием @l'L'l, я посмотрел, как ffmpeg импортируется внутри класса FFmpeg в модуле ffmpy.

В модуле ffmpy:

class FFmpeg(object):
    """Wrapper for various 'FFmpeg <https://www.ffmpeg.org/>'_ related applications (ffmpeg,
    ffprobe).
    """

    def __init__(self, executable='ffmpeg', global_options=None, inputs=None, outputs=None):
        ...

Итак, мне нужно было изменить путь в executable аргументе, чтобы направить оператор import в каталог ffmpeg который я разместил вручную внутри каталога, где находится мой код.

Но я изменил значение по умолчанию для executable аргумента в моем коде, а не в модуле ffmpy, например:

from ffmpy import FFmpeg
import os
d = os.getcwd()
ff = FFmpeg(executable=d+'/ffmpeg/bin/ffmpeg.exe',inputs={'input.wmv': None}, outputs={'output.mp4': None})
ff.cmd
'ffmpeg -i input.wmv output.mp4'
ff.run()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню