如何使用ffmpeg的swscale将NV12转换为RGB32?

时间:2013-04-19 19:22:24

标签: c++ video ffmpeg

假设我在内存中有一个NV12帧作为字节数组。我知道:

  • 其宽度和高度
  • 其Stride(包括填充的线的总宽度),根据NV12规范,Y和UV组件相同
  • 我知道Y开始的地方,U从Y +(Stride * Height)开始,V从U + 1开始(与U交错)。

现在这就是我到目前为止:

SwsContext* context = sws_getContext(frameWidth, frameHeight, AV_PIX_FMT_NV12, frameWidth, frameHeight, AV_PIX_FMT_RGB32, 0, nullptr, nullptr, nullptr);
sws_scale(context, 

所以我不知道sws_scale应该是什么参数:

  • srcSlice:指向字节数组的指针?它应该显然是一个 指向指针的指针,但我所拥有的仅仅是一维的 字节数组。
  • srcStride:显然需要一系列步幅,但我对整个文件只有一步。我应该只使用一个数组 一个元素?
  • srcSliceY:我猜到第一个字节的偏移量?那应该是0。
  • srcSliceH:我估计的帧高
  • dst:再次指向指针,但我的目标输出实际上只是另一个字节数组......
  • dstStride:Width * 4我猜?

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:3)

/// uint8_t * Y;
/// uint8_t * out;

// 2 planes for NV12: Y and interleaved UV
uint8_t * data[2] = {Y, Y + Stride * Height}; 

// Strides for Y and UV
// U and V have Stride/2 bytes per line; 
// Thus, we have 2 * Stride/2 bytes per line in UV plane
int linesize[2] = {Stride, Stride}; 

uint8_t * outData[1] = {out}; // RGB have one plane 
int outLinesize[1] = {frameWidth*4}; // RGB32 Stride

sws_scale(context, data, linesize, 0, Height, outData, outLinesize);