我一直在嘗試將YUYV原始文件轉換爲C++中的YUV420原始文件。格式記錄在YUV Formats Page中。我的輸出文件在轉換後顯示爲綠色。我採用Experts Exchange的源代碼,從YUYV轉換而不是UYVY。這是我的源代碼:將V4L2_PIX_FMT_YUYV(YUV 4:2:2)轉換爲V4L2_PIX_FMT_YVU420(YUV 4:2:0)
void conv422to420(uint8_t* src, uint8_t* dst)
{
uint8_t* pyFrame = dst;
uint8_t* puFrame = pyFrame + width_*height_; // Cb
uint8_t* pvFrame = puFrame + width_*height_/4; // Cr
int uvOffset = width_ * 2 * sizeof(uint8_t);
int i,j;
for(i=0; i<height_-1; i++)
{
for(j=0; j<width_; j+=2)
{
auto evenRow = ((i&1) == 0);
*pyFrame++ = *src++;
++src;
uint16_t calc;
if (evenRow)
{
calc = *src;
calc += *(src + uvOffset);
calc /= 2;
*pvFrame++ = (uint8_t) calc;
}
*pyFrame++ = *src++;
++src;
if (evenRow)
{
calc = *src;
calc += *(src + uvOffset);
calc /= 2;
*puFrame++ = (uint8_t) calc;
}
}
}
}
一般我把兩個U的平均值和兩個V值在兩個相鄰行中YUYV是在YUV420的值。我只是不確定是否「平均」是做這件事的正確方法。因爲我用
的ffmpeg -y -r -f 25.0 -s rawvideo 1280×720 -pix_fmt yuyv422 -i yuyv422.yuv -pix_fmt YUV420P -f rawvideo -r -s 25.0 1280x720的-v調試yuv420p.yuv
成功生成YUV420原始文件,我自己的輸出文件的diff與U和Y通道中生成的ffmpeg大不相同。
所以我的問題是,有沒有這種轉換的開源解決方案?我的解決方案有什麼問題?