Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.09.2024, 05:23   #1
Zuldek
Пользователь
 
Регистрация: 01.01.2024
Сообщений: 24
По умолчанию Свой прогресс в консоли при выполнении команды ffmpeg

Код:
import subprocess as sub
from tqdm import tqdm

process = sub.Popen("ffmpeg -i /240.mp4 -c:v libaom-av1 -pix_fmt yuv420p /output.mkv", shell=True, stdout=sub.PIPE, stderr=sub.PIPE, text=True)
with tqdm(total=100, desc="Processing", unit="%", ncols=100) as pbar:
    output = process.stdout.readline()
    error = process.stderr.readline()
    print(output)

Как выполнить прогресс в своем шаблоне?
В данном примере команда выполняется, но никакого прогресса не наблюдается. Просто зависает в консоле
Код:
Processing:   0%|                                                            | 0                        /100 [00:00<?, ?%/s]
И так до окончания...
Zuldek вне форума Ответить с цитированием
Старый 14.09.2024, 06:41   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Чтобы прогресс шел, нужно вызывать pbar.update с нужным значением. По запросу "ffmpeg and tqdm" нашлось несколько сниппетов и библиотек. Например, сниппет - изучите функцию ffmpeg_to_tqdm. Или библиотека ffmpeg-progress-yield - изучите пример с использованием tqdm. Или библиотека ffmpeg-python - изучите пример отображения прогресса (похоже, только для Linux).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 14.09.2024, 07:57   #3
Zuldek
Пользователь
 
Регистрация: 01.01.2024
Сообщений: 24
По умолчанию

Установил
Код:
pip install ffmpeg-progress-yield --root-user-action=ignore
Далее выполняю команду

Код:
from ffmpeg_progress_yield import FfmpegProgress
ff = FfmpegProgress(["ffmpeg", "-i", "/240.mp4", "-c:v", "libaom-av1", "-pix_fmt", "yuv420p", "-f", "/output.mkv",])
for progress in ff.run_command_with_progress():
    print(f"{progress}/100")
Выдает ошибку

Код:
Traceback (most recent call last):
  File "/var/www/c.py", line 44, in <module>
    for progress in ff.run_command_with_progress():
                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/dist-packages/ffmpeg_progress_yield/ffmpeg_progress_yield.py", line 302, in run_command_with_progress
    raise RuntimeError(f"Error running command {self.cmd}: {self.stderr}")
RuntimeError: Error running command ['ffmpeg', '-i', '/240.mp4', '-c:v', 'libaom-av1', '-pix_fmt', 'yuv420p', '-f', '/output.mkv']: ffmpeg version 7.0.2 Copyright (c) 2000-2024 the FFmpeg developers
Не шибко разбираюсь во всем этом, но очень хочу разобраться в чем тут дело...
Zuldek вне форума Ответить с цитированием
Старый 14.09.2024, 08:04   #4
Zuldek
Пользователь
 
Регистрация: 01.01.2024
Сообщений: 24
По умолчанию

Не понимаю, при установке как я понял, выдает что та про права root. Я добавляю
Код:
--root-user-action=ignore
Ок, но зачем, когда я и так авторизован в ssh под root пользоватлем?
Zuldek вне форума Ответить с цитированием
Старый 14.09.2024, 08:10   #5
Zuldek
Пользователь
 
Регистрация: 01.01.2024
Сообщений: 24
По умолчанию

Код:
process = sub.Popen("ffmpeg -i /240.mp4 -c:v libaom-av1 -pix_fmt yuv420p /output.mkv", shell=True, stdout=sub.PIPE, stderr=sub.PIPE, text=True)
with tqdm(total=100, desc="Processing", unit="%", ncols=100) as pbar:
    pbar.update(1)
    output = process.stdout.readline()
    error = process.stderr.readline()
    print(output)
попробовал данный вариант, тоже самое...
Zuldek вне форума Ответить с цитированием
Старый 14.09.2024, 21:44   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Код:
import subprocess as sub
from tqdm import tqdm
import re

re_duration = re.compile("Duration: ((?:\d+:)+\d+)")
re_time = re.compile("\stime=((?:\d+:)+\d+)")

def strtime_to_seconds(s):
    hours, minutes, seconds = (float(_) for _ in s.split(':'))
    return (hours * 60 + minutes) * 60 + seconds

process = sub.Popen("ffmpeg -y -i input.mp4 -c:v libaom-av1 -pix_fmt yuv420p output.mkv", shell=True, stdout=sub.PIPE, stderr=sub.STDOUT, text=True)

for s in process.stdout:
    m = re_duration.search(s)
    if m:
        duration = strtime_to_seconds(m.group(1))
        break

previous_span = 0
with tqdm(total=duration, desc="Processing", unit="%") as pbar:
    for s in process.stdout:
        ms = [*re_time.finditer(s)]
        if ms:
            in_seconds = strtime_to_seconds(ms[-1].group(1)) - previous_span
            previous_span += in_seconds
            pbar.update(in_seconds)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 15.09.2024, 06:47   #7
Zuldek
Пользователь
 
Регистрация: 01.01.2024
Сообщений: 24
По умолчанию

Спасибо. Все как то запудрено, работает. Возможно проще сделать?

Код:
process = sub.Popen("ffmpeg -y -i /240.mp4 -c:v libaom-av1 -pix_fmt yuv420p /output.mkv", shell=True, stdout=sub.PIPE, stderr=sub.STDOUT, text=True)
output = ''
with tqdm(total=duration, desc="Processing", unit="%") as pbar:
    #for r in process.stderr:
    #    error += r.rstrip('\n')
    #    print(error+'error')

    for s in process.stdout:
        output += s.rstrip('\n')
        print(s.rstrip('\n'))
        time.sleep(0.1)
Все тоже самое в консоли выводить как и ранее.
В моем примере просто берет строчку из процесса через time.sleep(0.1). Как узнать что произошло что то нестандартное в процессе? Если есть ошибка, взять все что в переменной и в месте с ошибкой записать в файл. Не в процессе записать, а по окончанию. Когда процесс к примеру был остановлен по ошибке, либо что то не критичное произошло, что не остановило процесс преобразования...

Код:
def twrite(log_F, text, tp = 'a+'):
	z = open(log_F, tp, encoding = "utf-8")
	z.write(text)
	z.close()

Последний раз редактировалось Zuldek; 15.09.2024 в 06:57.
Zuldek вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[VBA] при выполнении команды UserForm1.Hide возникает ошибка ЮрийPI118 Помощь студентам 1 24.10.2018 09:37
Макрос для поиска табуляций и выполнении команды controls Microsoft Office Word 0 21.05.2017 12:36
Отображение прогресс-бара при выполнении макроса Сергей Ш. Microsoft Office Excel 4 09.06.2014 12:59
Команды в консоли Volkogriz Общие вопросы Delphi 14 30.01.2014 20:07
прогресс бар в консоли Volkogriz Общие вопросы Delphi 7 10.01.2013 20:52