FFmpeg 4.0.2 实现两个YUV序列拼接成一个YUV序列

博客展示了C++代码,并给出了实现效果。作者还表示若读者觉得文章不错,可自愿打赏,打赏将成为其更新的最大动力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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;
}

二、实现效果如下图所示:
这里写图片描述
*【注】如果你觉得此文不错,可以考虑打赏我哦,您的打赏将是我更新的最大动力,非常感谢。(打赏也是基于自愿原则的哦( ̄︶ ̄))

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值