ffmpeg实例,alphamerge实现溶图效果


ffmpeg命令目录


对应Android中的PorterDuffXfermode 和 BitmapShader

Android中的UI实现溶图效果

遮罩图

在这里插入图片描述

原图

在这里插入图片描述

合成效果,同样适用于视频的溶图

在这里插入图片描述

合成命令

ffmpeg -i ceshi2.png -i mask.png -filter_complex [1:v]alphaextract[mask];[0:v][mask]alphamerge -y out.png

注意的是:
两个输入源(这里是两个图片)的尺寸要一致,如果不一致的话,可以在滤镜中先用scale命令缩放到一致的大小。

alphaextract

可以提取一个透明图中的透明通道。
黑色代表透明,白色代表不透明。

ffmpeg -i mask.png -vf alphaextract -y extract.png

在这里插入图片描述

alphamerge

可以将透明通道图,和另一个素材图合并。实现最终的效果。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是一个使用C语言调用FFmpeg的简单实例: ```c #include <stdio.h> #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libavutil/imgutils.h> #include <libswscale/swscale.h> int main() { // 注册所有的FFmpeg组件 av_register_all(); // 打开输入文件 AVFormatContext *formatContext = NULL; if (avformat_open_input(&formatContext, "input.mp4", NULL, NULL) != 0) { printf("无法打开输入文件\n"); return -1; } // 获取流信息 if (avformat_find_stream_info(formatContext, NULL) < 0) { printf("无法获取流信息\n"); return -1; } // 寻找视频流 int videoStreamIndex = -1; for (int i = 0; i < formatContext->nb_streams; i++) { if (formatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { videoStreamIndex = i; break; } } if (videoStreamIndex == -1) { printf("无法找到视频流\n"); return -1; } // 获取视频解码器 AVCodecParameters *codecParameters = formatContext->streams[videoStreamIndex]->codecpar; AVCodec *codec = avcodec_find_decoder(codecParameters->codec_id); if (codec == NULL) { printf("无法找到解码器\n"); return -1; } // 创建解码器上下文 AVCodecContext *codecContext = avcodec_alloc_context3(codec); if (avcodec_parameters_to_context(codecContext, codecParameters) < 0) { printf("无法创建解码器上下文\n"); return -1; } // 打开解码器 if (avcodec_open2(codecContext, codec, NULL) < 0) { printf("无法打开解码器\n"); return -1; } // 读取视频帧 AVPacket packet; while (av_read_frame(formatContext, &packet) >= 0) { if (packet.stream_index == videoStreamIndex) { // 解码视频帧 AVFrame *frame = av_frame_alloc(); int response = avcodec_send_packet(codecContext, &packet); if (response < 0) { printf("解码出错\n"); break; } response = avcodec_receive_frame(codecContext, frame); if (response == AVERROR(EAGAIN) || response == AVERROR_EOF) { av_frame_free(&frame); continue; } else if (response < 0) { printf("解码出错\n"); break; } // 处理视频帧 printf("解码视频帧,宽度:%d,高度:%d\n", frame->width, frame->height); av_frame_free(&frame); } av_packet_unref(&packet); } // 清理资源 avcodec_free_context(&codecContext); avformat_close_input(&formatContext); return 0; } ``` 在这个示例中,我们使用了FFmpeg库来打开输入文件("input.mp4"),获取视频流信息,寻找视频流,并将视频帧进行解码和处理。你可以根据你的需求进行进一步的操作,比如对解码后的视频帧进行渲染或保存等。 请确保已经正确安装了FFmpeg库,并在编译时链接了相关的库文件(如libavcodec、libavformat等)。你可以使用如下命令进行编译: ```shell gcc -o ffmpeg_example ffmpeg_example.c -lavcodec -lavformat -lavutil -lswscale ``` 编译完成后,你可以运行生成的可执行文件来执行示例程序。请将输入文件("input.mp4")放置在可执行文件所在的目录中。 希望这个示例能帮助你开始使用C语言调用FFmpeg进行视频处理。如有需要,你可以根据实际情况进行进一步的定制和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值