从 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 吗? 如果是的话我必须把它放在哪里?
FWIW,我能够按照以下步骤使用 simple-rtsp-server 和 ffmpeg 设置本地 RTSP 服务器用于测试目的:
rtsp-simple-server.yml
的 RTSP 服务器创建一个配置文件:
protocols: [TCP]
paths:
all:
source: publisher
$ docker run --rm -it -v $PWD/rtsp-simple-server.yml:/rtsp-simple-server.yml -p 8554:8554 aler9/rtsp-simple-server:v1.3.0
$ 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 容器运行是很棘手的。
您可以使用 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>
通过这样的设置,您可以通过输入以下内容使用 VLC 观看流:
rtsp://192.168.0.xxx:1235/test1.sdp
这里是 FFserver 文档。
我取得了良好效果的另一个流命令是 将 ffmpeg 输出通过管道传输到 vlc 以创建流。如果您没有安装这些,您可以添加它们:
sudo apt install vlc ffmpeg
在示例中,我使用 http 上的 mpeg 传输流 (ts),而不是 rtsp。我已经尝试过这两种方法,但 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
更新: 这是使用 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/
我使用 Red5 Pro 来代替 FFServer。在 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