Эмулируйте трубу с несколькими выходами. Достаточно ли быстр Python для этого?

1

У меня есть входные байты из ffmpeg. Я бы хотел отправить этот вывод на несколько других процессов ffmpeg. Так как я не могу использовать Unix Pipe, Socket, для этого (или я могу?), Я использую python в качестве принимающего конца канала. Затем подпрограмма копирует полученные данные во все ранее "зарегистрированные" выходы.

Это неправильно!

В частности, я чувствую, что это означает много копирования памяти. Он работает прямо сейчас. Но я серьезно хотел бы начать "правильный путь" этого.

    def writeData(self,data):
    """Write 'data' to all outputs"""
    if len(self.outlets) > 0:
        for outlet in self.outlets:
            outlet.writeData(data)
    else:
        self.logger.warn("Received data but no outlets registred (yet?)")
Теги:

3 ответа

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

Скорее всего, это будет достаточно быстро, особенно со скоростью процессоров теперь по сравнению с относительно низкой пропускной способностью сжатых видеоданных.

Как всегда, вам нужно будет протестировать и проверить свое решение, чтобы оно соответствовало вашим требованиям к производительности.

2

EDIT. Спасибо Филу, который исправил ошибку в более ранней версии (см. комментарии).

Используя bash, вы можете сделать

ffmpeg ... | tee >(ffmpeg ...) >(ffmpeg ...) >(ffmepg ...) > /dev/null

Это будет передавать вывод первого ffmpeg третьим.

Если вы не используете bash, вы можете вручную создать именованные каналы, подключить их к процессам ffmpeg и использовать tee для подключения к именованным каналам:

mkfifo pipe1 pipe2
ffmpeg ... < pipe1
ffmpeg ... < pipe2
ffmpeg ... | tee pipe1 pipe2 | ffmpeg ...
rm pipe1 pipe2

Вышеупомянутый код bash в основном тот же. Создание и удаление названных каналов происходит прозрачно.

  • 0
    Ти, по сути, делает то же самое, что и Python выше, верно? Мне было интересно, если путь питона значительно медленнее. Я спрашиваю, потому что я бы предпочел Python для гибкости.
  • 0
    @Thorsten: Я согласен с Грегом - скорее всего, это не будет узким местом, но чтобы быть действительно уверенным, вам придется попробовать себя. Так как ввод / вывод обычно выполняется большими кусками, я не ожидал бы, что Python создаст много накладных расходов.
Показать ещё 4 комментария
1

Вы просмотрели утилиту "pee" из пакета moreutils? Он делает то, что вы описываете:

ffmpeg | pee 'ffmpeg -stuff1' 'ffmpeg -stuff2' 'ffmpeg -stuff3'

Ещё вопросы

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