音視頻 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);
}
複製代碼
相關文章
相關標籤/搜索