用ffserver实现rtsp服务器的实验笔记
参考:https://blog.csdn.net/hoyjam1/article/details/51281679
建议配置文件:/etc/config/ffserver.conf
Port 10535 RTSPPort 5454 BindAddress 0.0.0.0、 MaxHTTPConnections 2000 MaxClients 1000 MaxBandwidth 1000 CustomLog - NoDaemon #实时流数据配置(参考源码ffmpeg/test/下的ffserver.conf) File /tmp/feed1.ffm FileMaxSize 1M ACL allow 127.0.0.1 Feed feed1.ffm Format avi # BitExact DctFastint IdctSimple VideoFrameRate 10 VideoSize 352x288 VideoBitRate 100 VideoGopSize 30 NoAudio PreRoll 10 StartSendOnKey MaxTime 100
2、如何实现播放
(1)实时流用http传输
如果传输硬盘上的文件,则:
ffserver -f /etc/ffserver.conf & ffmpeg -i inputfile http://localhost:10535/feed1.ffm
如何传输摄像头捕获的实时流,则:
ffserver -f /etc/ffserver.conf & ffmpeg -fvideo4linux2 -framerate 30 -i /dev/video0 http://127.0.0.1:8090/feed1.ffm
启动ffserver和ffmpeg。 ffserver先于ffmpeg启动,它在启动的时候需要加参数-f指定其配置文件。ffserver启动后,feed1.ffm就会被创建,这时如果 你打开feed1.ffm看看,会发现feed1.ffm开始的部分已经写入了内容,你可以找到关键字ffm以及向客户端传送流的配置信息,在 feed1.ffm做缓冲用的时候,这些信息是不会被覆盖掉的,就把它们理解为feed1.ffm文件的头吧。
ffserver启动后,ffmpeg 启动,它启动时加的一个关键参数就是“http://ip:10535/feed1.ffm”,其中ip是运行ffserver主机的ip,如果 ffmpeg和ffserver都在同一系统中运行的话,用localhost也行。ffmpeg启动后会与ffserver建立一个连接(短暂的连 接),通过这第一次的连接,ffmpeg从ffserver那里获取了向客户端输出流的配置,并把这些配置作为自己编码输出的配置,然后ffmpeg断开 了这次连接,再次与ffserver建立连接(长久的连接),利用这个连接ffmpeg会把编码后的数据发送给ffserver。
如果你观察ffserver端的输出就会发现这段时间会出现两次HTTP的200,这就是两次连接的过程。
ffmpeg从摄像头获取数据后,按照 输出流的编码方式编码,然后发送给ffserver,ffserver收到ffmpeg的数据后,如果网络上没有播放的请求,就把数据写入 feed1.ffm中缓存,写入时把数据加上些头信息然后分块,每块4096B(每块也有结构),当feed1.ffm的大小到了 ffserver.conf中规定的大小后,就会从文件开始(跳过头)写入,覆盖旧的数据。直到网络上有播放的请求,ffserver从 feed1.ffm中读取数据,发送给客户端。
(2)本地文件用http传输
ffserver -f /etc/ffserver.conf
用命令启动ffserver,然后用ffplayhttp://ip:port/test.flv,或者在vlc中输入以上网址也可实现播放。
(3)本地文件用rtsp传输
ffserver -f /etc/ffserver.conf
用命令启动ffserver,然后用ffplayrtsp://ip:port/rtsp.mpg,或者在vlc中输入以上网址也可实现播放。
备注:在做测试的时候,用rtsp不能传输flv文件
https://blog.csdn.net/hoyjam1/article/details/51281679
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2019-12-18 VBnet窗口获取键盘输入
2019-12-18 Visual Basic 中读取逗号分隔的文本文件
2019-12-18 C#追加日志文件
2019-12-18 VisualBasic文件与目录管理FileSystem 类
2019-12-18 Net 文件和流 I/O
2019-12-18 C#读操作(字节/字符)Filestream、File、StreamReader
2019-12-18 VBNET 文件信息和目录管理(判断,创建,删除,移动,复制)