45

What steps are needed to stream RTSP from FFmpeg?

Streaming UDP is not a problem, but as I want to stream to mobile devices which can natively read RTSP streams, I couldn't find any setup which tells what exactly is needed. Do I need an RTSP streaming server like LIVE555 or can I use FFmpeg only?

My Command:

ffmpeg -i space.mp4 -vcodec libx264 -tune zerolatency -crf 18 -f rtsp -muxdelay 0.1 rtsp://192.168.1.200:1234

I get an Input/Output error.

Do I need a SDP description to use RTSP? And if yes where do I have to put it?

Jeankowkow
  • 814
  • 13
  • 33
user1767754
  • 23,311
  • 18
  • 141
  • 164
  • ffmpeg itself can stream over RTP. Better than UDP, but you need to agree on the format, which is why RTP is usually managed via RTSP. But `ffmpeg ... -f rtp rtp://destination/streamID:54321` will send a continuous RTP stream to port 54321 on 'destination'. – MSalters Feb 27 '17 at 14:11

4 Answers4

29

FWIW, I was able to setup a local RTSP server for testing purposes using simple-rtsp-server and ffmpeg following these steps:

  1. Create a configuration file for the RTSP server called rtsp-simple-server.yml with this single line:
    protocols: [tcp]
    
  2. Start the RTSP server as a Docker container:
    $ docker run --rm -it -v $PWD/rtsp-simple-server.yml:/rtsp-simple-server.yml -p 8554:8554 aler9/rtsp-simple-server
    
  3. Use ffmpeg to stream a video file (looping forever) to the server:
    $ ffmpeg -re -stream_loop -1 -i test.mp4 -f rtsp -rtsp_transport tcp rtsp://localhost:8554/live.stream
    

Once you have that running you can use ffplay to view the stream:

$ ffplay -rtsp_transport tcp rtsp://localhost:8554/live.stream

Note that simple-rtsp-server can also handle UDP streams (i.s.o. TCP) but that's tricky running the server as a Docker container.

Rob van der Leek
  • 1,486
  • 15
  • 13
  • 2
    I’m completely blown away with how easy `simple-rtsp-server` is to configure, yet how powerful it is. Even includes a HLS server at no additional cost. This thing is awesome, thanks for suggesting it! – scy Aug 16 '21 at 19:29
28

You can use FFserver to stream a video using RTSP.

Just change console syntax to something like this:

ffmpeg -i space.mp4 -vcodec libx264 -tune zerolatency -crf 18 http://localhost:1234/feed1.ffm

Create a ffserver.config file (sample) where you declare HTTPPort, RTSPPort and SDP stream. Your config file could look like this (some important stuff might be missing):

HTTPPort 1234
RTSPPort 1235

<Feed feed1.ffm>
        File /tmp/feed1.ffm
        FileMaxSize 2M
        ACL allow 127.0.0.1
</Feed>

<Stream test1.sdp>
    Feed feed1.ffm
    Format rtp
    Noaudio
    VideoCodec libx264
    AVOptionVideo flags +global_header
    AVOptionVideo me_range 16
    AVOptionVideo qdiff 4
    AVOptionVideo qmin 10
    AVOptionVideo qmax 51
    ACL allow 192.168.0.0 192.168.255.255
</Stream>

With such setup you can watch the stream with i.e. VLC by typing:

rtsp://192.168.0.xxx:1235/test1.sdp

Here is the FFserver documentation.

Jeankowkow
  • 814
  • 13
  • 33
grzebyk
  • 1,024
  • 1
  • 15
  • 26
7

Another streaming command I've had good results with is piping the ffmpeg output to vlc to create a stream. If you don't have these installed, you can add them:

sudo apt install vlc ffmpeg

In the example I use an mpeg transport stream (ts) over http, instead of rtsp. I've tried both, but the http ts stream seems to work glitch-free on my playback devices.

I'm using a video capture HDMI>USB device that sets itself up on the video4linux2 driver as input. Piping through vlc must be CPU-friendly, because my old dual-core Pentium CPU is able to do the real-time encoding with no dropped frames. I've also had audio-sync issues with some of the other methods, where this method always has perfect audio-sync.

You will have to adjust the command for your device or file. If you're using a file as input, you won't need all that v4l2 and alsa stuff. Here's the ffmpeg|vlc command:

ffmpeg -thread_queue_size 1024 -f video4linux2 -input_format mjpeg -i /dev/video0 -r 30 -f alsa -ac 1 -thread_queue_size 1024 -i hw:1,0 -acodec aac -vcodec libx264 -preset ultrafast -crf 18 -s hd720 -vf format=yuv420p -profile:v main -threads 0 -f mpegts -|vlc -I dummy - --sout='#std{access=http,mux=ts,dst=:8554}'

For example, lets say your server PC IP is 192.168.0.10, then the stream can be played by this command:

ffplay http://192.168.0.10:8554
#or
vlc http://192.168.0.10:8554

UPDATE: Here is a command to use VLC for rtsp, instead of using the rtsp-simple-server:

ffmpeg -thread_queue_size 1024 -f video4linux2 -input_format mjpeg -video_size 1280x720 -r 30 -i /dev/video0 -f alsa -thread_queue_size 1024 -i plughw:CARD=MS2109,DEV=0 -acodec mp2 -vcodec libx264 -preset ultrafast -crf 20 -s hd720 -vf format=yuv420p -profile:v main -f mpegts -|vlc -I dummy - --sout='#rtp{sdp=rtsp://:8554/} --sout-all --sout-keep'

If your PC ip is 192.168.0.10, then the rtsp stream is played by this command:

vlc rtsp://192.168.0.10:8554/
Ken H
  • 331
  • 2
  • 10
  • That was helpful, however with your commands you're not using RTSP, you're just using HTTP! By using `--sout='#rtp{dst=YOURIP,port=1234,sdp=rtsp://YOURIP:8080/test.sdp}'` instead you can stream with RTSP, however in my tests this worked for VLC clients, but I have not found a way that works for all kinds of RTSP clients. Particularly on some clients I get an error `Response failed: RTSP/1.0 461 Unsupported transport`. Maybe VLC RTSP server does not support RTSP with TCP transport? – user643011 Oct 12 '21 at 08:03
  • 1
    I haven't been able to make VLC work with RTSP. If I want RTSP, I use the rtsp-simple-server that is discussed in another answer. – Ken H Oct 14 '21 at 14:17
  • Thanks! Yes, I also tried `rtsp-simple-server` in the mean time and it works great! – user643011 Oct 16 '21 at 08:57
4

An alternative that I used instead of FFServer was Red5 Pro. On Ubuntu, I used this line:

ffmpeg -f pulse -i default -f video4linux2 -thread_queue_size 64 -framerate 25 -video_size 640x480 -i /dev/video0 -pix_fmt yuv420p -bsf:v h264_mp4toannexb -profile:v baseline -level:v 3.2 -c:v libx264 -x264-params keyint=120:scenecut=0 -c:a aac -b:a 128k -ar 44100 -f rtsp -muxdelay 0.1 rtsp://localhost:8554/live/paul
Cody Gray - on strike
  • 239,200
  • 50
  • 490
  • 574
Paul Gregoire
  • 9,715
  • 11
  • 67
  • 131