Як можна передавати відео H.264 з модуля камери Raspberry Pi через веб-сервер?


50

Отож, я отримав камеру Raspberry сьогодні, і фотографії добре працюють.

Захоплення зображення у форматі JPEG:

raspistill -o image.jpg

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

raspivid -o video.h264

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

Як я можу цього досягти?


2
Я над цим теж працюю. Я думаю, вам потрібно додати підтримку MP4 до nginx чи щось подібне. Повідомлю вас, якщо я маю прорив.
recantha

@recantha У вас були нові прориви із потоковим відео?
Пьотр Кула

3
Найкраще рішення, яке я знайшов, базується на RaspiMJPEG Сільвана Мелхоара. Погляньте на мій блог, який містить посилання на форум Raspberry Pi Foundation, який пояснює все. ( recantha.co.uk/blog/?p=11176 )
recantha

2
Так, це виглядає приголомшливо, щоб можна було передавати на різні пристрої. Який FPS та відставання ви отримуєте ?? Мені вдалося змусити uv4l працювати досить добре з VLC та OSD. Дуже коротка та погана демонстрація. Скоро зробимо краще. Був зроблений пізно вночі після години спроб та помилок. youtu.be/LO10Ytlauag
Piotr Kula

@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 мс якось). Тому це не добре для віддалених керованих програм, де потрібні миттєві реакції, наприклад, роботів чи вертольотів.
  • Доведеться платити за стороннє програмне забезпечення, якщо ви хочете отримати більш широку підтримку браузера, яка може спалахнути.

м3u8

  • .m3u8це просто версія UTF-8 формату M3U. (.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 - нічого

Довідка: http://www.raspberrypi.org/phpBB3/viewtopic.php?p=351392&sid=5b9a46f5eea2c7a0887d2efdfa7edade#p351392

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


Що стосується прискорення компіляції ffmpeg Для того, щоб обійти низьку обчислювальну спроможність RPI та тривалий час компіляції для ffmpeg, я намагався використовувати Qemu з Wheeze, але зіткнувся з деякою перешкодою для входу в систему, і мені довелося спробувати зображення арки . Це спрацювало. Також спробував Sqeeze на зображенні Ubuntu , через VirtualBo
luboP

2
Чи є спосіб автоматично видалити старі сегменти? Через деякий час SD-карта заповнюється. Я також хотів би їх видалити, щоб я міг запустити це на tmpfs і не зіпсувати SD-карту.
Дімме

2
@Dimmme Якщо ви додасте -segment_wrap 10в якості аргументу ffmpeg, він використовуватиме максимум 10 сегментних файлів.
грегер

Хтось змусив це працювати? Файли створені, але, здається, не вистачає інформації про SPS / PPS, тому відео не відтворюватиметься в iOS Safari та VLC. Потік.m3u8 також не включався segments/при вказівці на файли сегмента, тому я скинув папку сегментів. Я щось неправильно зрозумів?
грегер

вам потрібно подати потік через двійковий фільтр PSIPS. Найновіша версія розпікаму повинна була це зробити .. але я чомусь не міг змусити його працювати без PSIPS
Пьотр Кула

23

UV4L MMAL

Завдяки коментарю від @mpromonet за оновлення драйвера Linux-Projects V4L2, який зараз реалізує MMAL дуже ефективно - але це все ще триває робота.

Дотримуйтесь цих вказівок, щоб встановити сховище linux-проекту та встановити драйвер 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, але я не можу перевірити, оскільки вони більше не роблять Winblow та Internet Explorer ... так)

MJPEG

За замовчуванням він використовує mjpeg1080p, і це дуже мляво. Я налаштував його на 800x600 кадрів і використовував щось на зразок iSpy для обробки відео. Для безпеки я отримую близько 10 кадрів в секунду на чітке відео. Це набагато краще, ніж 3 fps в 640x480 перед цим драйвером. Він працює на iPhone із Safari, Android Chrome та майже всім іншим.

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

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

H.264

Тепер це було виправлено для "потокової передачі", і нам не потрібно намагатися переглядати відео H.264 через медіаплеєр VLC . Потік є підвіконням 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

Не підтримується / не реалізується


Наразі ще немає video4linuxдрайвера. Це означає, що ми не можемо використовувати ffserver для передачі даних за допомогою /dev/video0або simlar, як веб-камера 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 30 кадрів в секунду, і ми можемо переглянути це в vlc, використовуючи --demux h264прапор. Нам все ще потрібно перекодувати це для використання на мобільних пристроях або вбудованих як mp4 / webm на веб-сторінках. Але це дійсно чудовий крок вперед ефективно та якісно. Не плутайте з "іншим" драйвером UV4L non linux-проекту, який є сміттям.
Пьотр Кула

Зауважте, що додавання: demux = 264 у методі H264 призначено для сервера vlc, а не для клієнта vlc. Таким чином, командний рядок для запуску потокової передачі на малину, щоб отримати сумісність з 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використовувати RAM для швидкості /etc/default/tmpfs- зміна RAMTMP=yes(Це зусилля для збільшення fps, але raspistill просто не може тримати себе.)
  2. Перезавантажте
  3. apt-get install git
  4. apt-get install libjpeg8-dev
  5. apt-get install libv4l-dev
  6. apt-get встановити imagemagick
  7. cd /usr/src, mkdir mjpg-streamer, cd mjpg-streamer ...
  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. Всередині makefile коментуйте всі плагіни, крім input_file та output_http, і зробіть знову. У мене було тут багато питань.
  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 або інших радіопередач.

raspistill записує зображення в один файл. Це може бути вузьким місцем. Він записує файл, 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 апаратно прискорено в raspistill, тому я дуже намагаюся зрозуміти, чому це так повільно ...

Я отримав приголомшливі 2 FPS, використовуючи %dв імені файлу. Чомусь написання файлу JPEG страшенно повільне від raspistill. Зітхнути.


дякую за обмін знаннями
user566245

10

Станом на 2017 рік (а може і раніше) raspividбільше не є бажаним методом, Pi Pix рекомендує людям використовувати 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 години), якщо ви не хочете, щоб вони займали стільки місця.


Класно - Дякуємо, що поділилися цим. Чи можете ви пояснити, чому тут потрібно використовувати багатоадресову передачу? З того, що я дізнався, це те, що багатоадресна передача використовується рідко - тому мені було цікаво, що це приносить сюди до столу? І все-таки - сценарій виглядає чудово, і я впевнений, що він допоможе багато людей. Дякую +1
Петро Кула

1
Багатоадресна передача необов’язкова - ви можете просто замінити звичайну IP-адресу, якщо хочете - але вам потрібно буде змінити команду для використання ffserverабо якусь іншу серверну систему, якщо ви хочете, щоб декілька машин відображало канал Тоді, можливо, через 2-3 клієнта (залежно від бітрейту відео) у USB-адаптера Ethernet Pi буде вичерпано пропускну здатність. За допомогою багатоадресної передачі немає необхідності запускати сервер (клієнтські машини просто вибирають, слухати трафік чи ігнорувати його), щоб у вас було тисячі машин, які відображають відео без впливу на Pi, який лише коли-небудь надсилає один відеопотік .
Malvineous

Дякую за пояснення - Але багатоадресна мережа працює лише у внутрішніх мережах? Якщо Інтернет-провайдер отримує пакет багатоадресної передачі, він зазвичай просто знімає його. Тож це не так, як ви можете просто транслювати всім в Інтернеті. Я гадаю, якщо у вас є велика внутрішня мережа, багатомовне відтворення масового потоку також може вплинути на вашу мережу? Але так ... тільки для мене, щоб переглянути потік, я б просто перейшов на вибраний 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, наприклад устрим .
  • Аудіо: Якщо ви хочете, щоб звук супроводжував ваш потік H.264, він вам потрібен в AAC . В основному Raspberry Pi занадто повільний, щоб кодувати USB мікрофон в AAC на льоту .

Тож на цій основі я думаю, що прямий ефір з Raspberry Pi може бути нормальним для тимчасового мовлення, але не для веб-камери, яка постійно працює у мережі, оскільки вона занадто велика пропускна здатність. Ви не отримаєте аудіо, і якщо ви це зробите, це буде місією синхронізації.

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


1
Ви можете контролювати пропускну здатність та роздільну здатність. Якщо його локальна потокова локальна мережа для відеоспостереження використовує, то це навіть не проблема. Мовлення через Інтернет, можливо, потребуватиме запиту та / або значно нижчої роздільної здатності. Але це інший спосіб зробити це. Дякую +1
Пьотр Кула

і як це передбачає працювати? це не для мене ... FFMPEG каже: "RTMP_Connect0, не вдалося підключити сокет. 111 (з'єднання відмовлено)"
Flash Thunder

2

Тепер UV4L підтримує пряму трансляцію аудіо та відео за допомогою WebRTC та HTML5.


просто прочитайте посилання вище ...
Strunz

Працює дуже добре!
Пьотр Кула

Як? Посилання на сторінку його прикладу порушено ...
Серін

Я пройшов підручники і можу підтвердити, що вони не працюють
Квінтін Бальсдон

Я можу підтвердити, що це працює так, як я спробував це. Instructables.com/id/Raspberry-Pi-Video-Streaming
Тіа

2

Відповідь Петра Кули, здається, на правильному шляху, але застаріла для малини.

Оновлені інструкції щодо uv4l на малиновій ділянці за адресою

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 або в іншому місці. Тож, здається, я забув варіант "--foreground", який потрібна сторінка man:

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 Rooms через Інтернет. Спеціальна конфігурація не потрібна. Це так само просто, як заповнити своє ім’я, номер та натиснути на Пуск .


який браузер ви використовуєте? Jitsi підтримують лише Chrome, Chromium, Opera та Firefox NIghtly, з яких на Pi-версії доступний лише Chromium. Але Хром дасть мені webkitRTCPeerConnection is not definedпомилку. Я зазвичай використовую IceWeasel для WebRTC, але це не підтримується для Jitsi.
modulitos

1
на PI немає браузера, що підтримує WebRTC, за винятком майже непрацездатної підтримки в IceWeasel. Я використовую це: Pi-> Jitsi Server on the Cloud -> мій ПК в іншому місці
prinxis

1
UV4L підтримує апаратне кодування H264 в прямому ефірі без затримок.
prinxis
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.