Как правильно получить вывод ffmpeg в python?

Пользователь

от akeem , в категории: Python , 9 месяцев назад

Как правильно получить вывод ffmpeg в python?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

3 ответа

Пользователь

от gussie.jones , 9 месяцев назад

@akeem 

Для получения вывода ffmpeg в Python можно использовать модуль subprocess. Вот пример кода:

1
2
3
4
5
6
7
8
import subprocess

command = 'ffmpeg -i input.mp4 output.mp4'
proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

while proc.poll() is None:
    line = proc.stderr.readline().decode('utf-8')
    print(line)


В этом примере ко***** ffmpeg выполняется с помощью метода Popen из модуля subprocess. Параметр stdout=subprocess.PIPE указывает, что вывод команды должен быть перенаправлен в программу. Параметр stderr=subprocess.PIPE указывает, что вывод ошибок также должен быть перенаправлен.


Затем можно использовать цикл для чтения вывода. Метод readline используется для чтения одной строки вывода ffmpeg. Метод decode('utf-8') используется для преобразования байтового вывода в строку.


Вы можете выбрать, что выводить - stdout или stderr, в зависимости от ваших потребностей. В приведенном примере выводится stderr, чтобы отслеживать возможные ошибки ffmpeg.

Пользователь

от quinton.prosacco , месяц назад

@akeem 

Необходимо также отметить, что использование shell=True в subprocess.Popen может представлять потенциальную угрозу безопасности, поскольку это открывает двери для команд инъекций и других угроз. Желательно использовать список аргументов в качестве аргумента команды (как [ 'ffmpeg', '-i', 'input.mp4', 'output.mp4' ]), если это возможно.


Также хорошей практикой является работа с потоками stdout и stderr параллельно, чтобы избежать блокировок и обеспечить более полный мониторинг процесса.


Ниже представлен пример, который показывает параллельное чтение как stdout, так и stderr:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import subprocess

command = ['ffmpeg', '-i', 'input.mp4', 'output.mp4']
proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

while True:
    # Чтение stdout и stderr параллельно
    stdout_line = proc.stdout.readline()
    stderr_line = proc.stderr.readline()

    if not stdout_line and not stderr_line:
        break

    if stdout_line:
        print("STDOUT: " + stdout_line.decode('utf-8').strip())  # Удаление символов новой строки
    if stderr_line:
        print("STDERR: " + stderr_line.decode('utf-8').strip())  # Удаление символов новой строки


Этот код позволит вам мониторить как stdout, так и stderr параллельно. Вы можете выбирать, что выводить и как обрабатывать вывод в соответствии с вашими потребностями.

Пользователь

от cayla , 22 дня назад

@akeem 

Кроме того, можно использовать модуль subprocess для получения вывода ffmpeg в Python с помощью командной строки. Вот пример кода:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import subprocess

command = 'ffmpeg -i input.mp4 output.mp4'
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)

while True:
    output = process.stdout.readline()
    if output == b'' and process.poll() is not None:
        break
    if output:
        print(output.strip().decode('utf-8'))


Этот код также запускает процесс ffmpeg с использованием модуля subprocess, но в отличие от предыдущих примеров, он перенаправляет вывод stdout и stderr в stdout, чтобы обеспечить более удобную обработку вывода. Как и ранее, убедитесь, что обработка вывода происходит корректно в соответствии с вашими потребностями.