关闭

[置顶] ffmpeg透明贴图

标签: c++ffmpeg视频video
529人阅读 评论(0) 收藏 举报
分类:
//<span style="font-family: monospace; white-space: pre; background-color: rgb(240, 240, 240);">读取视频每帧的AVFrame,和图片的AVFrame,两个Frame都为RGBA格式,ChangeFMT为转换格式方法(通过sws_scale),通过data中的RGBA的数据进行贴图,alpha 为算出的图片的透明度,下面只写了贴图方法。注:只有RGBA格式中含有透明通道。转换格式方法请用ffmpeg自带的sws_scale</span>
{
AVFrame* fr = NULL;
do {
fr = renew_video_frame(frame);
if (!fr)
break;
int x, y, i, j, n = fr->linesize[0];


std::map<std::string, EffectParam>::iterator its = g_map.begin();
//将视频帧格式由yuv420p转换成RGBA
AVFrame* tempfrm = avcodec_alloc_frame();
tempfrm = ChangeFmt(fr, m_vstream->codec->pix_fmt, PIX_FMT_RGBA, m_vstream->codec->width, m_vstream->codec->height);

if (tempfrm == NULL)
{
printf("Change Format Error");
break;
}
//计算当前视频时间
double d_time = duration*(pcv_frames + 1);


for (its; its != g_map.end(); its++){
if (d_time >= its->second.time_start && d_time <= its->second.time_end)
{
AVFrame* picfr = av_frame_alloc();

int h = its->second.frm->height;
int w = its->second.frm->width;
int sw = m_vstream->codec->width;
int sh = m_vstream->codec->height;
int ofx = its->second.position_x;
int ofy = its->second.position_y;
double width = its->second.width;
double height = its->second.height;

//将读取的图片格式转成RGBA格式
picfr = ChangeFmt(its->second.frm, PIX_FMT_RGBA, PIX_FMT_RGBA, width, height);
if (picfr == NULL)
break;
uint8_t* ftbf = picfr->data[0];
unsigned int ftn = picfr->linesize[0];
unsigned int tempftn = tempfrm->linesize[0];

for (int y = 0; y < picfr->height; y++)
{
for (int x = 0; x < picfr->width; x++)
{
unsigned int ss = y*ftn + x * 4;
uint8_t* inds = &ftbf[ss];

//下面为有透明通道和不透明通道时的一个判断,但是这里用不到
/* if (inds[3] == 0xff)
{
if ((y + ofy) > tempfrm->height || (x + ofx) > tempfrm->width)
break;
i = (y + ofy)*tempftn + (x + ofx) * 4;


tempfrm->data[0][i] = picfr->data[0][ss];
tempfrm->data[0][i + 1] = picfr->data[0][ss + 1];
tempfrm->data[0][i + 2] = picfr->data[0][ss + 2];
tempfrm->data[0][i + 3] = picfr->data[0][ss + 3];
}
else
{*/
//下面为视频和图片的贴图的计算方法,通过RGBA四个通道计算。包含透明通道
int indtemp = picfr->data[0][ss + 3];//十六进制的透明通道的大小
if ((y + ofy) > tempfrm->height || (x + ofx) > tempfrm->width)
break;
double alpha = (double)indtemp / 255;<span style="white-space:pre">	</span>//透明度
i = (y + ofy)*tempftn + (x + ofx) * 4;
tempfrm->data[0][i] = alpha*(picfr->data[0][ss]) + (1 - alpha)*(tempfrm->data[0][i]);
tempfrm->data[0][i + 1] = alpha*(picfr->data[0][ss + 1]) + (1 - alpha)*(tempfrm->data[0][i + 1]);
tempfrm->data[0][i + 2] = alpha*(picfr->data[0][ss + 2]) + (1 - alpha)*(tempfrm->data[0][i + 2]);
tempfrm->data[0][i + 3] = picfr->data[0][ss + 3];
//}
}
}
}
}

//最后将RGBA转化成yuv420p就可以了
fr = ChangeFmt(tempfrm, PIX_FMT_RGBA, m_vstream->codec->pix_fmt, m_vstream->codec->width, m_vstream->codec->height);
if (fr == NULL)
{
printf("Change Format Error");
break;
}

if (fr)
av_frame_free(&fr);
}


0
0
查看评论

【Unity实用小方法】判断贴图是否为透明贴图

private bool JudgeTransparentPic(TextureFormat format) { //所有贴图格式带alpha通道的格式,带alpha通道的贴图才为透明贴图 string[] transparentFormat = ...
  • poda_
  • poda_
  • 2015-12-27 23:28
  • 2096

C++游戏之透明贴图(四)

上一章,我们已经知道了如何实现游戏动画,是不是很简单哇,这一章,我们就来说说如何透明贴图,我们知道GDI只支持BMP的位图,所以图片本身是不具备透明的,那么,我们如何来实现透明效果呢?很简单,这里介绍两种方式。        &#...
  • qq969422014
  • qq969422014
  • 2015-03-22 11:25
  • 1267

透明通道图纹理贴图渐变色效果

不带贴图(或贴图为纯白色)效果 Shader "YouXiDao/AlphaSimple" { Properties { _MainTex ("Texture", 2D) = "white" {} _Color("Main ...
  • u013354943
  • u013354943
  • 2016-08-30 14:41
  • 645

wince(windows mobile) 中win32 实现带透明背景的贴图按钮

在wince中也看到别人实现过贴图按钮,但多数是在MFC中继承CButton类实现的,很少有在Win32中直接实现的,在前人基础上写了个ImageButton类可以完成该功能,纯Win32实现的。       主要是实现描述如下:  &...
  • dream19861009
  • dream19861009
  • 2010-07-30 20:53
  • 5307

mental ray透明贴片无法渲染问题解决

因为项目里要渲染一些序列图的贴片模型 因为不需要写实又要快速,直接用mental ray渲染 但是两个透明贴图放在一起时居然没法渲染 还以为是设置或者图片模型出现问题了 后来发现是mental ray本身的一个限制mental ray 渲染器并不完全支持在后处理和图像文件输出中的“G 缓冲区”选项。...
  • shenmifangke
  • shenmifangke
  • 2017-01-18 14:56
  • 902

MFC 游戏贴图与透明特效的实现

对于一个游戏来说,画面的华丽程度在很大程度上决定了它的火热程度,记得以前初中时候我在网上找游戏玩时,首先看的就是画面是不是好看,技能是不是酷炫,呵呵。而精美游戏的实现就是通过贴图来实现啦,因此要想做出一个好游戏,光有Coder是不够的,必须要有给力的美工,当然还要有好的策划,好的数值设定什么的。不过...
  • szpp2016
  • szpp2016
  • 2017-04-06 13:56
  • 1007

基于MFC框架的C++游戏开发(三)游戏贴图与透明特效的实现

本系列文章由七十一雾央编写,转载请注明出处。 http://blog.csdn.net/u011371356/article/details/9313239 作者:七十一雾央 新浪微博:http://weibo.com/1689160943/profile?rightmod=1&wvr=...
  • hhr603894090
  • hhr603894090
  • 2017-12-20 17:51
  • 80

Unity导入模型一面有贴图另一面透明的解决方案

出现这种情况是因为模型用了双面材质,而Unity不支持双面材质。故导入模型到Unity中,会出现一面有贴图,另一面透明的情况。 解决方法: 1、自定义一个双面材质Shader,代码如下: Shader "Nature/Vegitation Vertex Lit" {...
  • sinat_24229853
  • sinat_24229853
  • 2015-01-08 11:55
  • 3749

【Unity Shaders】Transparency —— 使用alpha通道创建透明效果

本系列主要参考《Unity Shaders and Effects Cookbook》一书(感谢原书作者),同时会加上一点个人理解或拓展。这里是本书所有的插图。这里是本书所需的代码和资源(当然你也可以从官网下载)。========================================== ...
  • candycat1992
  • candycat1992
  • 2014-06-05 16:07
  • 50474

如何处理max透明树叶贴图渲染白边问题

本质原因是白色部分大于彩色的叶子的部分,所以缩小白色部分即可,将作为不透明贴图的黑百图中的白色区域缩小,方法是选中黑色选区扩大2个像素(选中黑色选区->选择->修改->扩大两个像素)
  • mlsj1314
  • mlsj1314
  • 2014-12-09 11:18
  • 2619
    个人资料
    • 访问:5650次
    • 积分:127
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:3篇
    • 译文:0篇
    • 评论:0条
    文章分类