H264编码数据实时传输带宽需求
获取的测试视频数据为foreman_cif,地址[1]。大小16M,时长12秒,帧率25fps(每40ms采集一个数据帧),长宽352*288 ,一共300帧的数据,压缩率不是很高。
使用[2]的代码,获取H264 NALU的大小和类型[2]。使用[1]中的原始视频文件,I帧大小71714细节,最小的也在60000字节。则在40ms传输I帧数据需要的带宽,71714字节/40ms~15Mbps。这样的带宽需求,网络是无法满足的。
采用ffmpeg把原有的H264转成yuv类型数据:ffmpeg -i foreman_cif.h264 foreman_cif.yuv。输出的yuv文件大小为48M。
通过ffmpeg把yuv数据再次编码:ffmpeg -f rawvideo -pix_fmt yuv420p -s:v 352*288 -r 25 -i foreman_cif.yuv output.h264。输出的编码文件大小为600kb。
再次运行[2]的程序,获取编码帧数据,其中I帧大小为10997字节。瞬时传输速率(10997byte*8/40)~2Mbps。
将[2]的dump函数修改如下,需要在全局定义数据文件指针logf。并在主文件中打开文件。类型5表明是I帧数据,一共编码出两个数据,删除I帧数据前的sps,pps信息[3]。保证数据行为300.
void dump(NALU_t *n)
{
if (!n)return;
//printf("a new nal:");
int len=n->len;
int type=n->nal_unit_type;
printf("len: %d ", len);
printf("nal_unit_type: %d\n",type);
fprintf(logf,"%d %d",len,type);
fputc('\n',logf);
}
将收集的数据,打印到文本文件,采用awk计算瞬时速率(instant_bandwidth)和累计速率(average_bandwidth)。bandwidth.awk:
BEGIN {
time_interval=0.04; #40ms
counter=0;
window=5
}
{
frame=$1;
frame_array[counter]=frame;
time_array[counter]=counter*time_interval
counter++
}
END {
accumulate_len=0;
instant_bitrate=0;
average_bitrate=0;
window_bitrate=0
window_accumulate=0;
for(i=0;i<counter;i++)
{
accumulate_len+=frame_array[i];
instant_bitrate=frame_array[i]*8/(time_interval*1024) ; #kbps
average_bitrate=accumulate_len*8/((i+1)*time_interval*1024);
if(i<window)
{
window_accumulate+=frame_array[i];
window_bitrate=window_accumulate*8/(time_interval*(i+1)*1024);
printf("%s %s %s %s\n",time_array[i],instant_bitrate,average_bitrate,window_bitrate);
}else if(i>counter-window)
{
printf("%s %s %s %s\n",time_array[i],instant_bitrate,average_bitrate," ");
}
else
{
window_accumulate=window_accumulate+frame_array[i]-frame_array[i-window];
window_bitrate=window_accumulate*8/(time_interval*window*1024);
printf("%s %s %s %s\n",time_array[i],instant_bitrate,average_bitrate,window_bitrate);
}
}
}
gnuplot绘图:
从[4]下载了720p的视频辛普森一家,格式MP4,采用ffmpeg提取h254码流,方法[5]。视频帧率23.98 fps,近似认为25帧,长宽1280x544。使用[3]提取nalu的长度信息。使用上述的awk脚本进行平均码率计算(我主要为了获取视频在网络中实时传输需要的带宽要求)。另,发现,数据行数过多的时候(我的数据超过了3000行),awk就没有输出。我就从原数据中截取了400多行。从图中可以看出,若是在网络中实时传输这段视频数据,平均也需要5M的传输带宽。这个计算结果与[6]中的数据基本一致、
[1]YUV CIF reference videos (lossless H.264 encoded)
[6]Test video quality 720p 1080p 1440p 2160p 4320p max bitrate which compresses youtube
推荐阅读