FFmpeg 4.0.2 實現兩個YUV序列拼接成一個YUV序列
阿新 • • 發佈:2018-11-06
一、C++程式碼:
/*
* 兩個YUV拼接成一個YUV
* FFmpeg:4.0.2
*/
int YUVCombine(AVFrame *srcFrame1, AVFrame *srcFrame2, AVFrame *dstFrame, int dstWidth, int dstHeight)
{
// 合成後得到的幀
int nDstSize = av_image_get_buffer_size(AV_PIX_FMT_YUV420P, dstWidth * 2, dstHeight, 1);
uint8_t *dstbuf = (uint8_t *)av_malloc(nDstSize);
av_image_fill_arrays(dstFrame->data , dstFrame->linesize, dstbuf, AV_PIX_FMT_YUV420P, dstWidth * 2, dstHeight, 1);
if (srcFrame1 && srcFrame2)
{
int nYIndex = 0, nUVIndex = 0;
for (int i = 0; i < dstHeight; i++)
{
//Y
memcpy(dstFrame->data[0] + i * dstWidth * 2, srcFrame1->data [0] + nYIndex * dstWidth, dstWidth);
memcpy(dstFrame->data[0] + dstWidth + i * dstWidth * 2, srcFrame2->data[0] + nYIndex * dstWidth, dstWidth);
nYIndex++;
}
for (int i = 0; i < dstHeight / 4; i++)
{
//U
memcpy(dstFrame->data [1] + i * dstWidth * 2, srcFrame1->data[1] + nUVIndex * dstWidth, dstWidth);
memcpy(dstFrame->data[1] + dstWidth + i * dstWidth * 2, srcFrame2->data[1] + nUVIndex * dstWidth, dstWidth);
//V
memcpy(dstFrame->data[2] + i * dstWidth * 2, srcFrame1->data[2] + nUVIndex * dstWidth, dstWidth);
memcpy(dstFrame->data[2] + dstWidth + i * dstWidth * 2, srcFrame2->data[2] + nUVIndex * dstWidth, dstWidth);
nUVIndex++;
}
}
return 0;
}
二、實現效果如下圖所示: