You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
v4l2rtspserver/README.md

179 lines
8.1 KiB
Markdown

6 years ago
[![CircleCI](https://circleci.com/gh/mpromonet/v4l2rtspserver.svg?style=shield)](https://circleci.com/gh/mpromonet/v4l2rtspserver)
5 years ago
[![CirusCI](https://api.cirrus-ci.com/github/mpromonet/v4l2rtspserver.svg?branch=master)](https://cirrus-ci.com/github/mpromonet/v4l2rtspserver)
4 years ago
[![Snap Status](https://snapcraft.io//v4l2-rtspserver/badge.svg)](https://snapcraft.io/v4l2-rtspserver)
5 years ago
[![GithubCI](https://github.com/mpromonet/v4l2rtspserver/workflows/C/C++%20CI/badge.svg)](https://github.com/mpromonet/v4l2rtspserver/actions)
1 month ago
[![Codacy Badge](https://app.codacy.com/project/badge/Grade/4602f447d1c1408d865ebb4ef68f12f1)](https://app.codacy.com/gh/mpromonet/v4l2rtspserver/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
[![Coverity Scan Build Status](https://scan.coverity.com/projects/4644/badge.svg)](https://scan.coverity.com/projects/4644)
[![Coverage Status](https://coveralls.io/repos/github/mpromonet/v4l2rtspserver/badge.svg?branch=master)](https://coveralls.io/github/mpromonet/v4l2rtspserver?branch=master)
3 weeks ago
[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/8853/badge)](https://www.bestpractices.dev/projects/8853)
[![Release](https://img.shields.io/github/release/mpromonet/v4l2rtspserver.svg)](https://github.com/mpromonet/v4l2rtspserver/releases/latest)
[![Download](https://img.shields.io/github/downloads/mpromonet/v4l2rtspserver/total.svg)](https://github.com/mpromonet/v4l2rtspserver/releases/latest)
6 years ago
[![Docker Pulls](https://img.shields.io/docker/pulls/mpromonet/v4l2rtspserver.svg)](https://hub.docker.com/r/mpromonet/v4l2rtspserver/)
1 month ago
[![Openwrt](https://img.shields.io/badge/OpenWRT-00B5E2?logo=OpenWrt)](https://openwrt.org/packages/pkgdata/v4l2rtspserver)
10 years ago
v4l2rtspserver
11 years ago
====================
7 years ago
This is an streamer feed from :
7 years ago
- an Video4Linux device that support H264, HEVC, JPEG, VP8 or VP9 capture.
- an ALSA device that support PCM S16_BE, S16_LE, S32_BE or S32_LE
7 years ago
The RTSP server support :
- RTP/UDP unicast
- RTP/UDP multicast
- RTP/TCP
- RTP/RTSP/HTTP
6 years ago
The HTTP server support (available using -S option for capture format that could be muxed in Transport Stream):
- HLS
- MPEG-DASH
10 years ago
Dependencies
10 years ago
------------
- liblivemedia-dev [License LGPL](http://www.live555.com/liveMedia/) > live.2012.01.07 (need StreamReplicator)
8 years ago
- libv4l2cpp [Unlicense](https://github.com/mpromonet/libv4l2cpp/blob/master/LICENSE)
7 years ago
- liblog4cpp5-dev [License LGPL](http://log4cpp.sourceforge.net/#license) (optional)
If liblog4cpp5-dev is not present, a simple log using std::cout is used.
- libasound2-dev Licence LGPL (optional)
If libasound2-dev is not present in the build environment, there will have no audio support.
11 years ago
Usage
-----
8 years ago
./v4l2rtspserver [-v[v]] [-Q queueSize] [-O file] \
[-I interface] [-P RTSP port] [-p RTSP/HTTP port] [-m multicast url] [-u unicast url] [-M multicast addr] [-c] [-t timeout] \
9 years ago
[-r] [-s] [-W width] [-H height] [-F fps] [device1] [device2]
-v : verbose
-vv : very verbose
11 years ago
-Q length: Number of frame queue (default 10)
-O output: Copy captured frame to a file or a V4L2 device
10 years ago
RTSP options :
-I addr : RTSP interface (default autodetect)
11 years ago
-P port : RTSP port (default 8554)
-p port : RTSP over HTTP port (default 0)
-U user:password : RTSP user and password
-R realm : use md5 password 'md5(<username>:<realm>:<password>')
-u url : unicast url (default unicast)
-m url : multicast url (default multicast)
9 years ago
-M addr : multicast group:port (default is random_address:20000)
-c : don't repeat config (default repeat config before IDR frame)
-t secs : RTCP expiration timeout (default 65)
7 years ago
-S[secs] : HTTP segment duration (enable HLS & MPEG-DASH)
2 years ago
-x <sslkeycert> : enable RTSPS & SRTP
10 years ago
V4L2 options :
-r : V4L2 capture using read interface (default use memory mapped buffers)
-w : V4L2 capture using write interface (default use memory mapped buffers)
4 years ago
-B : V4L2 capture using blocking mode (default use non-blocking mode)
-s : V4L2 capture using live555 mainloop (default use a separated reading thread)
-f : V4L2 capture using current capture format (-W,-H are ignored)
-fformat : V4L2 capture using format (-W,-H are used)
11 years ago
-W width : V4L2 capture width (default 640)
-H height: V4L2 capture height (default 480)
-F fps : V4L2 capture framerate (default 25, 0 disable setting framerate)
5 years ago
-G <w>x<h>[x<f>] : V4L2 capture format (default 0x0x25)
ALSA options :
-A freq : ALSA capture frequency and channel (default 44100)
-C channels: ALSA capture channels (default 2)
Update README.md default alsa capture is S16_LE Although the default RTP payload stream is S16_BE the "v4l2rtspserver" defaults to S16_LE while not specifying any format shown with the following use cases in this post. See specifically `./v4l2rtspserver -F 25 -W 1280 -H 720 -P 8555 /dev/video0,virtmicb #noise, default is LE>BE!!!`. This can be a bug in code or mistake in documentation you may choose what/where to fix :-). Reproducable steps: Add the following code to your `~/.asoundrc` that's in your `/home/pi` folder, `/etc/asound.conf` is not used in my example! ``` pcm.virtmica { type file format "raw" file "/dev/null" infile "/home/pi/music16le.raw" slave.pcm "default" } pcm.virtmicb { type file format "raw" file "/dev/null" infile "/home/pi/music16be.raw" slave.pcm "default" } pcm.virtmicc { type file format "raw" file "/dev/null" infile "/home/pi/music32le.raw" slave.pcm "default" } pcm.virtmicd { type file format "raw" file "/dev/null" infile "/home/pi/music32be.raw" slave.pcm "default" } ``` Create some raw pcm music sources with `ffmpeg`, which I use a minute(s) long mp3 music file for (16bit 44100Hz stereo) in my example. Use filenames that resemble code above and use long enough samples as in minutes not seconds, since as soon as the v4l2rtspserver is started the music file starts playing and will not loop! ``` sudo apt-get install ffmpeg ffmpeg -i music.mp3 -f s16le -acodec pcm_s16le /home/pi/music16le.raw ffmpeg -i music.mp3 -f s16be -acodec pcm_s16be /home/pi/music16be.raw ffmpeg -i music.mp3 -f s32le -acodec pcm_s32le /home/pi/music32le.raw ffmpeg -i music.mp3 -f s32be -acodec pcm_s32be /home/pi/music32be.raw ``` Test `v4l2rtspserver` (before commit 41589c8) with the virtual alsa devices and sample files you just made: ``` ./v4l2rtspserver -F 25 -W 1280 -H 720 -P 8555 /dev/video0,virtmica #you hear music ./v4l2rtspserver -F 25 -W 1280 -H 720 -P 8555 /dev/video0,virtmica -a S16_LE #you hear music ./v4l2rtspserver -F 25 -W 1280 -H 720 -P 8555 /dev/video0,virtmica -a S16_BE #noise ./v4l2rtspserver -F 25 -W 1280 -H 720 -P 8555 /dev/video0,virtmicb #noise, default is LE>BE!!! ./v4l2rtspserver -F 25 -W 1280 -H 720 -P 8555 /dev/video0,virtmicb -a S16_LE #noise ./v4l2rtspserver -F 25 -W 1280 -H 720 -P 8555 /dev/video0,virtmicb -a S16_BE #you hear music ./v4l2rtspserver -F 25 -W 1280 -H 720 -P 8555 /dev/video0,virtmicc #slow/offpitch music :-) ./v4l2rtspserver -F 25 -W 1280 -H 720 -P 8555 /dev/video0,virtmicc -a S32_LE #recognizable interupted music with gaps ./v4l2rtspserver -F 25 -W 1280 -H 720 -P 8555 /dev/video0,virtmicc -a S32_BE #noise with gaps ./v4l2rtspserver -F 25 -W 1280 -H 720 -P 8555 /dev/video0,virtmicd #noise ./v4l2rtspserver -F 25 -W 1280 -H 720 -P 8555 /dev/video0,virtmicd -a S32_LE #noise with gaps ./v4l2rtspserver -F 25 -W 1280 -H 720 -P 8555 /dev/video0,virtmicd -a S32_BE #recognizable interupted music with gaps ```
6 years ago
-a fmt : ALSA capture audio format (default S16_LE)
7 years ago
device : V4L2 capture device and/or ALSA device (default /dev/video0)
7 years ago
When audio support is not present, ALSA options are not printed running with `-h` argument.
7 years ago
Authentification is enable when almost one user is defined. You can configure credentials :
* using plain text password:
-U foo:bar -U admin:admin
* using md5 password:
-R myrealm -U foo:$(echo -n foo:myrealm:bar | md5sum | cut -d- -f1) -U admin:$(echo -n admin:myrealm:admin | md5sum | cut -d- -f1)
It is possible to compose the RTSP session is different ways :
7 years ago
* v4l2rtspserver /dev/video0 : one RTSP session with RTP video capturing V4L2 device /dev/video0
* v4l2rtspserver ,default : one RTSP session with RTP audio capturing ALSA device default
* v4l2rtspserver /dev/video0,default : one RTSP session with RTP audio and RTP video
* v4l2rtspserver /dev/video0 ,default : two RTSP sessions first one with RTP video and second one with RTP audio
* v4l2rtspserver /dev/video0 /dev/video1 : two RTSP sessions with an RTP video
7 years ago
* v4l2rtspserver /dev/video0,/dev/video0 : one RTSP session with RTP audio and RTP video (ALSA device associatd with the V4L2 device)
8 years ago
Build
-------
- Build
cmake . && make
6 years ago
If live555 is not installed it will download it from live555.com and compile it. If asound is not installed, ALSA will be disabled.
8 years ago
If it still not work you will need to read Makefile.
7 years ago
- Install (optional)
8 years ago
7 years ago
sudo make install
8 years ago
7 years ago
- Packaging (optional)
8 years ago
cpack .
Using Raspberry Pi Camera
-------------------------
7 years ago
This RTSP server works with Raspberry Pi camera using :
4 years ago
- the opensource V4L2 driver bcm2835-v4l2
8 years ago
sudo modprobe -v bcm2835-v4l2
4 years ago
8 years ago
7 years ago
Using v4l2loopback
8 years ago
-----------------------
For camera providing uncompress format [v4l2tools](https://github.com/mpromonet/v4l2tools) can compress the video to an intermediate virtual V4L2 device [v4l2loopback](https://github.com/umlaeute/v4l2loopback):
2 years ago
/dev/video0 (camera device)-> v4l2compress -> /dev/video10 (v4l2loopback device) -> v4l2rtspserver
8 years ago
This workflow could be set using :
modprobe v4l2loopback video_nr=10
3 years ago
v4l2compress -fH264 /dev/video0 /dev/video10 &
8 years ago
v4l2rtspserver /dev/video10 &
7 years ago
Playing HTTP streams
8 years ago
-----------------------
7 years ago
When v4l2rtspserver is started with '-S' arguments it also give access to streams through HTTP.
These streams could be played :
8 years ago
* for MPEG-DASH with :
MP4Client http://..../unicast.mpd
7 years ago
8 years ago
* for HLS with :
vlc http://..../unicast.m3u8
gstreamer-launch-1.0 playbin uri=http://.../unicast.m3u8
8 years ago
7 years ago
It is now possible to play HLS url directly from browser :
* using Firefox installing [Native HLS addons](https://addons.mozilla.org/en-US/firefox/addon/native_hls_playback)
* using Chrome installing [Native HLS playback](https://chrome.google.com/webstore/detail/native-hls-playback/emnphkkblegpebimobpbekeedfgemhof)
There is also a small HTML page that use hls.js.
Using Docker image
===============
You can start the application using the docker image :
docker run -p 8554:8554 -it mpromonet/v4l2rtspserver
You can expose V4L2 devices from your host using :
docker run --device=/dev/video0 -p 8554:8554 -it mpromonet/v4l2rtspserver
The container entry point is the v4l2rtspserver application, then you can :
* get the help using :
docker run -it mpromonet/v4l2rtspserver -h
6 years ago
* run the container specifying some paramters :
5 years ago
docker run --device=/dev/video0 -p 8554:8554 -it mpromonet/v4l2rtspserver -u "" -H640 -W480