Использование FFMPEG для стриминга рабочего стола, экрана и приложений через http

Вопрос или проблема

Как описано в этом посте для Windows, я уже знаю, как транслировать рабочий стол в плеер, такой как ffplay или vlc. Чтобы получить доступ к трансляции в любом браузере, я хотел бы иметь возможность транслировать свой рабочий стол или одно окно через HTTP (Chrome, Edge, Firefox, Brave, Opera и т.д.). Цель такого функционала — иметь возможность использовать свежую систему, на которой нет ffplay, vlc или интернет-доступа для запуска приложения для трансляции, но будет доступен браузер для просмотра транслируемого контента. Я наткнулся на этот пост и попробовал выполнить такую команду ffmpeg:

ffmpeg -f gdigrab -framerate 30 -re -i desktop -listen 1 -f mp4 -movflags frag_keyframe+empty_moov http://localhost:8080

К сожалению, безуспешно.
введите описание изображения здесь
В данный момент я работаю на Windows 10, но идеальным был бы подход, независимый от ОС, для Linux и, возможно, MacOS в будущем.

Обновление 6 апреля 2023:

Нашел способ транслировать основной рабочий стол, но это очень тормозит на Windows 10.

ffmpeg -video_size 1024x768 -f gdigrab -re -i desktop -vcodec libx264 -tune zerolatency -preset ultrafast -listen 1 -f mp4 -movflags frag_keyframe+empty_moov -pix_fmt yuv420p http://localhost:8080

Проверено в Chrome, но трансляция никогда не открывалась, а только загружался файл размером ~4MB download. Firefox, казалось, отображал ее, но это было с задержкой/медленно. Браузер Brave также либо пытался загрузить файл download, либо выдавал ошибку Error writing trailer of http://localhost:8080: Error number -10053 occurred. Ниже приведены версии ffmpeg и используемых браузеров.

ffmpeg version 4.2.1 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 9.1.1 (GCC) 20190807

Chrome:

Version 111.0.5563.147 (Official Build) (64-bit)

Версия Firefox:

111.0.1 (64-bit)

Brave:

Version 1.50.114 Chromium: 112.0.5615.49 (Official Build) (64-bit)

Все еще изучаю варианты.

вы могли бы попробовать добавить заголовки, такие как -headers "Content-Type: video/mp4" в аргументы ваших команд или посмотреть заголовки в запросах от видео, которые загружаются в вашем браузере, и добавить их в опцию -headers вашего ffmpeg

Ответ или решение

Использование FFMPEG для потоковой передачи рабочего стола, экранов и приложений через HTTP

При настройке потоковой передачи рабочего стола или отдельных приложений через HTTP с помощью FFMPEG возникает несколько задач, которые нужно решить, чтобы обеспечить стабильную и быструю работу. Рассмотрим подробный подход.

1. Установка и настройка FFMPEG

Для начала убедитесь, что у вас установлена последняя версия FFMPEG. Для Windows вы можете скачать FFMPEG с официального сайта и добавить его в переменную PATH, чтобы можно было запускать его из командной строки.

2. Команда для потоковой передачи

Одна из основных команд для потоковой передачи рабочего стола выглядит следующим образом:

ffmpeg -f gdigrab -framerate 30 -re -i desktop -vcodec libx264 -preset ultrafast -tune zerolatency -f mpegts http://localhost:8080

Объяснение параметров:

  • -f gdigrab — захват экрана с использованием GDI.
  • -framerate 30 — частота кадров (30fps).
  • -re — подача ввода в реальном времени.
  • -i desktop — источник захвата (можно заменить на конкретное окно, указав его заголовок).
  • -vcodec libx264 — использование кодека H.264 для кодирования.
  • -preset ultrafast — минимизация задержки при кодировании.
  • -tune zerolatency — оптимизация для уменьшения задержки.
  • -f mpegts — формат вывода (MPEG Transport Stream идеально подходит для потоковой передачи).
  • http://localhost:8080 — адрес и порт, на который будет отправляться поток.

3. Настройка HTTP-сервера

Для доступа к потоку через браузер необходимо настроить HTTP-сервер. Использование встроенного в FFMPEG HTTP-сервера возможно, но для лучшей стабильности можно использовать простой веб-сервер, такой как Nginx или Apache. Эти серверы позволят лучшую обработку запросов.

Пример команды для запуска HTTP-сервера с использованием Nginx:

nginx -g "daemon off;"

4. Тестирование потока в браузере

После запуска команды FFMPEG и HTTP-сервера, вы сможете открыть браузер и ввести следующий адрес:

http://localhost:8080

Однако, для браузеров может потребоваться указать правильные заголовки. Для этого можно применять заголовки HTTP:

ffmpeg -f gdigrab -framerate 30 -re -i desktop -vcodec libx264 -preset ultrafast -tune zerolatency -f mpegts -headers "Content-Type: video/mp2t" http://localhost:8080

5. Устранение проблем с производительностью

Если при потоковой передаче возникает задержка, вы можете попробовать уменьшить разрешение и частоту кадров. Например:

ffmpeg -f gdigrab -framerate 15 -video_size 1280x720 -re -i desktop -vcodec libx264 -preset ultrafast -tune zerolatency -f mpegts http://localhost:8080

Эта команда уменьшает частоту кадров до 15 и разрешение до 720p, что может значительно ускорить поток.

6. Варианты для других операционных систем

Для Linux и MacOS команды аналогичны. Вы можете использовать x11grab вместо gdigrab для захвата экрана в Linux:

ffmpeg -f x11grab -framerate 30 -i :0.0 -vcodec libx264 -preset ultrafast -tune zerolatency -f mpegts http://localhost:8080

Заключение

Функциональность FFMPEG позволяет гибко настраивать потоковую передачу рабочего стола через HTTP, и знание всех деталей команд поможет избежать распространенных проблем. Тестируйте и адаптируйте команды в зависимости от конфигурации вашей системы и нужд. Теперь у вас есть полезная информация для организации потоковой передачи, доступной из любого современного браузера.

Оцените материал
Добавить комментарий

Капча загружается...