利用ffmpeg实现添加图片水印和文字水印,添加多个水印。代码和命令实现及中文水印乱码
2017-10-17 10:38
645 查看
ffmpeg中文水印乱码两种原因
1.字符编码格式原因,中文必须是utf8编码格式的(我遇到的问题,在vs2013上写的中文,已做编码格式转码,放到centos7.2上编译运行也会出现中文乱码的问题,在Linux上把中文水印重新输入一遍就OK了)
2.字体文件fontfile原因,最好去C:\Windows\Fonts目录下去找,比如说宋体,黑体这些是不会乱码的
1.ffmpeg命令添加视频水印
ffmpeg –i input.flv -acodec copy-vcodec copy -vf "movie=test.png[watermark];[in][watermark]overlay=10:10:1[out]" output.flv
-i input.flv 表示要进行水印添加处理的视频
-acodec copy-vcodec copy表示保持音视频编码不变
-b 300k 表示处理视频的比特率
-vf “…” 中间便是水印处理参数,movie是指图片水印路径,搭配overlay一起使用,重要的是overlay=后面的部分,第一个参数表示水印距离视频左边的距离,第二个参数表示水印距离视频上边的距离,第三个参数 为1,表示支持透明水印。使用透明的png图片进行视频编码后,成功获得带透明水印的视频,并且画质也比较好。详情请见:https://ffmpeg.org/ffmpeg-filters.html#overlay-1
output.flv 处理后的视频
ffmpeg命令添加文字水印
ffmpeg -i input.flv -vf "drawtext=fontfile=simhei.ttf: text='雷':x=100:y=10:fontsize=24:fontcolor=yellow:shadowy=2" drawtext.mp4
文字水印filter是drawtext,首先要有simhei.ttf这个文件,可以去网上下载,也可以去C:\Windows\Fonts\目录下去找,text是文字内容,
x:y是显示位置,fontsize文字大小,fontcolor文字颜色
详情请看https://ffmpeg.org/ffmpeg-filters.html#drawtext-1
2.ffmpeg代码实现文字和图片水印
代码就不重复粘贴上来了,因为网上好多这种demo,推荐使用雷霄华博士的:http://blog.csdn.net/leixiaohua1020/article/details/29368911
{
// 图片水印
sprintf(filter_spec, "movie=test.png[wm];[in][wm]overlay=10:10,scale=1920:1080[out]");
}
{
// MB转换为utf-8,文字水印的话,文字水印必须是utf8编码的
//string strCharacterInfoUTF8 = CMarkup::AToUTF8(stGetTaskRespInfo.watermark.characterInfo);
// 文字水印
sprintf(filter_spec, "[in]drawtext=fontfile=simhei.ttf:fontcolor=red:x=10:y=10:fontsize = 30 : text='123',scale=640:360[out]");
}
雷霄华博士的添加水印demo中init_filters()函数内将上述相关代码添加进去就OK了!
相关说明:
1.drawtext必须依赖libfreetype画字库,libfontconfig字体库两个库
scale分辨率filter,overlay图片水印filter
2.文字水印的话,文字水印必须是utf8编码的,不然会是乱码
3.字体文件fontfile,最好去C:\Windows\Fonts目录下去找,找一些中文的字体,不然可能也会导致乱码
ffmpeg支持添加多个水印:例如同时
1.同时添加图片水印与文字水印:
sprintf(filter_spec,"[in]drawtext=x=0:y=300:text="HelloWorld"[text];movie=/Test.png[wm];[text][wm]overlay=0:0,scale=1920:1080[out]");
2.同时添加两个图片水印:sprintf(filter_spec,"movie=../test.png[wm1];movie=../test.png[wm2];[in][wm1]overlay=0:0,scale=1920:1080[a];[a][wm2]overlay=0:300,scale=1920:1080[out]");3.同时添加两个文字水印:sprintf(filter_spec,"[in]drawtext=fontfile=simhei.ttf:x=0:y=0:fontsize=30:text='123',scale=1920:1080[a];[a]drawtext=fontfile=simhei.ttf:x=0:y=100:fontsize = 30 : text = '123',scale=1920:1080[out]");
但是添加多个水印有一个问题:两个水印高宽似乎不一样,不知道什么原因,知道的朋友还请指点一下,谢谢具体参数详情请看https://ffmpeg.org/ffmpeg-filters.html
1.字符编码格式原因,中文必须是utf8编码格式的(我遇到的问题,在vs2013上写的中文,已做编码格式转码,放到centos7.2上编译运行也会出现中文乱码的问题,在Linux上把中文水印重新输入一遍就OK了)
2.字体文件fontfile原因,最好去C:\Windows\Fonts目录下去找,比如说宋体,黑体这些是不会乱码的
1.ffmpeg命令添加视频水印
ffmpeg –i input.flv -acodec copy-vcodec copy -vf "movie=test.png[watermark];[in][watermark]overlay=10:10:1[out]" output.flv
-i input.flv 表示要进行水印添加处理的视频
-acodec copy-vcodec copy表示保持音视频编码不变
-b 300k 表示处理视频的比特率
-vf “…” 中间便是水印处理参数,movie是指图片水印路径,搭配overlay一起使用,重要的是overlay=后面的部分,第一个参数表示水印距离视频左边的距离,第二个参数表示水印距离视频上边的距离,第三个参数 为1,表示支持透明水印。使用透明的png图片进行视频编码后,成功获得带透明水印的视频,并且画质也比较好。详情请见:https://ffmpeg.org/ffmpeg-filters.html#overlay-1
output.flv 处理后的视频
ffmpeg命令添加文字水印
ffmpeg -i input.flv -vf "drawtext=fontfile=simhei.ttf: text='雷':x=100:y=10:fontsize=24:fontcolor=yellow:shadowy=2" drawtext.mp4
文字水印filter是drawtext,首先要有simhei.ttf这个文件,可以去网上下载,也可以去C:\Windows\Fonts\目录下去找,text是文字内容,
x:y是显示位置,fontsize文字大小,fontcolor文字颜色
详情请看https://ffmpeg.org/ffmpeg-filters.html#drawtext-1
2.ffmpeg代码实现文字和图片水印
代码就不重复粘贴上来了,因为网上好多这种demo,推荐使用雷霄华博士的:http://blog.csdn.net/leixiaohua1020/article/details/29368911
{
// 图片水印
sprintf(filter_spec, "movie=test.png[wm];[in][wm]overlay=10:10,scale=1920:1080[out]");
}
{
// MB转换为utf-8,文字水印的话,文字水印必须是utf8编码的
//string strCharacterInfoUTF8 = CMarkup::AToUTF8(stGetTaskRespInfo.watermark.characterInfo);
// 文字水印
sprintf(filter_spec, "[in]drawtext=fontfile=simhei.ttf:fontcolor=red:x=10:y=10:fontsize = 30 : text='123',scale=640:360[out]");
}
雷霄华博士的添加水印demo中init_filters()函数内将上述相关代码添加进去就OK了!
相关说明:
1.drawtext必须依赖libfreetype画字库,libfontconfig字体库两个库
scale分辨率filter,overlay图片水印filter
2.文字水印的话,文字水印必须是utf8编码的,不然会是乱码
3.字体文件fontfile,最好去C:\Windows\Fonts目录下去找,找一些中文的字体,不然可能也会导致乱码
ffmpeg支持添加多个水印:例如同时
1.同时添加图片水印与文字水印:
sprintf(filter_spec,"[in]drawtext=x=0:y=300:text="HelloWorld"[text];movie=/Test.png[wm];[text][wm]overlay=0:0,scale=1920:1080[out]");
2.同时添加两个图片水印:sprintf(filter_spec,"movie=../test.png[wm1];movie=../test.png[wm2];[in][wm1]overlay=0:0,scale=1920:1080[a];[a][wm2]overlay=0:300,scale=1920:1080[out]");3.同时添加两个文字水印:sprintf(filter_spec,"[in]drawtext=fontfile=simhei.ttf:x=0:y=0:fontsize=30:text='123',scale=1920:1080[a];[a]drawtext=fontfile=simhei.ttf:x=0:y=100:fontsize = 30 : text = '123',scale=1920:1080[out]");
但是添加多个水印有一个问题:两个水印高宽似乎不一样,不知道什么原因,知道的朋友还请指点一下,谢谢具体参数详情请看https://ffmpeg.org/ffmpeg-filters.html
相关文章推荐
- 利用在图片上中添加文字最终生成海报的代码实现
- php图片添加文字水印实现代码
- javaCV开发详解之4:转流器实现(也可作为本地收流器、推流器,新增添加图片及文字水印,视频图像帧保存),实现rtsp/rtmp/本地文件转发到rtmp流媒体服务器(基于javaCV-FFMPEG)
- php图片添加文字水印实现代码
- Java代码实现给图片添加文字水印 详细教程一
- 利用php给图片添加文字水印--面向对象与面向过程俩种方法的实现
- php图片添加文字水印实现代码
- javaCV开发详解之4:转流器实现(也可作为本地收流器、推流器,新增添加图片及文字水印,视频图像帧保存),实现rtsp/rtmp/本地文件转发到rtmp流媒体服务器(基于javaCV-FFMPEG)
- javaCV开发详解之4:转流器实现(也可作为本地收流器、推流器,新增添加图片及文字水印,视频图像帧保存),实现rtsp/rtmp/本地文件转发到rtmp流媒体服务器(基于javaCV-FFMPEG)
- .net c# gif动画如何添加图片水印实现思路及代码学习
- .net c# gif动画如何添加图片水印实现思路及代码
- PHP实现图片裁剪、添加水印效果代码
- .net c# gif动画如何添加图片水印实现思路及代码
- asp.net实现图片添加文字及图片水印
- 利用iTextSharp组件给PDF文档添加图片水印,文字水印
- java实现给图片添加水印和文字
- php文字水印和php图片水印实现代码(二种加水印方法)
- php gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码
- 一个不错的给图片添加说明文字的动态层的实现代码
- PHP实现图片裁剪、添加水印效果代码