Итак, сегодня я приобрел Raspberry Camera и работал нормально.
Захват изображения в формате JPEG:
raspistill -o image.jpg
Захват 5-секундного видео в формате H.264 :
raspivid -o video.h264
Я не хочу устанавливать какие-либо дополнительные приложения, поскольку хочу использовать доступный HTML5 . Так как Chrome / Safari имеет встроенные декодеры для H.264, я просто хочу, чтобы мой браузер указывал на URL и смотрел поток.
Как мне этого добиться?
webcam
streaming-video
camera
Петр Кула
источник
источник
Ответы:
Потоковое с HLS
Запатентованный метод Apple потокового видео в реальном времени. Он называется HTTP Live Streaming (HLS) и поддерживается только технологией Apple. Google (Chromium / YouTube) использует свою собственную реализацию, называемую dash mpeg, и все остальные либо сбиты с толку, либо используют H.264, инкапсулированный в MP4 .
ПРОФИ
.m3u8
плейлистыМИНУСЫ
m3u8
.m3u8
это просто версия формата M3U в UTF-8 . (Файлы .m3u могут иметь различные кодировки.) Некоторые люди утверждают, что переименование .m3u8 в .m3u будет работать, как и ожидалось, во всех браузерах HTML5. Я попробовал это, и это не сработало для меня.Концепция этой потоковой передачи заключается в том, что короткие сегменты файлов длиной не менее 5 секунд (в данном примере - возможно, есть новые способы его ускорения) записываются и сохраняются в надлежащий файл. Файл списка воспроизведения обновляется новым именем файла, и клиент всегда опрашивает этот список воспроизведения и загружает самый последний файл. Есть некоторые механизмы, необходимые для плавного объединения видео на клиенте. Вот почему другие разработчики не хотят реализовывать это, потому что это требует больших усилий и не соответствует стандартам HTML5 (даже при том, что не существует надлежащего стандарта HTML5 для прямых трансляций? Эхх, вздох ).
Установка
Вам нужно скомпилировать
ffmpeg
- не использоватьapt-get install
для FFmpegЭто может занять до 5 часов - Он должен быть версии 1.1 или выше, поддерживающий сегмент потокового. Вы можете использовать это для клонирования и компиляции.
/usr/share/nginx/www/
Создайте файл сценария Bash, который называется что-то вроде
video.sh
, применитеchmod +x
к нему и вставьте его. Поменяйте базовую папку так, чтобы где-нибудь ваш HTTP- сервер жил . Я использовалnginx
,/usr/share/nginx/www/
Создайте файл HTML, который будет загружать плейлист
Служба поддержки
Ссылка: http://www.raspberrypi.org/phpBB3/viewtopic.php?p=351392&sid=5b9a46f5eea2c7a0887d2efdfa7edade#p351392
Оригинальный код: https://github.com/AndyA/psips/blob/master/examples/hls.sh
источник
-segment_wrap 10
в качестве аргумента ffmpeg, он будет использовать до 10 файлов сегмента.segments/
при указании файлов сегментов, поэтому я удалил папку сегментов. Я что-то не так понял?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 :
Затем на вашем Raspberry Pi 2 установите этот WebRTC (для Raspberry Pi 1 прочитайте связанный сайт для других вариантов)
Перезапустите все драйверы и перейдите к
Теперь у вас есть высококачественная потоковая передача видео с низкой задержкой прямо в современный браузер, такой как Chrome или Firefox. (Может быть, Safari, но я не могу проверить, потому что они больше не делают Winblows и Internet Explorer ... да)
MJPEG
По умолчанию он использует
mjpeg
1080p, и он очень вялый. Я настроил его на размер кадра 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
Не поддерживается / реализовано
Там нетvideo4linux
Availabe водителя еще. Это означает, что мы не можем использовать ffserver для потоковой передачи данных с использованием/dev/video0
или одновременной работы с USB-камерой.Вот почему так сложно найти правильную потоковую трансляцию для браузеров HTML5.
Gstreamer
(не HTML5)<OBJECT ...
:) (отложено)источник
video4linux
драйвер, официальный драйвер V4L2 bcm2835-v4l2 и драйвер V4L2 пользовательского пространства [ linux-projects.org/modules/sections/…--demux h264
флаг. Нам все еще нужно перекодировать это для использования на мобильных устройствах или встраивать в виде mp4 / webm на веб-страницах. Но это действительно большой шаг вперед по качеству и качеству. Не путайте с «другим» драйвером UV4L, не являющимся проектом linux, который является мусором./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
Потоковое с 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
просто затягивается и имеет серьезные проблемы с производительностью внутри себя./tmp
чтобы использовать оперативную память для/etc/default/tmpfs
изменения скоростиRAMTMP=yes
(это попытка увеличить частоту кадров в секунду, но Rasistill просто не может справиться с самим собой.)/usr/src
, mkdir mjpg-стример, cd mjpg-стример ...git clone https://github.com/engine12/mjpg-streamer.git
make USE_LIBV4L2=true clean all
sudo ln -s /usr/include/libv4l1-videodev.h /usr/include/linux/videodev.h
sudo ln -s /usr/include/lib4l2.h /usr/include/linux/lib4l2.h
mjpg_streamer
и его плагиновinput_*.so
иoutput_*.so
к/usr/local/bin
. В противном случае, запустите его прямо из каталога src.mkdir /tmp/stream
raspistill -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &
LD_LIBRARY_PATH=./ ./mjpg_streamer -i "input_file.so -f /tmp/stream" -o "output_http.so -w ./www"
(запустите это там, где находятся бинарный файл и плагины)http://<IP-address>:8080
Я боролся за то, чтобы скомпилировать его в течение примерно 5 часов ... вздох , но я думаю, что я буду использовать это, поскольку я могу получить доступ к потоку с любого телефона и любого браузера. Мне просто нужно подождать, пока у нас не появятся лучшие водители ... Еще год или два. :(
Независимо от того, какое качество я пробую, я получаю не быстрее или не медленнее, чем 1 кадр / с, используя стрим. Я использовал 720p и 1080p, и только качество изображения улучшается, но fps не имеет значения в локальной сети. Я предполагаю, что меньшие настройки помогут с WAN / 3G или другими радиопередачами.
Rasistill записывает изображение в один файл. Это может быть узким местом. Он записывает файл, mjpg strreamer читает его и удаляет, вызывая блокировку ввода-вывода, поэтому raspistill не может записать в файл.
Единственное, о чем я могу думать, - это использовать raspivid по каналу FFmpeg , который создаст файлы JPEG для нас - мне нужно попробовать это, и, возможно, это намного быстрее, чем использовать raspistill. Мне удалось получить 25 кадров в секунду с шокирующим качеством, и это было задержано примерно на 10 секунд ... Изменение настроек дало мне около 3 кадров в секунду, но процессор на 100%. Для обработки видеопотока не используется оборудование ...
Я также читал и обнаружил, что мы можем использовать
%d
в имени выходного файла raspistill. Интересно, увеличит ли это fps. Также JPG кодирование аппаратно ускорено, поэтому я действительно пытаюсь понять, почему это так медленно ...Я получил ошеломляющие 2 FPS, используя
%d
в имени файла. По какой-то причине запись файла JPEG ужасно медленна от расписта. Вздох.источник
По состоянию на 2017 год (или, возможно, ранее)
raspivid
более не является предпочтительным методом, так как разработчики Pi рекомендуют использовать вместо него V4L2.Таким образом, этот метод позволяет вам передавать H264 через RTP, используя V4L2 вместо
raspivid
. Я заметил, что этот метод приводит к меньшему количеству пропусков и допускает более высокий битрейт:Этот скрипт многоадресно передает видео, и его можно просмотреть на другом компьютере в локальной сети с помощью команды, подобной этой:
-sync ext
заставляет видео воспроизводиться настолько быстро, насколько это возможно, поэтому оно будет работать в режиме реального времени, в отличие от запуска его с фиксированной частотой кадров и отставанием, если Pi захватывает кадры быстрее, чем это. С этим методом все еще есть некоторая задержка, но не хуже, чем у другихraspivid
методов.(Совет: если вы подключены к маршрутизатору или коммутатору, поддерживающему IGMP, убедитесь, что
224.0.0.0/4
на вашей машине не установлен межсетевой экран, в противном случае, когда маршрутизатор спросит ваш ПК, хочет ли он какой-либо многоадресный трафик, ПК никогда не ответит, и вы никогда не увидите любое видео.)Запись на диск
Как я упоминал запись в комментариях ниже, я остановлюсь на этом здесь. Вы можете использовать такую команду для записи сетевого потока на диск:
Посмотрите на
man strftime
значения%
символов в имени файла. В этом примере используется номер дня (0 = воскресенье, 1 = понедельник и т. Д.), За которым следует a,T
а затем время. Он запускает новый файл каждые 15 минут.Для ясности, эта команда записи предназначена для запуска на удаленном ПК (не на самом Pi), хотя, вероятно, она будет работать и на Pi (не проверено).
Поскольку каждые 15 минут вы получаете новый файл с указанием дня и времени в имени файла, это означает, что через неделю вы начнете получать сгенерированные имена файлов, которые уже были использованы, в результате чего самые старые файлы будут перезаписаны. Другими словами, у вас получится развернутая петля с кадрами прошлой недели. Это идеально подходит для камеры видеонаблюдения, где вам редко придется возвращаться назад более недели.
В качестве дополнительного примечания это дает файлы размером около 500 ГБ, поэтому вы можете скорректировать битрейт, разрешение или перезаписать файлы раньше (скажем, каждые 24 часа), если не хотите, чтобы они занимали так много места.
источник
ffserver
или какую-либо другую серверную систему, если вы хотите, чтобы несколько каналов отображали канал. Затем через 2-3 клиента (в зависимости от скорости передачи видео) USB-адаптеру Pi Ethernet не хватит пропускной способности. С многоадресной рассылкой нет необходимости запускать сервер (клиентские машины просто выбирают, слушать ли трафик или игнорировать его), так что вы можете иметь тысячи машин, отображающих видео без влияния на Pi, который когда-либо отправляет только один видеопоток ,Мне удалось выполнить потоковую передачу с моего Raspberry Pi на веб-сервер с помощью встроенного модуля nginx-rtmp .
Чтобы избежать неприятностей
ffmpeg
, я рекомендую распространяемый дистрибутив, такой как Arch Linux Arm .Некоторые заметки:
Поэтому, на этом основании, я думаю, что прямая трансляция с Raspberry Pi могла бы подойти для временной трансляции, но не для постоянно включенной веб-камеры, поскольку она слишком требовательна к пропускной способности. Вы не получите аудио, и если вы это сделаете, это будет миссия для синхронизации.
Вы можете записывать аудио более эффективно отдельно, одновременно с записью видео. Затем, возможно, позже подключите аудиопоток, преобразуйте его в WebM и поместите в httpd в виде статического файла с тегом HTML-видео. Рабочий процесс довольно неловкий, хотя это лучшее, что я могу придумать для эффективной трансляции, которая будет безболезненно работать в разных браузерах.
источник
UV4L теперь поддерживает потоковое аудио и видео с WebRTC и HTML5.
источник
Ответ Петра Кула, кажется, находится на правильном пути, но устарел на малиновом участке.
Обновленные инструкции для uv4l на Raspberry stretch на
https://www.linux-projects.org/uv4l/installation/
Вы можете настроить параметры uv4l через /etc/uv4l/uv4l-raspicam.conf, а затем перезапустить службу с помощью
В моем случае все не работает "из коробки" (если забыли установить uv4l-сервер ...). Следующие комментарии могут помочь вам отладить подобные проблемы.
Я проверил, что сервер работает с:
и слушал ли он
но в списке не было записи для uv4l. Я ожидал один для порта 8080
поэтому я попробовал команду из Как настроить UV4L?
Но все равно сервер не запускается автоматически ...
затем показал мне вариант
поэтому я попробовал:
но все еще нет сервера, работающего на порту 8080 или elswhere. Похоже, я забыл опцию --foreground, которая указана на странице руководства:
Теперь это четкий намек! Кажется, еще нет сервера, поэтому установите его:
и попробуй еще раз:
Сервер теперь доступен по адресу http: // pi: 8080 (замените pi на ip или имя хоста вашего сервера)
После перезагрузки все работало без ввода другой команды.
источник
UV4L теперь поддерживает трансляцию аудио & видео вещания на Jitsi Meet номер через Интернет. Никаких специальных настроек не требуется. Это так же просто, как заполнить свое имя, номер комнаты и нажать кнопку « Пуск» .
источник
webkitRTCPeerConnection is not defined
ошибку. Я обычно использую IceWeasel для WebRTC, но это не поддерживается для Jitsi.