Pull to refresh

Потоковое видео средствами ffserver & ffmpeg

Reading time 2 min
Views 145K

Для организации трансляции нам потребуется:


  • Linux
  • FFmpeg (включает в себя ffserver)

Теория


FFmpeg — это набор свободных библиотек с открытым исходным кодом, которые позволяют записывать, конвертировать и передавать цифровое аудио и видео в различных форматах. Он включает libavcodec, библиотеку кодирования и декодирования аудио и видео и libavformat, библиотеку мультиплексирования и демультиплексирования в медиаконтейнер. Название происходит от названия экспертной группы MPEG и «FF», означающего «fast forward».

© Wikipedia

ffserver идёт в комплекте с ffmpeg и выполняет роль медиа-сервера — получает видеопоток от ffmpeg, который может быть запущен на другой машине, и раздаёт его счастливым пользователям.
Каждый получаемый поток называется Feed’ом (далее будет просто фид). Таких потоков может быть несколько, так же как и отдаваемых (выходных).
FFmpeg у нас будет захватывать видео с веб-камеры или читать из файла.

Практика


Сначала настроим ffserver, чей конфиг лежит в /etc/ffserver.conf:
  1. Port 8090
  2. BindAddress 0.0.0.0
  3. MaxClients 100
  4. MaxBandwidth 20000
  5. NoDaemon
  6. # Фид, надо запомнить feed.ffm, он нам потребуется при запуске ffmpeg
  7. <Feed feed.ffm>
  8. File /tmp/feed.ffm
  9. FileMaxSize 3M
  10. </Feed>
  11. <Stream test.flv>
  12. # Ранее объявленный фид
  13. Feed feed.ffm
  14. Format flv
  15. VideoCodec flv
  16. VideoFrameRate 30
  17. VideoBufferSize 80000
  18. VideoBitRate 200
  19. # Качество видео от 1 до 31, 1 == отлично 31 == фи!
  20. VideoQMin 1
  21. VideoQMax 5
  22. # Разрешение, везде должно быть одинаково!
  23. VideoSize 352x288
  24. PreRoll 1
  25. # Если у вас есть микрофон, или вы транслируете видео со звуком, закомментируйте эту строчку
  26. Noaudio
  27. </Stream>
  28. # Флешка test.swf для просмотра трансляции
  29. <Stream test.swf>
  30. Feed feed.ffm
  31. # Будет запускаться в Adobe Flash Player
  32. Format swf
  33. VideoCodec flv
  34. VideoFrameRate 30
  35. VideoBufferSize 50000
  36. VideoBitRate 100
  37. VideoQMin 1
  38. VideoQMax 5
  39. # Разрешение, везде должно быть одинаково!
  40. VideoSize 352x288
  41. PreRoll 0
  42. # Если у вас есть микрофон, или вы транслируете видео со звуком, закомментируйте эту строчку
  43. Noaudio
  44. </Stream>


Пускаем ffserver:
$ ffserver

Пускаем ffmpeg:
$ ffmpeg -s 352x288 -r 30 -f video4linux2 -i /dev/video0 http://localhost:8090/feed.ffm
-s разрешение, указанное в конфиге ffserver, -r количество кадров/секунду, -f формат, -i путь к камере (или к видео-файлу), http://localhost:PORT/FEED это адрес, где ffserver будет ждать наш поток

PS: если выдаст ошибку, то можно попробовать формат v4l (-f video4linux)

Открываем в браузере http://localhost:8090/test.swf и широко улыбаемся:)

Для отправки видео поменяем параметр -i на путь к файлу, уберём -f (ffmpeg сам определит формат файла):
$ ffmpeg -s 352x288 -r 30 -i ~/big_buck_bunny.ogg http://localhost:8090/feed.ffm

Ну а что бы вставить нашу флешку в html-страницу используем следующий код:
<embed src="http://localhost:8090/test.swf" width="550" height="400"></embed>.
Tags:
Hubs:
+33
Comments 34
Comments Comments 34

Articles