Для этого можно использовать ffmpeg
:
На передающем устройстве запустите:
ffmpeg -f x11grab -s 1800x1000 -framerate 30 -i :0.0 -preset fast -vcodec libx264 -tune zerolatency -b 900k -f mpegts udp://RECEIVERIP:9000
И на принимающем устройстве откройте порт брандмауэра 9000/UDP
и запустите:
ffplay udp://@:9000
Вам необходимо соответствующим образом установить RECEIVERIP
, а также отрегулировать область экрана, которую вы хотите передать, изменив -s 1800x1000
. Конечно, вместо 9000
вы можете выбрать любой свободный порт.
Производительность -Вы можете отрегулировать -framerate
и-preset
(...|fast|ultrafast
)настолько, насколько может работать передающая машина, сохраняя при этом необходимое качество и задержку.
ffplay
— очень минимальный клиент, который может соответствовать вашим потребностям. Вы также можете использовать vlc
.
Для отображения потока в браузере вам, вероятно, придется дополнительно использовать потоковый сервер. У vlc
есть такая возможность, но она может быть медленной, и я пока не нашел для этого достаточной документации.
Примечания:
Оптимизированная команда передачи (для меньшей задержки, но более низкого качества и не особенно динамического содержимого )может выглядеть следующим образом:
ffmpeg -f x11grab -s 1800x1000 -framerate 15 -i :0.0 -preset ultrafast -vcodec libx264 -tune zerolatency -b 500k -f mpegts udp://RECEIVERIP:9000
Для дальнейшей оптимизации нагрузки можно использовать аппаратное ускорение, как описано в . Хотя это зависит от платформы, это может значительно снизить нагрузку на ЦП, если поддерживается.
Итак,
sleep 10 & echo $!
это две команды
sleep 10 &
echo $!
То, что они находятся на одной линии, ничего не меняет.
Итак, оболочка создаст fork()
новый процесс и поместит идентификатор нового процесса в $!
. Затем новый процесс запустит sleep
, а другой процесс запустит echo
.
Таким образом, вы можете быть уверены, что $!
всегда будет храниться PID нового процесса, даже если этот процесс завершится ошибкой; это результат fork()
.
Для этого:
My ultimate goal: Execute two tasks in parallel and then wait for both before moving on.
Достаточно включить обе команды в скрипт, отправить их в фоновый режим (&
), чтобы они запускались сразу и выполнялись параллельно, и wait
для них, не захватывая их pid и явно дожидаясь их.
task1 &
task2 &
wait
echo both tasks finished
Из руководства по posixwait
:
If the wait utility is invoked with no operands, it shall wait until all process IDs known to the invoking shell have terminated and exit with a zero exit status.