原创: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://www.gaodaima.com/wesleyl…
腾讯云公网IP无法访问(公网IP无奈绑定-监听)的解决办法:https://www.gaodaima.com/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://www.gaodaima.com/xiongli…
参考
用VLC做流媒体服务器:https://www.gaodaima.com/redstar…
win:利用live555搭建最简略的rtsp流媒体服务:https://www.gaodaima.com/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://www.gaodaima.com/FPGATOM…
live555推送1080p花屏:https://www.gaodaima.com/youyicc…
流媒体开发之开源我的项目live555—更改server端的帧率大小和码率大小:https://www.cnblogs.com/pengk…