前言
这篇博文记录一个简单的实时码流测试程序,事实上FFmpeg打开媒体文件后就可以获得整个视频的平均码流**(只计算视频码流**),但是无法获取实时码流,因为后面的工作需要对编解码做一些优化,需要实时观测码流,这里先实现一个比较简单的版本。
运行结果
事实上h264编码的视频的码流还是比较平缓的,在视频较暗或者视角相对固定的时候可以观测到码流稍有下降。这里单位用Mbps。
可以观测到实时码率,大家也可以用这款软件Elecard StreamEye来观测实时码流,如下图:蓝色的曲线就是码流的实时曲线。
码流
码流(Data Rate)是指视频文件在单位时间内使用的数据流量,也叫码率或码流率,是视频编码中画面质量控制中最重要的部分,一般我们用的单位是kb/s或者Mb/s。一般来说同样分辨率下,视频文件的码流越大,压缩比就越小,画面质量就越高。码流越大。我们实验室想要达到的目的就是在人眼觉察不到视频质量下降的前提下,降低码流,以此达到节省带宽的目的,这样在实时视频的应用背景下可以实现视频的更高分辨率和更高帧率,在非实时的应用场景下也可以实现节省存储空间的目的。 码流的计算十分简单,这里就不做详细介绍。
实现方法
其实就是在解封装后用av_read_frame()去读取帧,用列表把帧存储起来,列表的长度=视频的帧率。这样就可以对实时码率就行计算了。
源代码:
#include
#include
#include
extern "C"
{
#include
}
int main(int argc, char* argv[])
{
//本地媒体文件或者网络流地址
char url[] = "test.mov";
//定义解封装格式上下文。
AVFormatContext* ifmt = NULL;
//读取的压缩后媒体信息。
AVPacket* pkt = 0;
//媒体文件的帧率
int frame_rate = 0;
//视频流索引
int video_index = -1;
//用于存放pkt的链表
std::list
std