缓冲:
是冲击的力度减弱。 缓冲区(buffer)
,它是内存空间的一部分。也就是说,在内存空间中预留了必定的存储空间,这些存储空间用来缓冲输入或输出的数据
,这部分预留的空间就叫作缓冲区,显然缓冲区是具备必定大小的。编程
为何要引入缓冲区:
高速设备与低速设备的不匹配,势必会让高速设备花时间等待低速设备,咱们能够在这二者之间设立一个缓冲区
。 缓冲区做用①:
能够解除二者的制约关系,数据能够直接送往缓冲区,高速设备不用再等待低速设备。(好比打印机打印文档) 缓冲区做用②:
能够减小数据的读写次数,保护磁盘的寿命。(好比 IO 操做)markdown
上下文
这个东西不是一个具体的东西,上下文
在不一样的地方表示不一样的含义,要感性理解。文章的上下文
是一个意思,再通俗一点,我以为叫环境更好。.... 林冲大叫一声“啊也!” ....app
问:这句话林冲的“啊也”表达了林冲怎样的内心?ide
答:啊你妈个头啊!ui
上下文
来判断。思路
建立上下文 → 将数据加载到输入缓冲区 → sws_scale()转换数据 → 将数据装载到输出缓冲区typedef struct {
char *pixels;
int width;
int height;
AVPixelFormat format;
} RawVideoFrame;
void FFmpegs::convertRawVideo(RawVideoFrame &in, RawVideoFrame &out) {
// 上下文
SwsContext *ctx = nullptr;
// 输入、输出缓冲区(指向每个平面的数据)
uint8_t *inData[4], *outData[4];
// 每一个平面的大小
int inStrides[4], outStrides[4];
// 每一帧图片的大小
int inFrameSize, outFrameSize;
// 返回结果
int ret = 0;
// 建立上下文
ctx = sws_getContext(in.width, in.height, in.format,
out.width, out.height, out.format,
SWS_BILINEAR, nullptr, nullptr, nullptr);
if (!ctx) {
qDebug() << "sws_getContext error";
goto end;
}
// 输入缓冲区
ret = av_image_alloc(inData, inStrides, in.width, in.height, in.format, 1);
END(av_image_alloc)
// 输出缓冲区
ret = av_image_alloc(outData, outStrides, out.width, out.height, out.format, 1);
// 计算每一帧图片的大小
inFrameSize = av_image_get_buffer_size(in.format, in.width, in.height, 1);
outFrameSize = av_image_get_buffer_size(out.format, out.width, out.height, 1);
// 拷贝输入数据
memcpy(inData[0], in.pixels, inFrameSize);
// 转换
sws_scale(ctx, inData, inStrides, 0, in.height, outData, outStrides);
// 写到输出文件中去
out.pixels = (char*) malloc(outFrameSize);
memcpy(out.pixels, outData[0], outFrameSize);
end:
av_freep(&inData[0]);
av_freep(&outData[0]);
sws_freeContext(ctx);
}
复制代码