У меня есть входные байты из 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?)")
Скорее всего, это будет достаточно быстро, особенно со скоростью процессоров теперь по сравнению с относительно низкой пропускной способностью сжатых видеоданных.
Как всегда, вам нужно будет протестировать и проверить свое решение, чтобы оно соответствовало вашим требованиям к производительности.
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
в основном тот же. Создание и удаление названных каналов происходит прозрачно.
Вы просмотрели утилиту "pee" из пакета moreutils? Он делает то, что вы описываете:
ffmpeg | pee 'ffmpeg -stuff1' 'ffmpeg -stuff2' 'ffmpeg -stuff3'