使用ffmpeg命令实现本地摄像头的远程访问——非编程纯命令

cxx3 9年前

1 ffserver命令

fserver是一个音频和视频的流式服务器。它通过在启动时读入的配置文件完成配置,不指定时用默认的/etc/ffserver.conf文件。 ffserver接受一些或者FFM流作为输入然后通过RTP/RTSP/HTTP推流。ffserver监听在配置文件中指定的端口,在配置文件中输入的流叫做feed,每一个都是用<Feed>的节来指定的。每一个feed可以有不同格式的的不同输出流,每一个在配置文件中用<Stream>节来指定。ffserver是通过推送用ffmpeg编码的流来工作的。ffserver担当一个HTTPserver的角色,接收来自ffmpeg的获得发布流的POST请求,并且用流媒体内容来服务HTTP/RTSP客户端的GET请求。要搞清楚什么是feed,什么是 stream。

1.1 Feed是什么

feed是由ffmpeg创建的FFM流,并且发送到ffserver正在监听的端口上。每一个feed是通过一个唯一的名字来识别的,这个名字关联到发布在ffserver上的资源的名字,并且是通过配置文件里面的<Feed>节来完成配置的。feed发布的URL是以下面的形式给出的:

 http://<ffserver_ip_address>:<http_port>/<feed_name>

其中,ffserver_ip_address是ffserver安装的主机的IP地址,http_port是HTTP服务器的端口号,feed_name是相关的定义在配置文件中的feed的名字。每一个feed跟一个磁盘上的文件相关联,这个文件用于当新内容被实时地加入进流的时候,这个文件是用于允许发送预先录制的数据尽可能快地到一个播放器。

1.2 stream是什么

一个实时流或者一个流是一个由ffserver发布的资源并且通过HTTP协议使客户可以访问。一个流可以连接到一个feed上,或者一个文件上。当连接到一个feed上的时候,发布的流是推的来自相关联的通过运行的ffmpeg的实例所形成的feed上的。在第二种情况中,流是从pre- recorded文件里读来的。每一个流有一个唯一的名字,关联到ffserver上的资源的名字,并且是通过配置文件中的复杂的stream节来配置的。访问流的HTTP地址形式:

 http://<ffserver_ip_address>:<http_port>/<stream_name>[<options>]

访问流的RTSP地址形式如下:

 http://<ffserver_ip_address>:<http_port>/<stream_name>[<options>]

其中,stream_name是配置文件中定义的流的名字,options是在URL后面指定的选项的列表,将影响流如何通过ffserver提供的方式。

2 ffmpeg命令

ffmpeg是一个可以从现场的音视频源中采集的非常快速的视频和音频转换器。可以在任意的采样率之间转换,并且可以在现场resize视频。 ffmpeg用-i参数从任意数量的输入files中读入,并写入任意数量的输出文件(通过普通的输出文件名指定)。从输入中选择哪个流到输出流是自动完成或者用-map选项指定。为了引用选项中的输入文件,必须用索引号。类似地,文件里的流也是通过索引号引用的。如2:3引用第3个输入文件中的第4个流。一般的规则是选项是用在下一个指定的文件上的,因此,顺序是很重要的。每出现一个将运用到下一个输入或者输出文件上。这个规则的例外是最开始就指定的全局选项。

不要混淆输入和输出文件,首先指定完所有的输入文件,然后才指定输出文件。也不要混淆属于不同的文件的选项,所有选项仅仅运用在下一个输入或输出文件上,并且在不同的文件之间会重置。

下面来3个实例:

a 设置输出文件的视频码率为64kbps

ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi

b 强制输出文件的帧率为24fps:

ffmpeg -i input.avi -r 24 output.avi

c 强制输入文件的帧率为1fps并且输出文件的帧率为24fps

ffmpeg -r 1 -i input.avi -r 24 output.avi

原始输入文件需要格式化选项。

ffmpeg调用libavformat(包含解封装)读入输入文件并从中取得包含了编码数据的包。当有多个输入文件,ffmpeg通过跟踪最低的时间戳或者跟踪任何激活的输入流来保持同步。编码的包然后传递给解码器(除非指定是拷贝流,那么就不经过解码以及后面的编码)。解码器产生可以被 filtering进一步处理的非压缩帧,在filtering之后,帧传给encoder(编码他们并且输出编码包),最后,传给封装器muxer,把编码包写给输出文件。在编码之前ffmpeg可以用libavfilter库中的滤波器来处理原始音视频帧。滤波器链产生了滤波器图,ffmpeg有两种类型的滤波器图:简单的和复杂的。