Как я могу транслировать видео H.264 с модуля камеры Raspberry Pi через веб-сервер?

50

Итак, сегодня я приобрел Raspberry Camera и работал нормально.

Захват изображения в формате JPEG:

raspistill -o image.jpg

Захват 5-секундного видео в формате H.264 :

raspivid -o video.h264

Я не хочу устанавливать какие-либо дополнительные приложения, поскольку хочу использовать доступный HTML5 . Так как Chrome / Safari имеет встроенные декодеры для H.264, я просто хочу, чтобы мой браузер указывал на URL и смотрел поток.

Как мне этого добиться?

Петр Кула
источник
2
Я тоже над этим работаю. Я думаю, вам нужно добавить поддержку MP4 в nginx или что-то в этом роде. Дадим вам знать, если у меня будет прорыв.
Реканта
@recantha Были ли у вас новые достижения в области потокового видео?
Петр Кула
3
Лучшее решение, которое я нашел, основано на RaspiMJPEG Сильвана Мельчуара. Взгляните на мой блог, который содержит ссылку на форум Фонда Raspberry Pi, где все объясняется. ( recantha.co.uk/blog/?p=11176 )
recantha
2
Да, это выглядит потрясающе, чтобы иметь возможность потоковой передачи на различные устройства. Какой FPS и лаг вы получаете ?? Мне удалось заставить uv4l работать с VLC и OSD. Очень короткая и плохая демка. Скоро сделаю лучше. Был сделан поздно ночью после часов проб и ошибок. youtu.be/LO10Ytlauag
Петр Кула
@ppumkin Как я могу записать через скрипт Python во время работы RaspiMJPEG? Он дает начало записи видео, но записывает в формате .h264 Как можно запустить скрипт Python при нажатии start_recording?
Coderaemon

Ответы:

32

Потоковое с HLS

Запатентованный метод Apple потокового видео в реальном времени. Он называется HTTP Live Streaming (HLS) и поддерживается только технологией Apple. Google (Chromium / YouTube) использует свою собственную реализацию, называемую dash mpeg, и все остальные либо сбиты с толку, либо используют H.264, инкапсулированный в MP4 .

ПРОФИ

  • Может передавать HD 1080p по локальной сети на любое устройство, которое поддерживает .m3u8плейлисты
  • Использует семантику HTML5 (но это не стандартизированный формат)
  • Некоторая поддержка в сторонних премиум-программах, таких как jwplayer 6, может использоваться

МИНУСЫ

  • Имеет задержку не менее 5 секунд (в этом приложении, но при использовании зеркалирования с iPhone на AppleTv они достигают 50 мс - 500 мс). Так что это не хорошо для приложений с дистанционным управлением, где требуются мгновенные реакции, то есть роботов или вертолетов.
  • Придется платить за стороннее программное обеспечение, если вы хотите расширить поддержку браузера, которая может мигать.

m3u8

  • .m3u8это просто версия формата M3U в UTF-8 . (Файлы .m3u могут иметь различные кодировки.) Некоторые люди утверждают, что переименование .m3u8 в .m3u будет работать, как и ожидалось, во всех браузерах HTML5. Я попробовал это, и это не сработало для меня.

Концепция этой потоковой передачи заключается в том, что короткие сегменты файлов длиной не менее 5 секунд (в данном примере - возможно, есть новые способы его ускорения) записываются и сохраняются в надлежащий файл. Файл списка воспроизведения обновляется новым именем файла, и клиент всегда опрашивает этот список воспроизведения и загружает самый последний файл. Есть некоторые механизмы, необходимые для плавного объединения видео на клиенте. Вот почему другие разработчики не хотят реализовывать это, потому что это требует больших усилий и не соответствует стандартам HTML5 (даже при том, что не существует надлежащего стандарта HTML5 для прямых трансляций? Эхх, вздох ).

Установка

Вам нужно скомпилировать ffmpeg- не использовать apt-get installдля FFmpeg

Это может занять до 5 часов - Он должен быть версии 1.1 или выше, поддерживающий сегмент потокового. Вы можете использовать это для клонирования и компиляции.

cd /usr/src
git clone git://source.ffmpeg.org/ffmpeg.git

cd ffmpeg
./configure
make && make install
  • Установите nginx (engine-x) - nginx был специально разработан для встроенных устройств и является самым легким и быстрым веб-сервером с поддержкой PHP на данный момент. (Да, это лучше, чем громоздкий Apache )
  • Создайте каталог, например, живите в своей папке www, /usr/share/nginx/www/

Создайте файл сценария Bash, который называется что-то вроде video.sh, примените chmod +xк нему и вставьте его. Поменяйте базовую папку так, чтобы где-нибудь ваш HTTP- сервер жил . Я использовал nginx,/usr/share/nginx/www/

#!/bin/bash

base="/data/live"

cd $base

raspivid -n -w 720 -h 405 -fps 25 -vf -t 86400000 -b 1800000 -ih -o - \
| ffmpeg -y \
    -i - \
    -c:v copy \
    -map 0:0 \
    -f ssegment \
    -segment_time 4 \
    -segment_format mpegts \
    -segment_list "$base/stream.m3u8" \
    -segment_list_size 720 \
    -segment_list_flags live \
    -segment_list_type m3u8 \
    "segments/%08d.ts"


trap "rm stream.m3u8 segments/*.ts" EXIT

# vim:ts=2:sw=2:sts=2:et:ft=sh

Создайте файл HTML, который будет загружать плейлист

<html>
  <head>
    <title>PiVid</title>
  </head>
  <body>
    <video controls="controls" width="1280" height="720" autoplay="autoplay" >
      <source src="stream.m3u8" type="application/x-mpegURL" />
    </video>
  </body>
</html>

Служба поддержки

  • iPhone, открывает страницу, но заходит в QuickTime . Качество действительно потрясающее!
  • Windows Safari, потоки в порядке.
  • Macintosh или Windows, QuickTime. Потоки в порядке.
  • Android 2.3.5 и не работал, но он должен был поддерживаться с 2.1.x
  • Windows, Chrome - ничего
  • Windows, Internet Explorer 10 --- Ничего (неподдерживаемый тип видео)
  • Windows, VLC media player - ничего

Ссылка: http://www.raspberrypi.org/phpBB3/viewtopic.php?p=351392&sid=5b9a46f5eea2c7a0887d2efdfa7edade#p351392

Оригинальный код: https://github.com/AndyA/psips/blob/master/examples/hls.sh

ppumkin
источник
Что касается ускорения компиляции ffmpeg. Чтобы обойти низкую вычислительную мощность RPI и длительное время компиляции для ffmpeg, я попытался использовать Qemu с Wheeze, но натолкнулся на некоторое препятствие при входе в систему, и мне пришлось попробовать с изображением Arch , Это сработало. Также попытался Sqeeze на образ Ubuntu , через VirtualBo
luboP
2
Есть ли способ автоматического удаления старых сегментов? SD-карта заполняется через некоторое время. Я также хотел бы, чтобы они были удалены, чтобы я мог запустить это на tmpfs и не испортить SD-карту.
Димм
2
@Dimmme Если вы добавите -segment_wrap 10в качестве аргумента ffmpeg, он будет использовать до 10 файлов сегмента.
Грегерс
Кто-нибудь получил это на работу? Файлы созданы, но, кажется, пропускают информацию SPS / PPS, поэтому видео не будет воспроизводиться ни в iOS Safari, ни в VLC. Поток.m3u8 также не включался segments/при указании файлов сегментов, поэтому я удалил папку сегментов. Я что-то не так понял?
Грегерс
вам нужно передать поток через двоичный файл фильтра PSIPS. Новейшая версия raspicam должна была сделать это ... но по какой-то причине я не смог заставить ее работать без PSIPS
Петр Кула
23

UV4L MMAL

Спасибо за комментарий от @mpromonet за обновление драйвера Linux-Projects V4L2, который теперь очень эффективно внедряет MMAL - но он все еще находится в стадии разработки.

Следуйте этим инструкциям, чтобы установить репозиторий linux-project и установить драйвер UV4L с дополнительными функциями. Затем установите сервер и mjpeg. Если вы хотите, вы можете поэкспериментировать с другими тоже.

После установки всего, вы можете получить доступ к HTTP-серверу через порт 8080. Вы также должны проверить /etc/uv4l/confфайл и указать, хотите ли вы использовать mjpeg или H.264, поскольку это имеет значение, но вы можете настроить несколько параметров через встроенный веб-интерфейс. сервер.

HTML 5

Это то, чего мы все ждали (называемый WebRTC ), и благодаря новому драйверу он прекрасно работает (на Raspberry Pi 2).

Сначала выполните следующие действия : http://www.linux-projects.org/modules/sections/index.php?op=viewarticle&artid=14 :

curl http://www.linux-projects.org/listing/uv4l_repo/lrkey.asc | sudo apt-key add -

# Add the following line to the file /etc/apt/sources.list
# deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main

sudo apt-get update
sudo apt-get install uv4l uv4l-raspicam

sudo apt-get install uv4l-raspicam-extras

Затем на вашем Raspberry Pi 2 установите этот WebRTC (для Raspberry Pi 1 прочитайте связанный сайт для других вариантов)

sudo apt-get install uv4l-webrtc

Перезапустите все драйверы и перейдите к

http://raspberry:8080/

Теперь у вас есть высококачественная потоковая передача видео с низкой задержкой прямо в современный браузер, такой как Chrome или Firefox. (Может быть, Safari, но я не могу проверить, потому что они больше не делают Winblows и Internet Explorer ... да)

MJPEG

По умолчанию он использует mjpeg1080p, и он очень вялый. Я настроил его на размер кадра 800x600 и использовал что-то вроде iSpy для обработки видео. В целях безопасности я получаю около 10 кадров в секунду на четком видео. Это намного лучше, чем 3 кадра в секунду при 640x480 до этого драйвера. Он работает на iPhone с Safari, Android Chrome и почти всем остальным.

http://raspberrypi:8080/stream/video.mjpeg

Это также означает, что motionтеперь (мне все еще нужно проверить и сравнить) работать намного лучше. Обязательно установите конфигурацию для использования v4l2_palette 8илиv4l2_palette 2

H.264

Теперь это исправлено для «потоковой передачи», и нам не нужно прилагать больших усилий, чтобы смотреть видео H.264 через VLC media player . Поток по-прежнему RAW H.264, поэтому вам нужно демультиплексировать его или транскодировать / encapsualte, если вам нужно, чтобы он работал где-то еще. Вы должны настроить bitrate=xxxxxxфайл конфигурации, если вы используете потоковую передачу по Wi-Fi.

В медиаплеере VLC вы должны указать, что хотите использовать демультиплексор H.264. Поэтому, если вы используете графический интерфейс, обязательно добавьте аргумент :demux=264. Из командной строки vlc http.../video.h264 --demux h264. В противном случае вы увидите только пустой экран, даже если светодиод камеры включен.

http://raspberrypi:8080/stream/video.h264

Вуаля! Потоковое вещание HD с задержкой примерно в 500 мс (с настройкой до 200 мс). Это определенно намного проще, чем использовать старые методы. Качество и FPS превосходны, но вы не можете встроить это в HTML5 без транскодирования в MP4 или WebM . Я надеюсь, что это будет реализовано, поскольку это действительно сделает этот отличный автономный сервер.

RTSP / RTMP / RTP

Не поддерживается / реализовано

http://www.linux-projects.org/uv4l/tutorials/rtsp-server/

HLS

Не поддерживается / реализовано


Там нет video4linuxAvailabe водителя еще. Это означает, что мы не можем использовать ffserver для потоковой передачи данных с использованием /dev/video0или одновременной работы с USB-камерой.

Вот почему так сложно найти правильную потоковую трансляцию для браузеров HTML5.

Петр Кула
источник
Теперь есть video4linuxдрайвер, официальный драйвер V4L2 bcm2835-v4l2 и драйвер V4L2 пользовательского пространства [ linux-projects.org/modules/sections/…
mpromonet
Это реальный драйвер v4l или это просто обёртка вокруг raspivid, которая дает ужасную производительность?
Петр Кула
1
Официальный драйвер использует интерфейс MMAL, см. Исходный код [ github.com/raspberrypi/linux/blob/rpi-3.12.y/drivers/media/… . Производительность кажется правильной.
mpromonet
Я играю с этим в течение 3 дней. Кодировка mjpeg определенно намного стабильнее и может надежно просматривать 800x600 при 10 кадров в секунду на iPhone, Android или iSpy. h264 великолепен при 1080p 30fps, и мы можем посмотреть это в vlc, используя --demux h264флаг. Нам все еще нужно перекодировать это для использования на мобильных устройствах или встраивать в виде mp4 / webm на веб-страницах. Но это действительно большой шаг вперед по качеству и качеству. Не путайте с «другим» драйвером UV4L, не являющимся проектом linux, который является мусором.
Петр Кула
Обратите внимание, что добавление: demux = 264 в методе H264 предназначено для сервера vlc, а не для клиента vlc. Итак, командная строка для запуска потоковой передачи на Rasberry для обеспечения совместимости с vlc в смартфонах выглядит так:/usr/bin/cvlc v4l2:///dev/video0 --v4l2-width 800 --v4l2-height 400 --v4l2-chroma h264 --sout '#standard{access=http,mux=ts,dst=0.0.0.0:8080}' :demux=264
Jaime M.
10

Потоковое с MJPEG

U4VL

Интерфейс ядра со встроенным HTTP (S) сервером.

http://www.linux-projects.org/uv4l/tutorials/streaming-server/

Веб-интерфейс Raspberry Pi Cam

Хороший проект Silvanmelchior, который развертывает веб-сервер, похожий на DVR, многоцелевой потоковый сервер. Нужно больше информации

https://github.com/silvanmelchior/RPi_Cam_Web_Interface

Устаревший метод

Потоковая передача с помощью mjpg поддерживается практически всеми браузерами, включая Internet Explorer 6. Многие камеры, использовавшиеся до H.264, использовали аппаратное обеспечение mjpg, которое по существу максимально быстро сбрасывало файлы JPEG в папку, а mjpg считывало файл в буфер и удаляло его. их. Некоторые устройства могут достигать скорости 25 кадров в секунду, и даже если у вас плохое соединение, вы получите по крайней мере 1 кадр в секунду.

Поддержка mjpg была прекращена в HD камерах, потому что файл JPEG стал слишком большим для потоковой передачи через Интернет, а H.264 - намного более быстрый и качественный протокол.

Поскольку у нас нет возможности транслировать H.264 с помощью модуля камеры, это выглядит как реальный запасной вариант ...

Это почти мгновенно, но не ожидайте, что получите более 1,5 кадров в секунду. Это до raspistillтого, чтобы быть крайне МЕДЛЕННЫМ! Использование функции замедленной съемки, установленной на 100 мс, которая должна давать нам 10 кадров в секунду, не работает, потому что raspistillпросто затягивается и имеет серьезные проблемы с производительностью внутри себя.

  1. Измените, /tmpчтобы использовать оперативную память для /etc/default/tmpfsизменения скорости RAMTMP=yes(это попытка увеличить частоту кадров в секунду, но Rasistill просто не может справиться с самим собой.)
  2. перезагрузка
  3. apt-get установить git
  4. apt-get установить libjpeg8-dev
  5. apt-get установить libv4l-dev
  6. apt-get установить imagemagick
  7. cd /usr/src, mkdir mjpg-стример, cd mjpg-стример ...
  8. git clone https://github.com/engine12/mjpg-streamer.git
  9. make USE_LIBV4L2=true clean all
  10. ДОПОЛНИТЕЛЬНО Если у вас есть ошибки
  11. sudo ln -s /usr/include/libv4l1-videodev.h /usr/include/linux/videodev.h
  12. sudo ln -s /usr/include/lib4l2.h /usr/include/linux/lib4l2.h
  13. Внутри make-файла закомментируйте все плагины, кроме input_file и output_http, и выполните make снова. У меня было много проблем здесь.
  14. Скопируйте двоичный, mjpg_streamerи его плагинов input_*.soи output_*.soк /usr/local/bin. В противном случае, запустите его прямо из каталога src.
  15. Необязательный конец
  16. mkdir /tmp/stream
  17. raspistill -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &
  18. LD_LIBRARY_PATH=./ ./mjpg_streamer -i "input_file.so -f /tmp/stream" -o "output_http.so -w ./www" (запустите это там, где находятся бинарный файл и плагины)
  19. Перейти к http://<IP-address>:8080
  20. Вот несколько вариантов, наслаждайтесь «живой» трансляцией по старинке… поддерживаемой большинством браузеров - современными, старыми и экспериментальными.

Я боролся за то, чтобы скомпилировать его в течение примерно 5 часов ... вздох , но я думаю, что я буду использовать это, поскольку я могу получить доступ к потоку с любого телефона и любого браузера. Мне просто нужно подождать, пока у нас не появятся лучшие водители ... Еще год или два. :(

Независимо от того, какое качество я пробую, я получаю не быстрее или не медленнее, чем 1 кадр / с, используя стрим. Я использовал 720p и 1080p, и только качество изображения улучшается, но fps не имеет значения в локальной сети. Я предполагаю, что меньшие настройки помогут с WAN / 3G или другими радиопередачами.

Rasistill записывает изображение в один файл. Это может быть узким местом. Он записывает файл, mjpg strreamer читает его и удаляет, вызывая блокировку ввода-вывода, поэтому raspistill не может записать в файл.

Единственное, о чем я могу думать, - это использовать raspivid по каналу FFmpeg , который создаст файлы JPEG для нас - мне нужно попробовать это, и, возможно, это намного быстрее, чем использовать raspistill. Мне удалось получить 25 кадров в секунду с шокирующим качеством, и это было задержано примерно на 10 секунд ... Изменение настроек дало мне около 3 кадров в секунду, но процессор на 100%. Для обработки видеопотока не используется оборудование ...

raspivid -w 640 -h 480 -fps 25 -vf -t 86400000 -b 1800000 -o -  \
ffmpeg -i - \
    -f image2(?) \
    -c:v mjpeg \
    stream%d.jpg

Я также читал и обнаружил, что мы можем использовать %dв имени выходного файла raspistill. Интересно, увеличит ли это fps. Также JPG кодирование аппаратно ускорено, поэтому я действительно пытаюсь понять, почему это так медленно ...

Я получил ошеломляющие 2 FPS, используя %dв имени файла. По какой-то причине запись файла JPEG ужасно медленна от расписта. Вздох.

ppumkin
источник
спасибо, что поделились знаниями
user566245
10

По состоянию на 2017 год (или, возможно, ранее) raspividболее не является предпочтительным методом, так как разработчики Pi рекомендуют использовать вместо него V4L2.

Таким образом, этот метод позволяет вам передавать H264 через RTP, используя V4L2 вместо raspivid. Я заметил, что этот метод приводит к меньшему количеству пропусков и допускает более высокий битрейт:

#!/bin/sh

# Use V4L2 (preferred) instead of raspivid
# exposure_dynamic_framerate=1 (raspivid --fps 0) - reduce framerate/increase exposure in low light
# scene_mode=8 (raspivid --exposure night) - allow framerate reduction to increase exposure
v4l2-ctl -v width=1296,height=972,pixelformat=H264 \
        --set-ctrl=exposure_dynamic_framerate=1 \
        --set-ctrl=video_bitrate=5000000 \
        --set-ctrl=scene_mode=8

exec ffmpeg -f h264 -probesize 32 -r 30 -i /dev/video0 -vcodec copy -an -f rtp_mpegts udp://224.0.1.2:5004

Этот скрипт многоадресно передает видео, и его можно просмотреть на другом компьютере в локальной сети с помощью команды, подобной этой:

ffplay -sync ext -an -fast -framedrop -probesize 32 -window_title "Raspberry Pi" -an udp://224.0.1.2:5004

-sync extзаставляет видео воспроизводиться настолько быстро, насколько это возможно, поэтому оно будет работать в режиме реального времени, в отличие от запуска его с фиксированной частотой кадров и отставанием, если Pi захватывает кадры быстрее, чем это. С этим методом все еще есть некоторая задержка, но не хуже, чем у других raspividметодов.

(Совет: если вы подключены к маршрутизатору или коммутатору, поддерживающему IGMP, убедитесь, что 224.0.0.0/4на вашей машине не установлен межсетевой экран, в противном случае, когда маршрутизатор спросит ваш ПК, хочет ли он какой-либо многоадресный трафик, ПК никогда не ответит, и вы никогда не увидите любое видео.)

Запись на диск

Как я упоминал запись в комментариях ниже, я остановлюсь на этом здесь. Вы можете использовать такую ​​команду для записи сетевого потока на диск:

ffmpeg -y -i udp://224.0.1.2:5004 -c copy \
  -f segment -segment_atclocktime 1 -segment_time 900 \
  -reset_timestamps 1
  -strftime 1 /path/to/storage/pi-%wT%H%M.mkv

Посмотрите на man strftimeзначения %символов в имени файла. В этом примере используется номер дня (0 = воскресенье, 1 = понедельник и т. Д.), За которым следует a, Tа затем время. Он запускает новый файл каждые 15 минут.

Для ясности, эта команда записи предназначена для запуска на удаленном ПК (не на самом Pi), хотя, вероятно, она будет работать и на Pi (не проверено).

Поскольку каждые 15 минут вы получаете новый файл с указанием дня и времени в имени файла, это означает, что через неделю вы начнете получать сгенерированные имена файлов, которые уже были использованы, в результате чего самые старые файлы будут перезаписаны. Другими словами, у вас получится развернутая петля с кадрами прошлой недели. Это идеально подходит для камеры видеонаблюдения, где вам редко придется возвращаться назад более недели.

В качестве дополнительного примечания это дает файлы размером около 500 ГБ, поэтому вы можете скорректировать битрейт, разрешение или перезаписать файлы раньше (скажем, каждые 24 часа), если не хотите, чтобы они занимали так много места.

Malvineous
источник
Круто - Спасибо, что поделились этим. Можете ли вы объяснить, почему использование многоадресной рассылки здесь необходимо? Из того, что я узнал, является то, что многоадресная рассылка используется редко, поэтому мне было интересно, что она здесь показывает? Тем не менее - сценарий выглядит великолепно, и я уверен, что он поможет многим людям. Спасибо +1
Петр Кула
1
Многоадресная рассылка необязательна - вы можете просто заменить обычный IP-адрес, если хотите, - но вам нужно будет изменить используемую команду ffserverили какую-либо другую серверную систему, если вы хотите, чтобы несколько каналов отображали канал. Затем через 2-3 клиента (в зависимости от скорости передачи видео) USB-адаптеру Pi Ethernet не хватит пропускной способности. С многоадресной рассылкой нет необходимости запускать сервер (клиентские машины просто выбирают, слушать ли трафик или игнорировать его), так что вы можете иметь тысячи машин, отображающих видео без влияния на Pi, который когда-либо отправляет только один видеопоток ,
Malvineous
Спасибо за объяснение - Но многоадресная рассылка работает только во внутренних сетях? Если интернет-провайдер получает пакет многоадресной рассылки, он обычно просто отбрасывает его - так что вы не можете просто транслировать всем в Интернете. Я полагаю, если у вас есть большая внутренняя сеть, мультилитирование большого потока может также повлиять на вашу сеть? Но да ... просто для просмотра потока я бы просто использовал UDP для выбранного IP-адреса ... но мне все равно нравится опция многоадресной рассылки: D Попробую сделать это в эти выходные только потому, что я никогда раньше этого не делал. :) Спасибо
Петр Кула
1
Да, многоадресная рассылка в основном для внутренних сетей. Предполагается, что он лучше работает с IPv6, но я думаю, что он все еще нуждается в сотрудничестве с провайдером. Я использую его, потому что это означает, что мне не нужно запускать сервер на Pi, и я могу просматривать потоки с двух разных машин и записывать их на диск без изменения конфигурации Pi или перегрузки пропускной способности сети Pi. Если ваша внутренняя сеть велика, вы, вероятно, будете использовать IGMP-совместимые коммутаторы, которые предназначены для отправки многоадресного трафика только там, где это необходимо, чтобы воздействие не отличалось от обычного.
Malvineous
1
Спасибо за объяснение .. Теперь я вижу много преимуществ использования многоадресной рассылки с незначительными оговорками, которые на самом деле не влияют даже на домашних пользователей. Я обязательно попробую. Это простые и очевидные вещи, которые иногда необходимо указать, чтобы иметь смысл. И, глядя на ваше обновление ... запись действительно очень крутая!
Петр Кула,
4

Мне удалось выполнить потоковую передачу с моего Raspberry Pi на веб-сервер с помощью встроенного модуля nginx-rtmp .

Чтобы избежать неприятностей ffmpeg, я рекомендую распространяемый дистрибутив, такой как Arch Linux Arm .

raspivid -vf -t 0 -fps 25 -b 2000000 -o - |
ffmpeg -i - -vcodec copy -an -r 25 -f flv rtmp://x220/myapp/mystream

Некоторые заметки:

  • Аппаратно-кодированный видеопоток H.264 занимает около 300 КБ / с полосы пропускания , что, если я правильно выполнил свои вычисления, займет не менее 750 ГБ в месяц, если вы хотите транслировать на ваш nginx-rtmp httpd или RTMP- сервис, такой как Ustream .
  • Аудио: если вы хотите, чтобы звук сопровождал ваш поток H.264, он необходим в AAC . В основном Raspberry Pi слишком медленный, чтобы кодировать USB-микрофон в AAC на лету .

Поэтому, на этом основании, я думаю, что прямая трансляция с Raspberry Pi могла бы подойти для временной трансляции, но не для постоянно включенной веб-камеры, поскольку она слишком требовательна к пропускной способности. Вы не получите аудио, и если вы это сделаете, это будет миссия для синхронизации.

Вы можете записывать аудио более эффективно отдельно, одновременно с записью видео. Затем, возможно, позже подключите аудиопоток, преобразуйте его в WebM и поместите в httpd в виде статического файла с тегом HTML-видео. Рабочий процесс довольно неловкий, хотя это лучшее, что я могу придумать для эффективной трансляции, которая будет безболезненно работать в разных браузерах.

Хендри
источник
1
Вы можете контролировать пропускную способность и разрешение, хотя. Если его локальная локальная сеть транслируется для видеонаблюдения, то это даже не проблема. Вещание через Интернет может потребоваться по требованию и / или с гораздо меньшим разрешением. Но это еще один способ сделать это. Спасибо +1
Петр Кула
и как это должно работать? это не для меня ... FFMPEG говорит "RTMP_Connect0, не удалось подключить сокет. 111 (Соединение отказано)"
Flash Thunder
2

UV4L теперь поддерживает потоковое аудио и видео с WebRTC и HTML5.

Штрунц
источник
просто прочитайте ссылку выше ...
Strunz
Работает действительно хорошо!
Петр Кула
Как? Ссылка на пример страницы не работает ...
Cerin
Я прошел эти уроки, и я могу подтвердить, что они не работают
Квинтин
Я могу подтвердить, что это работает, как я пытался это .. instructables.com/id/Raspberry-Pi-Video-Streaming
Tia
2

Ответ Петра Кула, кажется, находится на правильном пути, но устарел на малиновом участке.

Обновленные инструкции для uv4l на Raspberry stretch на

https://www.linux-projects.org/uv4l/installation/

# switch to superuser mode
sudo -s
# add the repository key for uv4l
curl http://www.linux-projects.org/listing/uv4l_repo/lpkey.asc | sudo apt-key add 
# add the url for the u4vl repository to apt
echo "deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/stretch stretch main" >> /etc/apt/sources.list
apt-get update
apt-get install uv4l uv4l-raspicam
apt-get install uv4l-raspicam-extras
# do not forget to install the server - see what happens if you do
# below
apt-get install uv4l-server
reboot

Вы можете настроить параметры uv4l через /etc/uv4l/uv4l-raspicam.conf, а затем перезапустить службу с помощью

sudo service uv4l_raspicam restart

В моем случае все не работает "из коробки" (если забыли установить uv4l-сервер ...). Следующие комментарии могут помочь вам отладить подобные проблемы.

Я проверил, что сервер работает с:

pgrep -fla uv4l
995 /usr/bin/uv4l -f -k --sched-fifo --mem-lock --config-file=/etc/uv4l/uv4l-raspicam.conf --driver raspicam --driver-config-file=/etc/uv4l/uv4l-raspicam.conf --server-option=--editable-config-file=/etc/uv4l/uv4l-raspicam.conf

и слушал ли он

sudo netstat -tulpn 

но в списке не было записи для uv4l. Я ожидал один для порта 8080

поэтому я попробовал команду из Как настроить UV4L?

uv4l --sched-rr --mem-lock --driver raspicam \
> --width 960 --height 540 --framerate 30 \
> --encoding mjpeg --vflip --hflip
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct  6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 960x544, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Registering device node /dev/uv4l

Но все равно сервер не запускается автоматически ...

man uv4l

затем показал мне вариант

--enable-server [=arg(=required)] (=auto)
          enable the streaming server. Possible values are: 'auto' (tenta‐
          tively start the server), 'required' (exit if failing  to  start
          the  server,  only  works if --foreground is enabled), 'off' (no
          server at all).

поэтому я попробовал:

pkill uv4l
sudo uv4l --sched-rr --mem-lock --driver raspicam --encoding mjpeg --enable-server=required
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct  6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 1920x1080, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Registering device node /dev/uv4l

но все еще нет сервера, работающего на порту 8080 или elswhere. Похоже, я забыл опцию --foreground, которая указана на странице руководства:

sudo uv4l --sched-rr --mem-lock --driver raspicam --encoding mjpeg --enable-server=required --foreground
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct  6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 1920x1080, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Trying to load the the Streaming Server plug-in...
<warning> [core] libserver.so: cannot open shared object file: No such file or directory
<alert> [core] No Streaming Server detected

Теперь это четкий намек! Кажется, еще нет сервера, поэтому установите его:

sudo apt-get install uv4l-server

и попробуй еще раз:

sudo uv4l --sched-rr --mem-lock --driver raspicam --encoding mjpeg --enable-server=required --foreground
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct  6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 1920x1080, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Trying to load the the Streaming Server plug-in...
<notice> [server] HTTP/HTTPS Streaming & WebRTC Signalling Server v1.1.125 built on Mar  9 2019
<warning> [server] SSL is not enabled for the Streaming Server. Using unsecure HTTP.
<notice> [core] Streaming Server loaded!
<notice> [core] Registering device node /dev/uv4l
<notice> [server] Web Streaming Server listening on port 8080

Сервер теперь доступен по адресу http: // pi: 8080 (замените pi на ip или имя хоста вашего сервера)

После перезагрузки все работало без ввода другой команды.

Вольфганг Фаль
источник
1

UV4L теперь поддерживает трансляцию аудио & видео вещания на Jitsi Meet номер через Интернет. Никаких специальных настроек не требуется. Это так же просто, как заполнить свое имя, номер комнаты и нажать кнопку « Пуск» .

prinxis
источник
какой браузер вы используете? Jitsi поддерживает только Chrome, Chromium, Opera и Firefox. Из них только Chromium доступен на Pi. Но Chromium дает мне webkitRTCPeerConnection is not definedошибку. Я обычно использую IceWeasel для WebRTC, но это не поддерживается для Jitsi.
модуль
1
на PI нет браузера, поддерживающего WebRTC, за исключением почти сломанной поддержки в IceWeasel. Я использую это: Pi-> Jitsi Server в облаке -> мой компьютер в другом месте
prinxis
1
UV4L поддерживает аппаратную кодировку потоковой передачи H264 без задержек.
prinxis