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

  • 其宽度和高度
  • 其步幅(包括填充的线的总宽度),对于Y和UV分量,与NV12规范中的
  • 相同
  • 我知道Y的起点,U的起点是Y +(步幅*高度),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:宽度* 4我猜是吗?

  • 任何帮助表示赞赏。

    最佳答案

    /// 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);
    

    08-25 10:16