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;icounter-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编码数据实时传输带宽需求_第1张图片

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

H264编码数据实时传输带宽需求_第2张图片

使用webrtc捕获视频,采用x264编码[7],fps=22,视频为720p(1280x720),计算编码器的码率变化:

H264编码数据实时传输带宽需求_第3张图片

[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

[7] webrtc-learn

你可能感兴趣的:(仿真,webrtc)