乐趣区

关于linux:linux手把手教ubuntu搭建rtsp视频推送服务

原创:linux_手把手教 ubuntu 搭建 rtsp 视频推送服务

live555 编译装置启动

编译

wget  http://www.live555.com/liveMedia/public/live555-latest.tar.gz
tar xzf live555-latest.tar.gz
cd live
./genMakefiles linux-64bit    #留神前面这个参数是依据以后文件夹下 config.< 后缀 > 获取失去的
make

启动:cd mediaServer && ./live555MediaServer
打印出这些就阐明编译装置胜利了。

[root@localhost mediaServer]# ./live555MediaServer 
LIVE555 Media Server
        version 0.89 (LIVE555 Streaming Media library version 2016.06.26).
Play streams from this server using the URL
        rtsp://192.168.0.111/<filename> #这个就是拜访的 url 地址
where <filename> is a file present in the current directory.
Each file's type is inferred from its name suffix:".264"=> a H.264 Video Elementary Stream file".265"=> a H.265 Video Elementary Stream file".aac"=> an AAC Audio (ADTS format) file".ac3"=> an AC-3 Audio file".amr"=> an AMR Audio file".dv"=> a DV Video file".m4e"=> a MPEG-4 Video Elementary Stream file".mkv"=> a Matroska audio+video+(optional)subtitles file".mp3"=> a MPEG-1 or 2 Audio file".mpg"=> a MPEG-1 or 2 Program Stream (audio+video) file".ogg"or".ogv"or".opus"=> an Ogg audio and/or video file".ts" => a MPEG Transport Stream file
                (a ".tsx" index file - if present - provides server 'trick play' support)
        ".vob" => a VOB (MPEG-2 video with AC-3 audio) file
        ".wav" => a WAV Audio file
        ".webm" => a WebM audio(Vorbis)+video(VP8) file
See http://www.live555.com/mediaServer/ for additional documentation.
(We use port 80 for optional RTSP-over-HTTP tunneling, or for HTTP live streaming (for indexed Transport Stream files only).)

填充视频

将视频放到和 live555MediaServer 同门路下就能够了。
须要注意的是 live555 并不反对 mp4 格局,须要将 mp4 转为 mkv

ffmpeg -i xxx.mp4 xxx.mkv

此时用播放软件播放地址:

vlc rtsp://192.168.0.111/xxx.mkv
or
ffplay rtsp://192.168.0.111/xxx.mkv

花屏问题 01 缓冲区大小

视频的前几秒钟可能会有花屏问题,网上查了查,起因在于缓冲区大小有余。须要批改缓冲区大小

live555 推送之后的视频流呈现花屏,查看源码 DynamicRTSPServer.cpp 文件,源码如下:sms->addSubsession(MPEG4VideoFileServerMediaSubsession::createNew(env, fileName, reuseSource));
  } else if (strcmp(extension, ".264") == 0) {
    // Assumed to be a H.264 Video Elementary Stream file:
    NEW_SMS("H.264 Video");
    OutPacketBuffer::maxSize = 100000; // allow for some possibly large H.264 frames
    sms->addSubsession(H264VideoFileServerMediaSubsession::createNew(env, fileName, reuseSource));
  } else if (strcmp(extension, ".265") == 0) {
    // Assumed to be a H.265 Video Elementary Stream file:
    NEW_SMS("H.265 Video");
    OutPacketBuffer::maxSize = 100000; // allow for some possibly large H.265 frames
    sms->addSubsession(H265VideoFileServerMediaSubsession::createNew(env, fileName, reuseSource));
  } else if (strcmp(extension, ".mp3") == 0) {
    // Assumed to be a MPEG-1 or 2 Audio file:
    NEW_SMS("MPEG-1 or 2 Audio")

查看下面红色局部对于 H264 和 H265 输入包最大缓冲 100000 字节(100K),对于高清视频缓冲区太小了,必须更改大些。目前更改到 800000,对于 1080P 视频应用 VLC 播放时,不会再呈现花屏。
可用如下信息查问出须要批改那些文件:grep -rnw . -e ‘OutPacketBuffer::maxSize = ‘,须要批改 buff 的文件
批改后花屏问题可能存在,但视频卡顿问题会失去解决。

花屏问题 02 视频格式

花屏问题仍然存在,自己已经尝试过用 h264 格局代替 mkv, 发现 live555 无奈辨认 h264 格局,偶尔扫到命令提醒局部,发现 live555 反对的 h264 须要的扩大格局为 264,将 h264 扩大改为 264, 发现花屏问题失去解决,(然而解决的并不完满)。
视频解决:

ffmpeg -i xxx.mp4 xxx.h264
mv xxx.h264 xxx.264

将视频复制到 live555MediaServer 同门路下, 启动后连贯 rtsp 地址,发现花屏问题得以解决。
小视频个别都是 ok 的(小于 10M),大视频则会有问题(大于 200M),vlc 连贯大视频的 rtsp 时仍然会呈现花屏问题。

opencv 连贯 rtsp:ok
ffplay 连贯 rtsp:ok
vlc 连贯 rtsp: 花屏

猜想是 vlc 对局部码流数据兼容不佳,或者视频源有问题,总之 3 个播放工具 2 个没问题,能够认为 rtsp 是 ok 的。

无奈推送到外网(腾讯云)

应用腾讯云主机建设 rtsp 服务器,发现生成的 pull 地址 IP 并非外网 ip,而是 172 结尾的 ip。
首先:live555 是如何获取 ip 的?
发现在 live555 源码的 groupsock/GroupsockHelper.cpp 中 live555 是通过连贯本机的 15947 端口来确定本人的 ip 的。
其实就是 eth0 网卡地址
腾讯云运行:ip addr show eth0
发现确实是 172 结尾的 ip

为何呢?因为腾讯云搞了鬼,详见参考文献《腾讯云公网 IP 无法访问(公网 IP 无奈绑定 - 监听)的解决办法》
监控 172 地址的话,从外网拜访必然无法访问到,导致外网无奈拉流。

怎么办呢?让其监控 0.0.0.0,如何让其监控 0 呢?
从其余博文能够看出,groupsock/GroupsockHelper.cpp 的函数 ipv4AddressBits ourIPAddress(UsageEnvironment& env)的返回值就是 ip。将其返回值批改为 0 即可。

批改后,须要从新编译源码。

参考:
live555 学习心得二 (获取本地 IP 地址办法 1):https://blog.csdn.net/wesleyl…
腾讯云公网 IP 无法访问(公网 IP 无奈绑定 - 监听)的解决办法:https://blog.csdn.net/chenggo…

报错:The input frame data was too large for our buffer size

批改 01:vim live/liveMedia/MultiFramedRTPSource.cpp
line76:increaseReceiveBufferTo(env, RTPgs->socketNum(), 2000*1024);
批改 02:vim live/liveMedia/StreamParser.cpp
line26:BANK_SIZE 600000.
批改 03:vim live/liveMedia/MediaSink.cpp
line113: unsigned OutPacketBuffer::maxSize = 600000;
批改 04:vim live/mediaServer/DynamicRTSPServer.cpp
批改 line 141,146,202,208:OutPacketBuffer::maxSize = 600000;
批改 06:vim live/testProgs/playCommon.cpp
line116:unsigned fileSinkBufferSize = 600000;
从新编译

参考:
live555: The input frame data was too large for our buffer size 解决办法:https://caibiao-lee.blog.csdn…
Live555:MultiFramedRTPSink::afterGettingFrame1(): The input frame data was too large for our buffer:https://blog.csdn.net/xiongli…

参考

用 VLC 做流媒体服务器:https://blog.csdn.net/redstar…
win:利用 live555 搭建最简略的 rtsp 流媒体服务:https://blog.csdn.net/huweiji…
应用 live555 在 linux 下搭建 rtsp server:https://www.cnblogs.com/dpf-1…
nginx+rtmp:https://hub.docker.com/r/data…
nginx+rtsp:https://hub.docker.com/r/srnb…
ffmpeg+ffserver 搭建 rtsp 服务器:https://blog.csdn.net/FPGATOM…
live555 推送 1080p 花屏:https://blog.csdn.net/youyicc…
流媒体开发之开源我的项目 live555— 更改 server 端的帧率大小和码率大小:https://www.cnblogs.com/pengk…

退出移动版