FFMPEG и подпроцесс Python

Для меня markitup является превосходным редактором. Это делает обогащенный текст как редактора разметки и позволяет Вам использовать различные стандарты: HTML, Wiki, UBB, и т.д... Это также позволяет плагины очень легко.

8
задан Esteban Küber 21 September 2009 в 16:53
поделиться

4 ответа

Я часто замечал проблемы с чтением стандартного вывода (или даже стандартной ошибки!) С подпроцессом из-за проблем с буферизацией, которые трудно преодолеть. Мое любимое решение, когда мне нужно прочитать такой stdout / stderr из подпроцесса, - это переключиться на использование вместо подпроцесса , pexpect (или, в Windows, wexpect ).

8
ответ дан 5 December 2019 в 10:04
поделиться

FFMPEG:

FFMPEG выводит весь текст состояния (то, что вы видите, когда запускаете его вручную в командной строке) в интерфейсе stderr. Чтобы захватить вывод из ffmpeg, вам нужно следить за интерфейсом stderr - или перенаправлять его, как в примере.

Проверить вывод на stderr:

Вот еще один способ попробовать и прочитать из stderr вместо перенаправления это при вызове Popen

Класс Popen в Python имеет файловый объект с именем stderr, вы получите доступ к нему так же, как и к stdout. Я думаю, ваш цикл будет выглядеть примерно так:

while 1:
    print convert.ffmpeg.stdout.readline()
    print convert.ffmpeg.stderr.readline()

Заявление об ограничении ответственности: я не тестировал это на Python, но я сделал аналогичное приложение на Java.

-1
ответ дан 5 December 2019 в 10:04
поделиться

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

size=      68kB time=0.39 bitrate=1412.1kbits/s    \rsize=    2786kB time=16.17 bitrate=1411.2kbits/s    \rsize=    5472kB time=31.76 bitrate=1411.2kbits/s    \r\n

Если вы посмотрите на строку выше, вы заметите, что там только один \ n, который печатается, когда файл будет преобразован.

3
ответ дан 5 December 2019 в 10:04
поделиться

Поскольку ffmpeg записывает данные без сброса в stderr, вы должны установить для дескриптора файла stderr неблокирующий режим с помощью fcntl.

    fcntl.fcntl(
        pipe.stderr.fileno(),
        fcntl.F_SETFL,
        fcntl.fcntl(pipe.stderr.fileno(), fcntl.F_GETFL) | os.O_NONBLOCK,
    )

, а затем в цикле, используя select для чтения данных

    while True:
        readx = select.select([pipe.stderr.fileno()], [], [])[0]
        if readx:
            chunk = pipe.stderr.read()

, для полного примера перейдите сюда .

2
ответ дан 5 December 2019 в 10:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: