緩衝:
是衝擊的力度減弱。 緩衝區(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);
}
複製代碼