http://blog.chinaunix.net/uid-9688646-id-3399113.html

ffmpeg和ffserver配合使用可以实现实时的流媒体服务。
 
一、理解
里边主要有如下四个东西,搞清楚他们之间的关系就差不多明白了。
1. ffmpeg
 
2. ffserver
 
3. ffserver.conf
 
4. feed1.ffm
 
 
1. ffmpeg,负责媒体文件的transcode工作,把你服务器上的源媒体文件转换成要发送出去的流媒体文件。
 
2. ffserver,负责响应客户端的流媒体请求,把流媒体数据发送给客户端。
 
3. ffserver.conf,ffserver启动时的配置文件,在这个文件中主要是对网络协议,缓存文件feed1.ffm(见下述)和要发送的流媒体文件的格式参数做具体的设定。
 
4. feed1.ffm,可以看成是一个流媒体数据的缓存文件,ffmpeg把转码好的数据发送给ffserver,如果没有客户端连接请求,ffserver把数据缓存到该文件中。
 
 
二、http的建立流程
1. 配置ffserver.conf文件(初次接触可以参考ffmpeg源码中的doc/ffserver.conf,里边有详细的注释)
如下写一个示例
Port 10535
RTSPPort 5454
BindAddress 0.0.0.0、
MaxHTTPConnections 2000
MaxClients 1000
MaxBandwidth 1000
CustomLog -
NoDaemon
 
#实时流数据配置(参考源码ffmpeg/test/下的ffserver.conf)
<Feed feed1.ffm>
File /tmp/feed1.ffm
FileMaxSize 1M
ACL allow 127.0.0.1
</Feed>
 
<Stream test.avi>
Feed feed1.ffm
Format avi
#
BitExact
DctFastint
IdctSimple
VideoFrameRate 10
VideoSize 352x288
VideoBitRate 100
VideoGopSize 30
NoAudio
 
PreRoll 10
StartSendOnKey
MaxTime 100
 
</Stream>
 
#已经存在的文件而非实时流
 

<Stream test.flv>
File "/project/apps/ffserver/test.flv"
Format flv
</Stream>

 
 
2、如何实现播放
(1)实时流用http传输
如果传输硬盘上的文件,则:
ffserver -f myfile/ffmpeg0.8.9/ffserver.conf &
ffmpeg -i inputfile(输入文件) http://localhost:10535/feed1.ffm
如何传输摄像头捕获的实时流,则:
ffserver -f
myfile/ffmpeg0.8.9/ffserver.conf & ffmpeg -f
video4linux2 -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,然后用ffplay
http://ip:port/test.flv,或者在vlc中输入以上网址也可实现播放。
 
(3)本地文件用rtsp传输
ffserver -f /etc/ffserver.conf
用命令启动ffserver,然后用ffplay
rtsp://ip:port/rtsp.mpg,或者在vlc中输入以上网址也可实现播放。
备注:在做测试的时候,用rtsp不能传输flv文件。
 
 
 
 
 
 

相关错误:

http://localhost:8090/test.asf: Invalid data found when processing input

Error occurs when I transcode a file into asf format

http://ffmpeg.gusari.org/viewtopic.php?f=11&t=590

You can't stream avi file format, it's not designed to be streamed, rather to be used as a file/storage format. Streaming formats are: flv, mpegts, asf, rtmp/rtp/rtsp... So, try changing Format avi to Format mpegts and see if that works. But, the most convenient way of using ffmpeg/ffserver is to create a config file for ffserver and then run ffmpeg, telling it to feed the ffserver, which will do the actual encoding and streaming.

ffmpeg与ffserver的协同工作

http://blog.csdn.net/shendan00/article/details/18839837

工作流程如下:

1、 启动ffserver,配置参数

ffserver先于ffmpeg启动,它在启动的时候需要加参数-f指定其配置文件,配置文件里包含端口信息、缓冲文件配置、传送流配置(如编码方式,帧率,采样率……)。

2、 启动ffmpeg,输入流

启动ffmpeg,向缓冲文件输入数据流,数据流可以来自摄像头,也可以来自本来就存在的文件。

feed1.ffm是一个缓冲文件,fserver启动后,feed1.ffm就会自动被创建,feed1.ffm开始的部分已经写入向客户端传送流的配置信息,在feed1.ffm做缓冲用的时候,这些信息是不会被覆盖掉。

ffmpeg启动的一个关键参数就是“http://ip:port/feed1.ffm”,其中ip是运行ffserver主机的ip,如果 ffmpeg和ffserver都在同一系统中运行的话,用localhost或者127.0.0.1也行。ffmpeg启动后会与ffserver建立 一个连接(短暂的连接),通过这第一次的连接,ffmpeg从ffserver那里获取了向客户端输出流的配置,并把这些配置作为自己编码输出的配置,然后ffmpeg断开了这次连接,再次与ffserver建立连接(长久的连接),利用这个连接ffmpeg会把编码后的数据发送给ffserver。如果你观察ffserver端的输出就会发现这段时间会出现两次HTTP的200,这就是两次连接的过程。

3、连接过程

ffmpeg从摄像头获取数据后,按照输出流的编码方式编码,然后发送给ffserver,ffserver收到ffmpeg的数据后,如果网络上 没有播放的请求,就把数据写入feed1.ffm中缓存,写入时把数据加上些头信息然后分块,每块4096B(每块也有结构),当feed1.ffm的大 小到了ffserver.conf中规定的大小后,就会从文件开始(跳过头)写入,覆盖旧的数据。直到网络上有播放的请求,ffserver从feed1.ffm中读取数据,发送给客户端

带有缓冲的数据流图如下
 
 
 
 
 
我的配置(注意:asf文件播放不了)
 
Port 8090
RTSPPort 8091
BindAddress 0.0.0.0
MaxHTTPConnections 2000
MaxClients 1000
MaxBandwidth 1000
CustomLog -

<Feed feed1.ffm>
#File /tmp/feed1.ffm
File "/home/yingc/gcyin/test/thirdparty/output/ffmpeg/bin/feed1.ffm"
FileMaxSize 20000000K
ACL allow 127.0.0.1
</Feed>

#<Stream test.ts>
#Feed feed1.ffm
#Format mpegts
#
#AudioCodec libmp3lame
#AudioBitRate 128
#AudioChannels 2
#AudioSampleRate 44100
#AVOptionAudio flags +global_header
#
#VideoBitRate 800
#VideoFrameRate 25
#VideoSize 640x480
#VideoCodec libx264
#AVOptionVideo flags +global_header
#</Stream>
#
#<Stream test.asf>
#Feed feed1.ffm
#Format asf
#
#AudioCodec aac
#AudioBitRate 128
#AudioChannels 2
#AudioSampleRate 44100
#AVOptionAudio flags +global_header
#
#VideoBitRate 800
#VideoFrameRate 25
#VideoSize 640x480
#VideoCodec libx264
#AVOptionVideo flags +global_header
#</Stream>

<Stream test.ts>
Feed feed1.ffm
Format mpegts
</Stream>
<Stream test.avi>
Feed feed1.ffm
Format avi
</Stream>
<Stream test.flv>
Feed feed1.ffm
Format flv
</Stream>
<Stream test.mp4>
Format rtp
File "/home/yingc/gcyin/test/thirdparty/output/ffmpeg/bin/h.mp4"
</Stream>
<Stream test.asf>
Feed feed1.ffm
Format asf
</Stream>

<Stream stat.html>
Format status

# Only allow local people to get the status
ACL allow localhost
ACL allow 192.168.110.0 192.168.110.255
</Stream>

# Redirect index.html to the appropriate site
<Redirect index.html>
URL http://www.ffmpeg.org/
</Redirect>

 
 
./ffmpeg -i "http://122.228.84.235/d44bff3d000002EE-1400405760-3078718192/data4/vhotlx.video.qq.com/flv/173/5/p0014s3d4pb.p201.1.mp4?vkey=06C6236D18A183017BF4076DC2CCD118E4A6DCC28BAB7ECA53A48918D7D3732A6379C03F1EC5CB6FE7C901CA66638EFDB3E01647C335E225hostname=122.228.84.235" http://localhost:8090/feed1.ffm
 
 
 
./ffmpeg -i h.mp4 http://localhost:8090/feed1.ffm
 
 
 
./ffplay  http://localhost:8090/test.flv
 
./ffplay  rtsp://localhost:8091/test.flv
 

ffmpeg+ffserver搭建流媒体服务器的更多相关文章

  1. Linux-Nginx+rtmp+ffmpeg搭建流媒体服务器

    Nginx+rtmp+ffmpeg搭建流媒体服务器 说明: nginx搭建流媒体服务需要用到 nginx-rtmp-module 模块 具体操作步骤: 安装nginx (1)下载第三方扩展模块ngin ...

  2. centos7+nginx+rtmp+ffmpeg搭建流媒体服务器(保存流目录与http目录不要随意配置,否则有权限问题)

    搭建nginx-http-flv-module升级代替rtmp模块,详情:https://github.com/winshining/nginx-http-flv-module/blob/master ...

  3. 使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器

    参考: 1,使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器笔记(一)http://blog.csdn.net/xdwyyan/article/details/4319 ...

  4. Linux 下搭建流媒体服务器

    http://blog.csdn.net/huangtaishuai/article/details/9836581 ----------------------------------------- ...

  5. Ubuntu下使用nginx和nginx-rtmp-module搭建流媒体服务器的正确姿势

    之前在使用nginx和nginx-rtmp-module搭建流媒体服务器的时候遇到一个很尴尬的问题,就是在把nginx-rtmp-module模块添加到nginx中去的时候,我最开始采取的做法是先卸载 ...

  6. 使用 Live555 搭建流媒体服务器

    最近因为工作需要,需要搭建流媒体服务器,所以研究了一下,在此分享我的搭建过程. 搭建过程还是非常简单的! 搭建环境为Centos 7.2 64bit 一.安装gcc编译器 yum install gc ...

  7. nginx + rtmp 搭建流媒体服务器

    一.安装nginx服务器 1.路径说明: 路径:/usr/local/src 2.下载nginx-rtmp-module (我这里的目录是在/usr/local/src/下面) cd /usr/loc ...

  8. obs nginx-rtmp-module搭建流媒体服务器实现直播 ding

    接下来我就简单跟大家介绍一下利用nginx来搭建流媒体服务器. 我选择的是腾讯云服务器 1.下载nginx-rtmp-module: nginx-rtmp-module的官方github地址:http ...

  9. nginx的rtmp搭建流媒体服务器实现直播流

    最近自己搞了一个用nginx的rtmp来搭建流媒体服务器,从而实现直播的过程,参考了网上很多资料,有些资料对于初学者来说比较难以理解,在此将我搭建的过程记录下来,分享给大家. 1.下载nginx-rt ...

随机推荐

  1. [转]insmod

    [转]insmod http://www.cnblogs.com/amaoxiaozhu/archive/2013/03/08/2950002.html 在Linux下,驱动程序是内核的一部分,运行在 ...

  2. 双系统下利用MbrFix.exe卸载LINUX系统

    前言:  不少同学笔记本都装的有双系统,一般都是LIUNX和WINDOWS的两个系统(由于以前对电脑各种无知)装了双系统,再次,小编就不在阐述双系统地各种不便,再次就强调一下,假若要卸载LINUX的话 ...

  3. 【工作总结】LLDB调试技巧 - 篇一

    备忘命令 : 命令“l”可以查看程序当前运行的位置 (lldb) l } - (void)rightBarButtonAction { 命令“bt”也能查看程序运行的调用栈 (lldb) bt * t ...

  4. TList,TObjectList 使用——资源释放

    TOjectList = Class (Tlist); TOjectList继承Tlist,从名字上看就可以知道它是专门为对象列表制作的,那么他到底丰富了那些功能呢? 首先是 TObject 作为对象 ...

  5. js之Function原型

    在ECMAScript中,Function(函数)类型实际上是对象.每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象 ...

  6. 理解bashrc和profile[转载]

    这儿有一篇文章不错 https://wido.me/sunteya/understand-bashrc-and-profile/ http://blog.csdn.net/luotuo44/artic ...

  7. js基础知识点(只有点)

    转自:2015年12月的文章 http://blog.csdn.net/u014326381/article/details/50176339 JavaScript: 作用域链.闭包.运行时上下文.t ...

  8. 前端之JavaScript第二天学习(4)-JavaScript-注释

    JavaScript 注释可用于提高代码的可读性. JavaScript 注释 JavaScript 不会执行注释. 我们可以添加注释来对 JavaScript 进行解释,或者提高代码的可读性. 单行 ...

  9. python--参数列表的分拆

    当你要传递的参数已经是一个列表,调用的函数却接受分开一个个的参数,这个时候可以考虑参数列表拆分: 可以使用* 操作符来自动把参数列表拆开: args=[3,6] x=list(range(*args) ...

  10. boost之signal

    boost里的signal是一个模板类,不区分信号种类,产生信号统一用()调用操作符. 1.回调普通函数代码示例: #include <iostream> #include <str ...