最近由于工作需要在做一些视频监控相关的工作,其中一个研究点就是如何将网络摄像头的实时视频流拉取并保存到本地,我使用的开发语言是python,通过查找资料找到了如下几种方法。
- 使用opencv进行操作。使用opencv读取网络摄像头有一篇比较好的文章,由于本文主要介绍FFmpeg的使用,所以在这里不展开介绍。
- 使用FFmpeg进行操作。以下是从《FFmpeg从入门到精通》中引用的一段介绍:
FFmpeg既是一款音视频编解码工具,同时也是一组音视频编码开发套件,作为编解码开发套件,它为开发者提供了丰富的音视频处理的调用接口。
相较于opencv,FFmpeg对视频的处理更为专业,提供的接口也更加丰富,使得我们开发起来更加方便,对程序流程的掌控也更加精细。在接下来的篇幅中,我将从以下几个部分对FFmpeg的使用进行介绍。
视频文件的相关概念
我们都知道,视频播放其实就是时空上连续的一帧一帧图片按照某一切换速率进行显示,由于人眼的暂留效应,当这个切换速率高于某一值后,人眼将无法察觉出相邻两帧之间的切换,整个画面就“动起来了”。而这个切换速率,就是视频中常说的帧率。
帧率:视频1s内展示了多少张图片。
但是,如果我们对一个视频中的所有帧都无压缩的保存,那么一个视频的大小将非常大,以1080P的视频为例,一般1080P的视频每一帧大小为1920*1080,每一帧3个通道,每个像素用uint8存储,则每一帧的大小为6MB左右,假设是一部1小时的电影,帧率为25,则整部电影文件的大小将达到529GB。所以为了能将视频在保证画质的前提下减小视频的大小,一些压缩算法被应用到了视频中,而这些压缩算法就是视频中的编码格式。视频压缩的基本前提就是相邻帧之间其实变化并不是很大,所以当我们保存某一帧后,其实只需要保存相邻帧对其的变化即可。这就是视频压缩中的帧间压缩,还有一种压缩是帧内压缩,其实就是图片的压缩。
视频使用的压缩编码格式有MPEG4,MJPEG,AAC,H.264,H.265(HEVC)等,其中H.264是目前使用最为广泛的压缩编码。
除了编码格式外,视频中的另外一个概念是封装格式,所谓封装格式,可以简单看成是一个容器,里面除了视频以外,还可以包括音频、字幕等信息。我们常见的视频文件后缀MP4就是一种封装格式,除了MP4以外,还有FLV、TS、KV等文件封装格式,还有RTMP、RTSP、H