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

时间:2014-11-18 16:51:16

标签: ffmpeg video-streaming rtsp

从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 :(得分:16)

您可以使用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>

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

rtsp://192.168.0.xxx:1235/test1.sdp

以下是FFserver文档。

答案 1 :(得分:1)

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流(即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