欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

H264编码数据实时传输带宽需求

程序员文章站 2022-07-14 17:00:37
...

    获取的测试视频数据为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绘图:

H264编码数据实时传输带宽需求

     从[4]下载了720p的视频辛普森一家,格式MP4,采用ffmpeg提取h254码流,方法[5]。视频帧率23.98 fps,近似认为25帧,长宽1280x544。使用[3]提取nalu的长度信息。使用上述的awk脚本进行平均码率计算(我主要为了获取视频在网络中实时传输需要的带宽要求)。另,发现,数据行数过多的时候(我的数据超过了3000行),awk就没有输出。我就从原数据中截取了400多行。从图中可以看出,若是在网络中实时传输这段视频数据,平均也需要5M的传输带宽。这个计算结果与[6]中的数据基本一致、

H264编码数据实时传输带宽需求

[1]YUV CIF reference videos (lossless H.264 encoded)

[2]将H264码流打包成RTP包

[3]H264码流中SPS PPS详解

[4]H.264 Demo Clips

[5]用FFMPEG从MP4中提取H264视频

[6]Test video quality 720p 1080p 1440p 2160p 4320p max bitrate which compresses youtube

相关标签: H264 数据提取