ffmpeg movie滤镜添加图片水印

今天讲解往视频里面添加图片水印,命令行如下所示:

ffmpeg.exe -i E:\learn\ffmpeg\convert\out2345678.mp4 -vf "movie=filename='E\:\\learn\\ffmpeg\\convert\\flower.jpg'[watermask];[in][watermask]overlay=100:100[out]" e:\learn\ffmpeg\convert\out2345678_convert.mp4

这里面我需要说下路径问题,:在滤镜里面是特殊的存在,用于同一滤镜不同参数之间的间隔,windows的路径含有:,所以需要进行转义,前面加\,这里面的对于路径分隔符\,前面也需要加\用来转义,就成了两个\。

如果路径写成下面这种,是绝对不行的。

ffmpeg.exe -i E:\learn\ffmpeg\convert\out2345678.mp4 -vf "movie=filename='E\:\learn\ffmpeg\convert\flower.jpg'[watermask];[in][watermask]overlay=100:100[out]" e:\learn\ffmpeg\convert\out2345678_convert.mp4

此时报错信息如下:
在这里插入图片描述

一看就是少了路径反斜杠\。

下面说下代码里面的实现,首先我们看下main函数

int main()
{
   
   
	CDrawMovie cVideoDrawMovie;
	const char *pFileA = "E:\\learn\\ffmpeg\\FfmpegFilterTest\\x64\\Release\\in-computer.mp4";

	const char *pFileOut = "E:\\learn\\ffmpeg\\FfmpegFilterTest\\x64\\Release\\in-computer_drawmovie.mp4";

	std::string strMovieFile = "E\\:\\\\learn\\\\ffmpeg\\\\convert\\\\flower.jpg";
	//std::string strMovieFile = "flower.jpg";
	cVideoDrawMovie.StartDrawMovie(pFileA, pFileOut, 100, 300, strMovieFile);
	cVideoDrawMovie.WaitFinish();
	return 0;
}

其中strMovieFile = “E\:\\learn\\ffmpeg\\convert\\flower.jpg”,反斜杠很多,这个是一定要的,首先代码里面写成E\:\\learn\\ffmpeg\\convert\\flower.jpg,实际对应的字符串就是
E:\learn\ffmpeg\convert\flower.jpg,然后再放到滤镜里面转义,这跟命令行是一致的。

下面我们再看下滤镜解析字符串:

_snprintf(szFilterDesc, sizeof(szFilterDesc),
			"movie=filename=\'%s\'[movie0];[in0][movie0]overlay=%d:%d[out]",
			strMovieFile.c_str(), x, y);

其中属性filename也可以去掉

之前我曾写过一篇博客ffmpeg代码实现往视频文件里面叠加文字
其中,滤镜drawtext的参数如下:

char szFilterDesc[512] = {
   
    0 };

std::string strFontFile;

strFontFile = "E\:\\learn\\ffmpeg\\ffmpeg_x264_freetype_static\\bin\\zihun152hao-jijiachaojihei.ttf";

_snprintf(szFilterDesc, sizeof(szFilterDesc),
	"fontcolor=blue:fontsize=%d:fontfile=\'%s\':text=\'%s\':x=%d:y=%d",
	iFontSize, strFontFile.c_str(), strText.c_str(), x, y);

InitFilter(szFilterDesc);

大家看下,这里面的strFontFile并没有那么多的反斜杠\,但是最终的执行结果ok,这是为何,这是因为本文,本人用的是avfilter_graph_parse_ptr进行滤镜的连接。
而在drawtext滤镜的博客中,本人用的是avfilter_link进行滤镜的连接。

代码结构如下:
在这里插入图片描述
其中FfmpegMovieTest.cpp的内容如下:

#include <iostream>
#include "DrawMovie.h"
#include <vector>

#ifdef	__cplusplus
extern "C"
{
   
   
#endif

#pragma comment(lib, "avcodec.lib")
#pragma comment(lib, "avformat.lib")
#pragma comment(lib, "avutil.lib")
#pragma comment(lib, "avdevice.lib")
#pragma comment(lib, "avfilter.lib")
#pragma comment(lib, "postproc.lib")
#pragma comment(lib, "swresample.lib")
#pragma comment(lib, "swscale.lib")


#ifdef __cplusplus
};
#endif



std::string Unicode_to_Utf8(const std::string & str)
{
   
   
	int nwLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
	wchar_t * pwBuf = new wchar_t[nwLen + 1];//一定要加1,不然会出现尾巴 
	ZeroMemory(pwBuf, nwLen * 2 + 2);
	::MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), pwBuf, nwLen);
	int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL);
	char * pBuf = new char[nLen + 1];
	ZeroMemory(pBuf, nLen + 1);
	::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);
	std::string retStr(pBuf);
	delete[]pwBuf;
	delete[]pBuf;
	pwBuf = NULL;
	pBuf = NULL;
	return retStr;
}


int main()
{
   
   
	CDrawMovie cVideoDrawMovie;
	const char *pFileA = "E:\\learn\\ffmpeg\\FfmpegFilterTest\\x64\\Release\\in-computer.mp4";

	const char *pFileOut = "E:\\learn\\ffmpeg\\FfmpegFilterTest\\x64\\Release\\in-computer_drawmovie.mp4";

	std::string strMovieFile = "E\\:\\\\learn\\\\ffmpeg\\\\convert\\\\flower.jpg";
	//std::string strMovieFile = "flower.jpg";
	cVideoDrawMovie.StartDrawMovie(pFileA, pFileOut, 100, 300, strMovieFile);
	cVideoDrawMovie.WaitFinish();
	return 0;
}



DrawMovie.h的内容如下

#pragma once

#include <Windows.h>
#include <string>

#ifdef	__cplusplus
extern "C"
{
   
   
#endif
<think>我们正在处理用户关于如何使用FFmpeg在视频中添加图片水印的问题。根据提供的引用内容,我们可以总结出几种方法。 引用[1]给出了一个给图片添加水印的命令,我们可以类比用于视频。引用[2]和[3]则直接针对视频添加图片水印。 方法一(类似引用[1]的方式,但用于视频): 命令格式:ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:10" output.mp4 解释:这里input.mp4是输入视频,watermark.png是水印图片,overlay=10:10表示水印放在视频左上角,距离左边10像素,距离顶部10像素。 方法二(引用[2]的方式): 命令格式:ffmpeg -i inputfile -vf "movie=marklogo.png,scale=100:100[watermask]; [in][watermask] overlay=50:50 [out]" -y outfile 解释:这里使用了movie滤镜加载水印图片,并调整水印大小(scale=100:100),然后通过overlay将水印放置在(50,50)的位置。 方法三(引用[3]中描述的方式,但未给出具体命令,我们可以结合前两种): 实际上,方法一和方法二都是常用的方法。方法一更简洁,方法二可以在同一个滤镜图中完成多个操作(比如调整水印大小)。 我们还可以对水印的位置进行调整,比如: 右上角:overlay=main_w-overlay_w-10:10 左下角:overlay=10:main_h-overlay_h-10 右下角:overlay=main_w-overlay_w-10:main_h-overlay_h-10 另外,我们可能还需要注意水印图片的格式(最好使用带透明通道的PNG图片)以及水印持续的时间(默认是整个视频时长)。 如果希望水印只在某个时间段出现,可以使用enable选项,例如: ffmpeg -i input.mp4 -i watermark.png -filter_complex "[0:v][1:v]overlay=10:10:enable='between(t,5,10)'" output.mp4 表示水印只在第5秒到第10秒出现。 根据用户需求,我们给出一个基本示例和几个变种。 基本示例:在视频的左上角添加水印 命令:ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:10" output.mp4 调整水印大小并放置在右下角: 命令:ffmpeg -i input.mp4 -i watermark.png -filter_complex "[1:v]scale=100:100[wm];[0:v][wm]overlay=main_w-overlay_w-10:main_h-overlay_h-10" output.mp4 注意:在调整水印大小时,我们先将水印图片缩放为100x100,然后将其叠加到视频的右下角(距离右边和底边各10像素)。 如果水印图片有透明部分,FFmpeg会自动处理透明叠加。 最后,我们生成相关问题。</think>### 如何在视频中添加图片水印FFmpeg添加图片水印的核心方法是使用 `overlay` 滤镜。以下是详细操作步骤和示例命令: #### 1. **基础水印添加** ```bash ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:10" output.mp4 ``` - **参数说明**: - `overlay=10:10`:水印位置(距离左边缘10像素,上边缘10像素) - 水印图片(如 PNG)会自动保留透明通道 #### 2. **调整水印位置** 通过坐标控制位置: ```bash # 右下角(视频宽度-水印宽度-边距) ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=main_w-overlay_w-20:main_h-overlay_h-10" output.mp4 ``` - `main_w`/`main_h`:视频宽高 - `overlay_w`/`overlay_h`:水印宽高 #### 3. **缩放水印尺寸** ```bash ffmpeg -i input.mp4 -i watermark.png -filter_complex "[1]scale=120:80[wm]; [0][wm]overlay=30:20" output.mp4 ``` - `scale=120:80`:将水印缩放到120×80像素 - `[wm]`:定义缩放后的水印变量名 #### 4. **动态水印(随时间移动)** ```bash ffmpeg -i input.mp4 -i logo.png -filter_complex "[0][1]overlay=x='if(gte(t,2), -w+(t-2)*200, NAN)':y=10" output.mp4 ``` - 水印从第2秒开始,以每秒200像素速度从左向右移动 #### 5. **半透明水印** ```bash ffmpeg -i input.mp4 -i watermark.png -filter_complex "[1]format=rgba, colorchannelmixer=aa=0.5[trans]; [0][trans]overlay=10:10" output.mp4 ``` - `colorchannelmixer=aa=0.5`:设置透明度为50% #### 注意事项: 1. **水印格式**:推荐使用 PNG 格式保留透明通道 2. **位置计算**:使用 `main_w-overlay_w` 确保动态适应不同分辨率 3. **性能影响**:复杂滤镜可能增加处理时间,建议先测试片段 > 示例效果:水印将叠加在视频帧上,类似电视台台标效果[^1][^2]。处理流程包含视频解码、水印合成、重新编码三个核心步骤[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值