Pyinstaller Скрытый импорт «ffmpeg-python» не найден

Попытка преобразовать скрипты Python в exe с помощью PyInstaller.

В своем коде я использую ffmpeg-python:

import ffmpeg
....
def ffmpeg_save_clip(self,output_video: str, clip_start: str, clip_end: str): 
  (ffmpeg 
   .input(self.file.get_videopath(), ) 
   .output(output_video, vcodec='copy', ss=clip_start, to=clip_end, acodec='copy') 
   .global_args('-y') 
   .run())

Итак, я вызываю PyInstaller из терминала с соответствующим флагом:

pyinstaller --windowed --hidden-import "ffmpeg-python" --noconsole --icon=app.ico --name "app" main.py 

Я также проверил:

pip install ffmpeg-python 
Requirement already satisfied: ffmpeg-python in c:\python38\lib\site-packages (0.2.0) 
Requirement already satisfied: future in c:\python38\lib\site-packages (from ffmpeg-python) (0.18.3)

Но я получаю от PyInstaller:

Hidden import 'ffmpeg-python' not found

Приложение работает в визуальной студии, но когда я запускаю pyinstaller exe и пытаюсь сохранить клип, оно зависает без ответа.

Примечание: я также:

  1. попробуйте добавить ffmpeg.exe в корневую папку приложения pyinstaller.

  2. попробуйте использовать файл .spec с:

    binaries=[('C:\\ffmpeg\\bin\\ffmpeg.exe', 'ffmpeg/),('C:\\ffmpeg\\bin\\ffplay.exe','ffplay/'), ('C:\\ffmpeg\\bin\\ffprobe.exe', 'ffprobe/')],

Ничего не меняется

ОБНОВЛЯТЬ Танк, @happy_code_egg, ты объяснил мне такие вещи. Я попробовал то, что вы сказали, и у меня больше нет ошибок.

Но я не могу заставить работать ffmpeg в Pyinstaller exe. Я добавил блок try/кроме, чтобы изолировать проблему. (когда я запускаю приложение в Visualstudio, оно работает, но не при использовании exe).

блок (очень похож на прошлый def):

def ffmpeg_save_clip(self,output_video: str, clip_start: str, clip_end: str):
    input = 'C:\Users\x\Desktop\input.mp4'
    output = 'C:\Users\x\Desktop\output.mp4'
    try:
        (ffmpeg
        .input(input)
        .output(output, vcodec='copy', ss=clip_start, to=clip_end, acodec='copy')
        .global_args('-y')
        .run(capture_stdout=True))
    except Exception as e:
        self.logger.error('Video window -> ffmpeg_save_clip -> error ' + str(e))
        self.logger.error('Video window -> ffmpeg_save_clip -> input file: ' + input)
        self.logger.error('Video window -> ffmpeg_save_clip -> output file ' + output)
        raise ValueError(str(e))

Примечание: (фиксированные входные и выходные данные приведены только в качестве простых примеров пути)

Когда я открываю журнал, у меня есть:

2024-08-09 11:28:50,293 - ERROR - Video window -> ffmpeg_save_clip -> error [WinError 2] File not found error
2024-08-09 11:28:50,293 - ERROR - Video window -> ffmpeg_save_clip -> input file: C:\Users\x\Desktop\input.mp4
2024-08-09 11:28:50,293 - ERROR - Video window -> ffmpeg_save_clip -> output file C:\Users\x\Desktop\ouput.mp4

(Я пробовал использовать '/', а также '\', чтобы создать путь) Пути к файлам верны, и в Visualstudio они могут быть обработаны с помощью ffmpeg (без ошибок), но exe-файл, похоже, не находит (ввод или вывод)

Я попробовал решение, описанное здесь: Python ffmpeg не принимает путь (без эффектов)

Я нашел также эти обсуждения:

github ffmpeg-python Issue1

github ffmpeg-python Issue2

в обоих обсуждениях возникает проблема с сосуществованием библиотек ffmpeg + ffmpeg-python.

Я попытался (как уже было сказано) удалить оба и переустановить ffmpeg-python, но ничего не меняется.

Примечание: У меня также есть три других предупреждения во время Pyinstaller: (Я пишу их только для полного контекста, но думаю, что они не имеют никакого влияния на эту проблему.)

57283 ERROR: Hidden import 'fiona._shim' not found
57298 WARNING: Hidden import "fiona._shim" not found!
57392 WARNING: Hidden import "importlib_resources.trees" not found!

пробовал с:

--hidden-import fiona._shim --hidden-import fiona.schema

пробовал также с:

--add-data = "fiona/*;fiona”

но предупреждения все равно остаются.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

PyInstaller не упаковал модуль ffmpeg-python, а не ffmpeg.exe.

Сначала перейдите c:\python38\lib\site-packages и скопируйте папку пакета ffmpeg.

Затем вставьте папку пакета ffmpeg в корневой каталог вашего проекта.

Наконец, соберите exe. Какой бы ни была ваша команда, вам следует использовать команду --add-data, чтобы добавить папку пакета ffmpeg при сборке exe.

В вашем случае используйте эту команду.

pyinstaller --add-data = "ffmpeg/*;ffmpeg" --windowed --noconsole --icon=app.ico --name "app" main.py 

--add-data = "ffmpeg/*;ffmpeg" это означает добавление всех файлов и подпапок внутри папки ffmpeg в папку ffmpeg, созданную внутри папки exe или приложения.

Это должно решить проблему. Если другие модули не найдены, выполните те же действия для их упаковки.

Кстати, вы также можете напрямую скопировать и вставить папку ffmpeg в корневую папку приложения pyinstaller. В этом случае вам не нужно использовать команду --add-data.

Спасибо, @happy_code_egg, ты решил мою половину проблемы. См. обновленную информацию по вопросу, чтобы узнать, что произошло.

petunia rose 09.08.2024 11:57

Что касается обновленной части, если путь ввода и вывода верны на 100%, то File not found error не имеет к ним никакого отношения. Ошибка сообщает вам, что exe не смог найти ffmpeg.exe. Добавлен ли ffmpeg.exe в путь среды? Вы также можете попробовать поместить его в папку приложения. Кстати, не обращайте внимания на предупреждения, они не имеют никакого влияния. Кроме того, всегда используйте / или \\ в Windows.

happy_code_egg 09.08.2024 14:46
Ответ принят как подходящий

Для тех, кто сталкивался с этой проблемой, я наконец нашел способ заставить ее работать. Спасибо за поддержку @happy_code_egg (и это объясняет возможности)

Чтобы решить проблему ffmpeg-python, включая pyinstaller, следуйте тому, что сказал @happy_code_egg.

В любом случае (как я писал в разделе обновления моего вопроса), проблема все равно оставалась: используя команду Python ffmpeg в pyinstaller.exe, я имел:

error [WinError 2] The system cannot find the file specified

Это была ссылка не на видеофайл, а на сам ffmpeg.exe. (приложение не смогло найти ffmpeg.exe) Как сказал @happy_code_egg в комментарии.

чтобы это работало, вы можете использовать флаг ffmpeg, чтобы найти ffmpeg.exe:

(ffmpeg ...
...
.run(overwrite_output=True, cmd=r'c:\FFmpeg\bin\ffmpeg.exe')

Добавление флага cmd работает!

Чтобы избежать установки ffmpeg на главный компьютер (каждый главный компьютер, который будет использовать pyinstallar.exe), поместите ffmpeg.exe в корневой каталог основного скрипта Python и установите:

rel_ffmpeg_path = os.path.dirname(__file__) + '\\ffmpeg.exe'
... 

(ffmpeg ...
...
.run(overwrite_output=True, cmd=rel_ffmpeg_path)

Надеюсь, это поможет.

Другие вопросы по теме

Демонстрация FFmpeg C генерирует предупреждение «Не удалось обновить временные метки для пропущенных образцов»
При извлечении части видео с помощью ffmpeg без перекодирования вывод прерывается
Zsh-скрипт, использующий отформатированную строку даты в команде FFMPEG
Можно ли связать статическую библиотеку MinGW с MSVC?
Проблема автоматического масштабирования ffmpeg. Ширина изображения должна быть целым числом, кратным указанной подвыборке цветности
Процесс FFmpeg завершает запись файла только после закрытия программы
AVFrame с форматом NV12 прерывается с использованием аппаратного ускорения D3D11
Можете ли вы написать видеофайл с неупорядоченными (входными) кадрами?
FFmpeg.Autogen: проблема с атомными блоками нулевого размера в выводе MP4
Как я могу визуализировать кадры, декодированные FFmpeg, с использованием аппаратного декодирования с помощью D3D11?