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

Итак, сегодня у меня есть камера с малиной, и у меня все в порядке.

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

raspistill -o image.jpg

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

raspivid -o video.h264

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

Как я могу это достичь?

43 голоса | спросил ppumkin 16 Mayam13 2013, 01:46:50

7 ответов


28

Потоковая передача с помощью HLS

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

ПРОФИ

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

CONS

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

m3u8

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

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

Установка

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

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

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

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

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

#! /Bin /Баш

База = «/данные /живые»

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 \
    "сегменты /% 08d.ts"


ловушка "rm stream.m3u8 сегментов /*. ts" EXIT

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

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

& л; HTML >
  & Lt; & головка GT;
    & Lt; & название GT; PiVid & л; /& название GT;
  & Lt; /головка >
  & Л; тело >
    <video controls = "controls" width = "1280" height = "720" autoplay = "autoplay">
      <источник src = "stream.m3u8" type = "application /x-mpegURL" />
    & Lt; /видео >
  & Lt; /тело >
& Lt; /HTML >

Поддержка

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

Справка: http://www.raspberrypi.org/phpBB3/viewtopic .php р = 351392 & амп;? SID = 5b9a46f5eea2c7a0887d2efdfa7edade # p351392

Исходный код: https://github.com/AndyA/psips/blob/master/примеры /hls.sh

ответил bobx 14 MarpmMon, 14 Mar 2016 13:37:56 +03002016-03-14T13:37:56+03:0001 2016, 13:37:56
19

UV4L MMAL

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

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

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

HTML 5

Это то, чего мы все ждали (называется WebRTC ) и благодаря новому драйверу он отлично работает (на малине 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 -

# Добавьте в файл следующую строку: /etc/apt/sources.list
# deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/wheezy main

Обновление sudo apt-get
sudo apt-get install uv4l uv4l-raspicam

sudo apt-get install uv4l-raspicam-extras

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

sudo apt-get install uv4l-webrtc

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

Http: //малина: 8080 /

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

MJPEG

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

Http: //raspberrypi: 8080 /Поток /video.mjpeg

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

H.264

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

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

Http: //raspberrypi: 8080 /Поток /video.h264

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

RTSP /RTMP /RTP

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

http://www.linux-projects.org/uv4l/tutorials /RTSP-сервер /

HLS

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


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

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

ответил ppumkin 27 Maypm13 2013, 23:16:01
8

Потоковая передача с помощью MJPEG

U4VL

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

http://www.linux-projects.org/uv4l/tutorials /потоковый сервер /

Веб-интерфейс малины Pi Cam

Хороший проект silvanmelchior , который развертывает веб-сервер, похожий на dvr, многоцелевой потоковый сервер. Требуется дополнительная информация

https://github.com/silvanmelchior/RPi_Cam_Web_Interface

Унаследованный метод

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

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

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

Это почти мгновенно, но не ожидайте получить более 1,5 кбит /с. Это означает, что raspistill является чрезвычайно SLOOOW! Использование функции временной задержки, установленной на 100 мс, которая должна давать нам 10 фут /с, не работает, потому что raspistill просто задыхается и имеет серьезные проблемы с производительностью внутри себя.

  1. Измените /tmp на использование RAM для скорости /etc /default /tmpfs - change RAMTMP = yes (Это попытка увеличить fps, но raspistill просто не может удержаться от себя.)
  2. Reboot
  3. apt-get install git
  4. apt-get install libjpeg8-dev
  5. apt-get install libv4l-dev
  6. apt-get install imagemagick
  7. cd /usr /src, mkdir mjpg-streamer, cd mjpg-streamer ...
  8. git clone https://github.com/engine12/mjpg-streamer.git
  9. сделать USE_LIBV4L2 = true очистить все
  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, и сделайте еще раз. Здесь у меня было много проблем.
  14. Скопируйте двоичный код mjpg_streamer и его плагины input _ *. so и output _ *, поэтому в /usr /local /бен. В противном случае запустите его прямо из каталога 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-адрес>: 8080
  20. Вот несколько вариантов, наслаждайтесь «живым» потоком старомодным способом ... поддерживаемым большинством браузеров - современными, старыми и экспериментальными.

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

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

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

Единственное, о чем я могу думать, это использовать raspivid, который был отправлен в FFmpeg , который будет создавать файлы JPEG для нас - мне нужно попробовать это, и, возможно, это намного быстрее, чем usign 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 \
    Поток% d.jpg

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

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

ответил ppumkin 27 Maypm13 2013, 23:16:01
7

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

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

#! /Bin /ш

# Используйте V4L2 (предпочтительный) вместо raspivid
# exposure_dynamic_framerate = 1 (raspivid --fps 0) - уменьшить частоту кадров /увеличить экспозицию при слабом освещении
# scene_mode = 8 (raspivid - ночная экспозиция) - разрешить уменьшение частоты кадров для увеличения экспозиции
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 "Малина 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 = понедельник и т. Д.), За которым следует T, а затем время. Он запускает новый файл каждые 15 минут.

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

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

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

ответил Malvineous 20 MarpmMon, 20 Mar 2017 14:54:02 +03002017-03-20T14:54:02+03:0002 2017, 14:54:02
3

Мне удалось перевести с моей малины 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

Некоторые примечания:

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

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

ответил hendry 3 AM00000080000003631 2013, 08:36:36
2

UV4L теперь поддерживает live Audio & Потоковое видео с помощью WebRTC и HTML5.

ответил Strunz 30 MarpmMon, 30 Mar 2015 18:39:27 +03002015-03-30T18:39:27+03:0006 2015, 18:39:27
0

UV4L теперь поддерживает live audio & видео трансляция в Jitsi Meet Rooms через Интернет. Специальная настройка не требуется. Это так же просто, как заполнить свое имя, комнату и щелкнуть по Пуск .

ответил prinxis 15 PM00000090000003131 2015, 21:37:31

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132