Будет "$!" надежно вернуть правильный идентификатор с помощью «&»?

Для этого можно использовать 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

Для дальнейшей оптимизации нагрузки можно использовать аппаратное ускорение, как описано в . Хотя это зависит от платформы, это может значительно снизить нагрузку на ЦП, если поддерживается.

0
13.12.2020, 20:02
2 ответа

Итак,

sleep 10 & echo $!

это две команды

sleep 10 & 
echo $!

То, что они находятся на одной линии, ничего не меняет.

Итак, оболочка создаст fork()новый процесс и поместит идентификатор нового процесса в $!. Затем новый процесс запустит sleep, а другой процесс запустит echo.

Таким образом, вы можете быть уверены, что $!всегда будет храниться PID нового процесса, даже если этот процесс завершится ошибкой; это результат fork().

4
18.03.2021, 22:43

Для этого:

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.

1
18.03.2021, 22:43

Теги

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