从FFmpeg传输RTSP需要哪些步骤?
流媒体UDP不是问题,但由于我想流媒体到移动设备上,这些设备可以原生读取RTSP流,我找不到任何设置,告诉我到底需要什么。我需要一个像LIVE555这样的RTSP流媒体服务器,还是只能使用FFmpeg?
我的命令。
ffmpeg -i space.mp4 -vcodec libx264 -tune zerolatency -crf 18 -f rtsp -muxdelay 0.1 rtsp://192.168.1.200:1234
我得到一个输入/输出错误。
我需要一个SDP描述来使用RTSP吗?
如果是的话,我应该把它放在哪里?
4 个回答
0 人赞同
你可以用FFserver用RTSP来串流视频。
只要把控制台的语法改为这样就可以了。
ffmpeg -i space.mp4 -vcodec libx264 -tune zerolatency -crf 18 http://localhost:1234/feed1.ffm
创建一个ffserver.config
文件(样本),在那里你声明HTTPPort
,RTSPPort
和SDP流。你的配置文件可以是这样的(一些重要的东西可能会丢失)。
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>
有了这样的设置,你就可以用VLC来观看流媒体,比如说通过输入。
rtsp://192.168.0.xxx:1235/test1.sdp
这里是FFserver的文档。
0 人赞同
顺便说一句,我能够使用simple-rtsp-server和ffmpeg按照这些步骤建立一个本地RTSP服务器用于测试。
用这一行为RTSP服务器创建一个名为rtsp-simple-server.yml
的配置文件。
protocols: [tcp]
将RTSP服务器作为一个Docker容器启动。
$ docker run --rm -it -v $PWD/rtsp-simple-server.yml:/rtsp-simple-server.yml -p 8554:8554 aler9/rtsp-simple-server
使用ffmpeg将一个视频文件(永远循环)流到服务器上。
$ ffmpeg -re -stream_loop -1 -i test.mp4 -f rtsp -rtsp_transport tcp rtsp://localhost:8554/live.stream
一旦你运行了这个服务器,你就可以使用ffplay来观看流媒体。
$ ffplay -rtsp_transport tcp rtsp://localhost:8554/live.stream
请注意,simple-rtsp-server也可以处理UDP流(即TCP),但将服务器作为Docker容器运行会很麻烦。
0 人赞同
另一个流媒体命令,我有很好的效果,就是把ffmpeg的输出管道到vlc来创建一个流。 如果你没有安装这些,你可以添加它们。
sudo apt install vlc ffmpeg
在这个例子中,我使用了http的mpeg传输流(ts),而不是rtsp。 我两种都试过了,但http的ts流在我的播放设备上似乎没有故障。
我使用的是一个视频采集HDMI>USB设备,它在video4linux2驱动上把自己设置为输入。 通过vlc的管道一定是CPU友好的,因为我的老式双核奔腾CPU能够进行实时编码,而且没有丢帧。 在其他一些方法中,我也遇到过音频同步问题,而这种方法总是有完美的音频同步。
你将不得不为你的设备或文件调整命令。 如果你使用一个文件作为输入,你就不需要那些v4l2和alsa的东西。 下面是ffmpeg|vlc的命令。
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}'
例如,假设你的服务器电脑IP是192.168.0.10,那么就可以用这个命令播放流媒体。
ffplay http://192.168.0.10:8554
vlc http://192.168.0.10:8554
UPDATE:
这里有一个使用VLC进行rtsp的命令,而不是使用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'
如果你的电脑ip是192.168.0.10,那么rtsp流就可以通过这个命令播放。
vlc rtsp://192.168.0.10:8554/