从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? 如果是,我必须把它放在哪里?
答案 0 :(得分:16)
您可以使用FFserver使用RTSP流式传输视频。
只需将控制台语法更改为以下内容:
ffmpeg -i space.mp4 -vcodec libx264 -tune zerolatency -crf 18 http://localhost:1234/feed1.ffm
创建ffserver.config
文件(sample),您可以在其中声明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>
使用这样的设置,您可以通过键入以下内容来查看流,即:
rtsp://192.168.0.xxx:1235/test1.sdp
以下是FFserver文档。
答案 1 :(得分:1)
FWIW,我可以按照以下步骤使用simple-rtsp-server和ffmpeg设置本地RTSP服务器以进行测试:
rtsp-simple-server.yml
的配置文件:
protocols: [tcp]
$ docker run --rm -it -v $PWD/rtsp-simple-server.yml:/rtsp-simple-server.yml -p 8554:8554 aler9/rtsp-simple-server
$ 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容器运行。
答案 2 :(得分:1)
我收到的另一个效果很好的流命令是将ffmpeg输出插入vlc 以创建流。如果没有安装这些工具,则可以添加它们:
sudo apt install vlc ffmpeg
在该示例中,我通过http而不是rtsp使用mpeg传输流(ts)。我都尝试过,但是http ts流在我的播放设备上似乎正常运行。
我正在使用视频捕获HDMI> USB设备,将其自身设置在video4linux2驱动程序上作为输入。通过vlc进行管道传输必须对CPU友好,因为我的旧双核Pentium 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}'
例如,假设您的服务器PC IP为192.168.0.10,则可以通过以下命令播放流:
ffplay http://192.168.0.10:8554
#or
vlc http://192.168.0.10:8554
答案 3 :(得分:0)
我使用的替代FFServer的替代方法是Red5 Pro,在Ubuntu上,我使用了以下代码:
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