【问题标题】:What steps are needed to stream RTSP from FFmpeg?从 FFmpeg 流式传输 RTSP 需要哪些步骤?
【发布时间】:2015-01-15 22:52:22
【问题描述】:

从 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? 如果是,我必须把它放在哪里?

【问题讨论】:

  • ffmpeg 本身可以通过 RTP 流式传输。比 UDP 更好,但您需要就格式达成一致,这就是为什么 RTP 通常通过 RTSP 管理的原因。但是ffmpeg ... -f rtp rtp://destination/streamID:54321 将向“目标”上的端口 54321 发送一个连续的 RTP 流。

标签: ffmpeg video-streaming rtsp


【解决方案1】:

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

只需将控制台语法更改为如下所示:

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

创建一个 ffserver.config 文件 (sample),在其中声明 HTTPPortRTSPPort 和 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 文档。

【讨论】:

  • 那行得通,但是 ffserver 比 live555 更受欢迎吗?
  • 2016 年 7 月 10 日,ffserver 程序被删除 - ffmpeg.org/index.html#ffserv
  • @user1767754 由于 ffserver 已弃用,是否有任何替代方案?你会推荐live555吗?
  • 您好,我想从手机流式传输,我该怎么做。我已经创建了 ffserver,并且我已经在我的手机上安装了 Larix 广播器移动应用程序。我在其中添加了 rtsp://:/fedd1.ffm 之类的 url,但它没有连接
  • 你用过哪个 ffmpeg 版本,@grzebyk?
【解决方案2】:

我使用的替代 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

【讨论】:

    【解决方案3】:

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

    1. 为 RTSP 服务器创建一个名为 rtsp-simple-server.yml 的配置文件,使用这一行:
      protocols: [tcp]
      
    2. 将 RTSP 服务器作为 Docker 容器启动:
      $ docker run --rm -it -v $PWD/rtsp-simple-server.yml:/rtsp-simple-server.yml -p 8554:8554 aler9/rtsp-simple-server
      
    3. 使用 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 流(i.s.o. TCP),但将服务器作为 Docker 容器运行会很棘手。

    【讨论】:

    • simple-rtsp-server 的配置如此简单,但功能如此强大,我完全被震撼了。甚至包括 HLS 服务器,无需额外费用。这东西太棒了,谢谢推荐!
    【解决方案4】:

    另一个我取得了良好效果的流式传输命令是将 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/
    

    【讨论】:

    • 这很有帮助,但是对于您的命令,您没有使用 RTSP,您只是在使用 HTTP!通过使用--sout='#rtp{dst=YOURIP,port=1234,sdp=rtsp://YOURIP:8080/test.sdp}',您可以使用 RTSP 进行流式传输,但是在我的测试中,这适用于 VLC 客户端,但我还没有找到适用于所有类型 RTSP 客户端的方法。特别是在某些客户端上,我收到错误Response failed: RTSP/1.0 461 Unsupported transport。也许 VLC RTSP 服务器不支持带有 TCP 传输的 RTSP?
    • 我无法让 VLC 与 RTSP 一起工作。如果我想要 RTSP,我使用另一个答案中讨论的 rtsp-simple-server。
    • 谢谢!是的,我同时尝试了rtsp-simple-server,效果很好!
    猜你喜欢
    • 2020-06-05
    • 2016-01-05
    • 2018-08-06
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    相关资源
    最近更新 更多