1. 程式人生 > >FFmpeg 4.0.2 實現兩個YUV序列拼接成一個YUV序列

FFmpeg 4.0.2 實現兩個YUV序列拼接成一個YUV序列

一、C++程式碼:

/*
 * 兩個YUV拼接成一個YUV
 * FFmpeg4.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; }

二、實現效果如下圖所示:
這裡寫圖片描述