从FFmpeg流式传输RTSP需要哪些步骤?

use*_*754 15 ffmpeg rtsp video-streaming

从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
Run Code Online (Sandbox Code Playgroud)

我收到输入/输出错误.

我是否需要SDP描述才能使用RTSP?如果是,我必须把它放在哪里?

grz*_*byk 20

您可以使用FFserver使用RTSP流式传输视频.

只需将控制台语法更改为以下内容:

ffmpeg -i space.mp4 -vcodec libx264 -tune zerolatency -crf 18 http://localhost:1234/feed1.ffm
Run Code Online (Sandbox Code Playgroud)

创建一个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>
Run Code Online (Sandbox Code Playgroud)

通过这样的设置,您可以通过键入以下内容来查看流,即VLC:

rtsp://192.168.0.xxx:1235/test1.sdp
Run Code Online (Sandbox Code Playgroud)

这是FFserver文档.

  • 2016年7月10日,ffserver计划被删除 - http://ffmpeg.org/index.html#ffserv (5认同)
  • @ user1767754由于它的弃用,有没有替代ffserver?你会建议live555吗? (3认同)
  • 我得到一个segmentaion错误(代码转储):( (2认同)

Ken*_*n H 7

我取得了良好效果的另一个流命令是将 ffmpeg 输出通过管道传输到 vlc以创建流。如果您没有安装这些,您可以添加它们:

sudo apt install vlc ffmpeg
Run Code Online (Sandbox Code Playgroud)

在示例中,我使用 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}'
Run Code Online (Sandbox Code Playgroud)

例如,假设您的服务器PC IP是192.168.0.10,则可以通过以下命令播放流:

ffplay http://192.168.0.10:8554
#or
vlc http://192.168.0.10:8554
Run Code Online (Sandbox Code Playgroud)

更新:这是使用 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'
Run Code Online (Sandbox Code Playgroud)

如果您的PC ip是192.168.0.10,则通过以下命令播放rtsp流:

vlc rtsp://192.168.0.10:8554/
Run Code Online (Sandbox Code Playgroud)


小智 6

FWIW,我能够按照以下步骤使用simple-rtsp-server和 ffmpeg设置本地 RTSP 服务器以进行测试:

  1. rtsp-simple-server.yml使用这一行调用的 RTSP 服务器创建一个配置文件:
    protocols: [tcp]
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将 RTSP 服务器作为 Docker 容器启动:
    $ docker run --rm -it -v $PWD/rtsp-simple-server.yml:/rtsp-simple-server.yml -p 8554:8554 aler9/rtsp-simple-server
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用 ffmpeg 将视频文件(永远循环)流式传输到服务器:
    $ ffmpeg -re -stream_loop -1 -i test.mp4 -f rtsp -rtsp_transport tcp rtsp://localhost:8554/live.stream
    
    Run Code Online (Sandbox Code Playgroud)

运行后,您可以使用 ffplay 查看流:

$ ffplay -rtsp_transport tcp rtsp://localhost:8554/live.stream
Run Code Online (Sandbox Code Playgroud)

请注意,simple-rtsp-server也可以处理 UDP 流(iso TCP),但是将服务器作为 Docker 容器运行会很棘手。

  • 我对“simple-rtsp-server”的配置是多么容易,而且它的功能多么强大感到非常惊讶。甚至包括 HLS 服务器,无需额外费用。这个东西太棒了,谢谢推荐! (3认同)