音视频 day20 图像的像素格式转换

1. 缓冲是什么?缓冲区是什么?(超级重要)

缓冲:是冲击的力度减弱。 缓冲区(buffer),它是内存空间的一部分。也就是说,在内存空间中预留了必定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫作缓冲区,显然缓冲区是具备必定大小的。编程

2. 为何要引入缓冲区?缓冲区的具体 2 个做用?(超级重要)

为何要引入缓冲区:高速设备与低速设备的不匹配,势必会让高速设备花时间等待低速设备,咱们能够在这二者之间设立一个缓冲区缓冲区做用①:能够解除二者的制约关系,数据能够直接送往缓冲区,高速设备不用再等待低速设备。(好比打印机打印文档) 缓冲区做用②:能够减小数据的读写次数,保护磁盘的寿命。(好比 IO 操做)markdown

3. 编程中的 Context(上下文)是什么含义?

  • 上下文这个东西不是一个具体的东西,上下文在不一样的地方表示不一样的含义,要感性理解。
  • context 其实说白了,和文章的上下文是一个意思,再通俗一点,我以为叫环境更好。

.... 林冲大叫一声“啊也!” ....app

问:这句话林冲的“啊也”表达了林冲怎样的内心?ide

答:啊你妈个头啊!ui

  • 看一篇文章,给你摘录一段,没前没后,你读不懂,由于有语境,就是语言环境存在,一段话说了什么,要经过上下文来判断。
  • 子程序之于程序,进程之于操做系统,甚至app的一屏之于app,都是一个道理。
  • app点击一个按钮进入一个新的界面,也要保存你是在哪一个屏幕跳过来的等等信息,以便你点击返回的时候能正确跳回,若是不存确定就没法正确跳回了。(这就是上下文的经典例子)

4. 图片的像素格式转换关键代码以下(转换一帧)

  • 思路 建立上下文 → 将数据加载到输入缓冲区 → 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);
}
复制代码
相关文章
相关标签/搜索