WebRTC streamer for V4L2 capture devices and RTSP sources.

https://habrahabr.ru/post/229243/,/

https://github.com/geraldo/nodeStream  

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

https://habrahabr.ru/post/78677/

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

 

  • 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>.

 

  • Необязательно запускать ручками два отдельных процесса — ffserver и ffmpeg. Можно в ffserver.conf указать что запускать и оно само это делать будет:
    Launch ffmpeg -s 800x640 -r 30 -f video4linux2 -i /dev/video0

    И относительно проигрывания потокового видео: попробуйте запустить обычный avi — получите ругань, что флеш поддерживает тоько два кодека. А вот если указать каким кодеком выводить — будет работать, но будет жрать процессор.

    <Feed stream0.ffm>
     File /tmp/stream0.ffm
     FileMaxSize 3M
     Launch ffmpeg -s 800x640 -r 30 -f video4linux2 -i /dev/video0
    </Feed>
     
     
    • Покажет список камер которые можно использовать
      sudo v4l2-ctl --list-devices

      Список аудио карт для осуществления записи звука
      sudo arecord -l

      Пример для записи звука без указания канала и с ним
      Launch ffmpeg -s 640x480 -f video4linux2 -i /dev/video0 -r 30 -f alsa -i hw:0,0
      Launch ffmpeg -s 640x480 -f video4linux2 -i /dev/video1 -r 30 -f alsa -ac 1 -i hw:0,0

     

     

    Это пытаются трансляция видео источников с помощью технологии webrtc, используя простой механизм.

    Сигналка с webrtc осуществляется через http-запросы:

     

    • /звонок : отправить предложение и получить ответ

    • /слайдера : закрыть вызова

    • /addIceCandidate : добавить кандидата

    • /getIceCandidate : попасть в список кандидатов

    Список запросов http API доступен через /помочь.

    • для x86_64 на Ubuntu надежный
    • для ARM crosscompiling с ССЗ-организацией linaro-АРМ-ОС Linux-gnueabihf-raspbian-х64 (эта сборка работает на Raspberry Pi и NanoPi Нео)
    • В настоящее время существует 2 опирается на Трэвиса ки :

    • 1. Скачали установочный архив сервера:
      $wget flashphoner.com/downloads/builds/WCS/3.0/x8664/wcs3_video_vp8/FlashphonerMediaServerWebRTC-3.0/FlashphonerMediaServerWebRTC-3.0.868.tar.gz
      2. Развернули:
      $tar -xzf FlashphonerMediaServerWebRTC-3.0.868.tar.gz
      3. Установили:
      $cd FlashphonerMediaServerWebRTC-3.0.868
      $./install.sh
      В процессе установки ввели внешний IP адрес сервера: 54.186.112.111 и внутренний 172.31.20.65 (тот что Private IP).
      4. Запустили сервер:
      $service webcallserver start
      5. Проверили логи:
      $tail — f /usr/local/FlashphonerWebCallServer/logs/server_logs/flashphoner.log
      6. Убедились, что сервер стартовал и готов к работе:
      $ps aux | grep Flashphoner
      7. Установили и запустили apache:
      $yum install httpd
      $service httpd start
      8. Скачали web-файлы и расположили их в стандартной папке апача /var/www/html
      cd /var/www/html
      $wget github.com/flashphoner/flashphoner_client/archive/wcs_media_client.zip
      $unzip webrtc_media_client.zip
      9. Вписали IP адрес сервера в конфиг flashphoner.xml:
      10. Остановили firewall.
      $service iptables stop

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

    Обратная связь

    Интересуют вопросы реализации алгоритмов, программирования, выбора электроники и прочая информация, постараюсь осветить в отдельных статьях

    пишите мне на netdm@mail.ru