- Вопрос или проблема
- Обновление 6 апреля 2023:
- Ответ или решение
- Использование FFMPEG для потоковой передачи рабочего стола, экранов и приложений через HTTP
- 1. Установка и настройка FFMPEG
- 2. Команда для потоковой передачи
- 3. Настройка HTTP-сервера
- 4. Тестирование потока в браузере
- 5. Устранение проблем с производительностью
- 6. Варианты для других операционных систем
- Заключение
Вопрос или проблема
Как описано в этом посте для 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, и знание всех деталей команд поможет избежать распространенных проблем. Тестируйте и адаптируйте команды в зависимости от конфигурации вашей системы и нужд. Теперь у вас есть полезная информация для организации потоковой передачи, доступной из любого современного браузера.