zoukankan      html  css  js  c++  java
  • ffserver和ffmpeg配合完成的实时流媒体服务

    ffmpeg和ffserver配合使用可以实现实时的流媒体服务,这里实时的数据来自摄像头,如果考虑到应用程序和网络状况,这里客户端看到的画面还是会落后与摄像头本地获取的画面,最糟糕时甚至看不到画面(扯远了),这里我们关注的是ffmpeg和ffserver之间是如何配合工作的,了解了他们之间的关系,对个别问题也能有的放矢。
    ffserver先于ffmpeg启动,它在启动的时候需要加参数-f指定其配置文件,配置文件里包含有向客户端传送的流的配置(如编码方式,帧率,采样率……),也有对feed1.ffm的配置,还有其他的一些配置。feed1.ffm是什么?这里可以理解为一个缓冲文件,下面会提到它是如何被用到,ffserver启动后,feed1.ffm就会被创建,这时如果你打开feed1.ffm看看,会发现feed1.ffm开始的部分已经写入了内容,你可以找到关键字ffm以及向客户端传送流的配置信息,在feed1.ffm做缓冲用的时候,这些信息是不会被覆盖掉的,就把它们理解为feed1.ffm文件的头吧。
    ffserver启动后,ffmpeg启动,它启动时加的一个关键参数就是“http://ip:8090/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中读取数据,发送给客户端。
    上面粗略的描述在实时流媒体服务时ffmpeg和ffserver的关系,这些看法都是在阅读较早FFmpeg代码(very old)时得出的,现在不知这个架构是否改变,兄弟我把砖扔出,希望大家用玉来砸。
  • 相关阅读:
    不可或缺 Windows Native (15)
    不可或缺 Windows Native (14)
    不可或缺 Windows Native (13)
    不可或缺 Windows Native (12)
    不可或缺 Windows Native (11)
    不可或缺 Windows Native (10)
    不可或缺 Windows Native (9)
    不可或缺 Windows Native (8)
    不可或缺 Windows Native (7)
    不可或缺 Windows Native (6)
  • 原文地址:https://www.cnblogs.com/top5/p/2234183.html
Copyright © 2011-2022 走看看