赞
踩
本文主要补充基础概念,在设置编码器的时候,参数设置不对,录制的屏幕就会出现花屏。所以梳理了基础知识,就知道哪里设置不对了。
如下是ffmpeg自带的sample,encode_video的例子,选取H264的编码器,进行编码。
const AVCodec *codec;
AVCodecContext *c= NULL;
/* find the mpeg1video encoder */
codec = avcodec_find_encoder_by_name(codec_name);
c = avcodec_alloc_context3(codec);
/* put sample parameters */
c->bit_rate = 400000;
/* resolution must be a multiple of two */
c->width = 352;
c->height = 288;
/* frames per second */
c->time_base = (AVRational){1, 25};
c->framerate = (AVRational){25, 1};
/* emit one intra frame every ten frames
* check frame pict_type before passing frame
* to encoder, if frame->pict_type is AV_PICTURE_TYPE_I
* then gop_size is ignored and the output of encoder
* will always be I frame irrespective to gop_size
*/
c->gop_size = 10;
c->max_b_frames = 1;
c->pix_fmt = AV_PIX_FMT_YUV420P;
if (codec->id == AV_CODEC_ID_H264)
av_opt_set(c->priv_data, "preset", "slow", 0);
/ * open it */
ret = avcodec_open2(c, codec, NULL);
其中,c->bit_rate = 400 000; 一直不知道怎么来的,导致录制屏幕花屏。下面整理了基础知识,才知道这个东西是怎么来的,以及如何设置。
一、像素
通常说的像素,一般指图像含有多少个像素点。
720P: 实际像素是1280x720,相乘结果921600, 即有921600个像素点,也就是常说的100万像素
1080P:实际像素是1920x1080,相乘结果2073600,即有2073600个像素点,也就是常说的200万像素
二、图像占用空间大小计算
公式:图像像素数 * 图像位深 / 8 = 占用字节。一个像素点占用8位。
比如:一张图片像素为:1024x1024,位深32位,则图像大小为:1024102432/8=4194304byte = 4KB 1024102432/8=4MB
三、分辨率
分辨率是指设备输出分辨率或叫屏幕 分辨率,即屏幕上横竖有多少个容器点,每个容器点用于容纳一个像素。说人话就是:屏幕的像素点总和。比如某手机分辨率为720*640, 给它播放1080P的视频,根本不能发挥1080P的优势。
常见的视像分辨率有352×288,176×144,640×480,1024×768
四、密度
每英寸包含多少个像素点,单位PPI(pixel per inch).
根据公式,就可以计算出,这个5.8寸的手机的PPI是多少。PPI超过300就可以算是视网膜屏了,肉眼已经分辨不出像素点来。
四、码流(data rate):
是指视频文件在单位时间内使用的数据流量,也叫码率,经过视频压缩后每秒产生的数据量,而压缩是去掉图像的空间冗余和视频的时间冗余,是视频编码中画面质量控制中最重要的部分。同样分辨率下,视频文件的码流越大,压缩比就越小,画面质量就越高。
码流越大,说明单位时间内取样率越大,数据流的精度就越高,处理出来的文件就越接近原始文件,画面质量越好,画质越清晰,要求播放设备的解码能力也越高。
对应ffmpeg中的就是 c->bit_rate。单位kb/s 或Mb/s。
在开发过程中,如果一帧图像的尺寸设置成:352388,20帧/秒, 35238820=2 731 520b/s(压缩前), 所以压缩后 bit_rate = 400 000, 则画面清晰,且录制的视频也比较小。如果尺寸设置成1280720,则bit_rate需要设置大一些,比如设置成800 000, 此时画面才会清晰,如果依然设置成400000,则画面非常模糊,像打马赛克一样。 当尺寸改大,且bit_rate设置大时,录制的视频文件也会偏大。
六、视频文件大小的计算
视频文件大小:(音频码率+视频码率)*时长/8 。 前面单位是kbit, 体积单位也是kb
如果一个视频码率为3Mbps, 音频码率为512Kbps,时长是90分钟(5400秒),那么整个文件大小就是: (3+512/1024)* 5400/8=2362.5MB=2.307G
一个视频文件的大小为5.86M,播放时长为3分7秒: 则该文件对应的码流就是:5.86 * 1024 * 1024 * 8 / (3 * 60 + 7) =262872.95657754bps=262.873Kbps=0.263Mbps
通过上面的分析,可以看出,码率对视频文件的大小,影响很关键呀!
七、帧速率
帧速率(画面的实时性、流畅性),指每秒钟刷新的图片的帧数。也可以理解为图形处理器每秒钟能够刷新几次。对视频内容而言,帧速率指每秒所显示的静止帧格数。要生成平滑连贯的动画效果,帧速率一般不小于8;而电影的帧速率为24fps。捕捉动态视频内容时,此数字愈高愈好。
八、比特率
比特率是指每秒钟传送的比特(bite)数。单位为bps(Bit Per Second)。比特率越高,单位时间传送的数据量越大。比特率表示经过编码(压缩)后的音、视频数据每秒钟需要用多少个比特来表示。
九、例子
不同参数,导致的巨大差异,主要是文件大小的差异,太大了。我们都希望高清且体积小的文件,但是参数调节不好,就不能得到理想的效果。可以看到,录屏的话,帧率不用很大,这时候,需要的码率也就不大,然后文件体积就小了。前提是,这种录制的效果,是自己可以接受的。
以上内容,是在处理音视频过程中遇到的基础知识,整理学习用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。