水印在应用开发中还是挺常用的,现总结如下:
水印图片位置 | overlay值 |
---|---|
左上角 | 10:10 |
右上角 | main_w-overlay_w-10:10 |
左下角 | 10:main_h-overlay_h-10 |
右下角 | main_w-overlay_w-10 : main_h-overlay_h-10 |
overlay方式的水印
用in.avi作为输入视频,out.avi作为输出视频,pp.png表示要添加的水印图片,是png格式的,调整水印大小(scale = 50:50)和位置(overlay=10:10)
ffmpeg -i 7.mp4 -i 1.png -filter_complex '[1:v]scale=50:50[s];[0:v][s]overlay=10:10' -vcodec h264 a.mp4
简单例子:ffmpeg -i 1.mp4 -i 1.png -vcodec libx264-an -filter_complex "overlay=x=100:y=0" -s 320x240 output.mp4
位置说明:
使用overlay添加透明水印时,位置参数的位置在 -vfilters里面的 overlay= 的后面的前两个参数,参数之间是冒号分隔的。第一个参数是横向的间距,第二个是纵向的间距。可以结合与视频和水印相关的四个值来设置,这四个值分别是:mainW表示主视频宽度,mainH表示主视频高度,overlayW表示水印宽度,overlayH表示水印高度。这些值加在overlay参数中,ffmpeg将自动识别。
也就是说要让水印
显示在视频的左上角overlay参数为overlay=0:0 例:ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay pair1.mp4
显示在右上角为 overlay= main_w-overlay_w:0 例:ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w pair2.mp4
显示在右下角为 overlay=main_w-overlay_w:main_h-overlay_h 例:ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w:H-h pair4.mp4
显示在左下角为 overlay=0: main_h-overlay_h 例:ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=H-h pair3.mp4
上面的0可以改为5,或10像素,以便多留出一些空白。
movie方式的水印
Top left corner
ffmpeg -i inputvideo.avi -vf "movie=watermarklogo.png, scale=200x200 [watermark];[in][watermark] overlay=10:10 [out]" outputvideo.flv
Top right corner
ffmpeg -i inputvideo.avi -vf "movie=watermarklogo.png [watermark];[in][watermark] overlay=main_w-overlay_w-10:10 [out]" outputvideo.flv
Bottom left corner
ffmpeg -i inputvideo.avi -vf "movie=watermarklogo.png [watermark];[in][watermark] overlay=10:main_h-overlay_h-10 [out]" outputvideo.flv
Bottom right corner
ffmpeg -i inputvideo.avi -vf "movie=watermarklogo.png [watermark];[in][watermark] overlay=main_w-overlay_w-10:main_h-overlay_h-10 [out]"outputvideo.flv
例子
ffmpeg -i yfx.mp4 -vf "movie=1.png [watermark];[in][watermark] overlay=10:10 [out]" outputvideo.mp4
PNG图片必须含有alpha通道。Overlay过滤器是根据alpha通道来进行复盖的。所以,你想要透明效果时,须先制做一张透明的PNG图片。
加水印转码
ffmpeg -y -i url -acodec copy -vf "movie=2.png [watermark]; [in][watermark]overlay=main_w-overlay_w-0:0[out]" -f hls -hls_time 2 -hls_list_size 0 a.m3u8
1 加水印与多字幕
背景图拉伸
/usr/local/ffmpeg/bin/ffmpeg -i concat:"1.ts" -i 1.png -vcodec libx264 -g 25 -bf 0 -b:v 1300k -acodec copy -filter_complex
scale='w=1280:h=720',overlay=x=330:y=260,"drawtext=fontfile=/usr/share/fonts/chinese/TrueType/simhei.ttf:text=天
浪:x=635:y=302:fontsize=40:fontcolor=#333333@1.0:shadowy=0","drawtext=fontfile=/usr/share/fonts/chinese/TrueType/simhei.ttf:text=【准备服装设计】才吃饭:x=635:y=378:fontsize=32:fontcolor=#666666@1.0:shadowy=0" a.ts
背景图不拉伸
/usr/local/ffmpeg/bin/ffmpeg -i concat:"1.ts" -i 1.png -vcodec libx264 -g 25 -bf 0 -b:v 1300k -acodec copy -filter_complex "overlay=10:10,drawtext=fontfile=/usr/share/fonts/chinese/TrueType/simhei.ttf:text=天浪:x=200:y=100:fontsize=40:fontcolor=#333333@1.0:shadowy=0","drawtext=fontfile=/usr/share/fonts/chinese/TrueType/simhei.ttf:text=【准备服装设计】才吃饭:x=200:y=200:fontsize=32:fontcolor=#666666@1.0:shadowy=0" a.ts
合并音频
ffmpeg -i 3hk.mp4 -i cu.aac -filter_complex amix=inputs=2:duration=first:dropout_transition=2 a.mp4
加字幕
指定字体,例子如下:
ffmpeg -i o.mp4 -vf "subtitles=st.srt:force_style='FontName=Microsoft YaHei'" out.mp4
字幕+PAD
ffmpeg -i /data/86435/86435.file -i /data/watermark/86435/20171226105015.png -filter_complex "[0:v]scale=270:480,pad=640:480:185:0:black[bg];[1:v]scale=80:14[vv];[bg][vv]overlay=main_w-overlay_w-30:15" -y -c:v libx264 -c:a libfaac -r 25 -g 25 -b:v 700k -maxrate 1050k -bufsize 1050k -ab 64k -keyint_min 25 -sc_threshold 0 -f hls -hls_time 10 -hls_list_size 2048 -pix_fmt yuv420p 1.m3u8
水印+字幕
ffmpeg -i 3.mp4 -i 1.png -filter_complex "overlay=x=30:y=60,subtitles=Vtt:force_style='FontName=Microsoft YaHei'" 1.mp4
模糊水印
删除logo
语法:-vf delogo=x:y:w:h[:t[:show]]
x:y 离左上角的坐标
w:h logo的宽和高
t: 矩形边缘的厚度默认值4 (set delogo area band size,其实是内矩形到外矩形的距离,设置的这个模糊条带可以起到过渡作用,还可以了解到,条带区域的像素会被用来插值运算。参数 band 的值不宜设置过大。)
show:若设置为1有一个绿色的矩形,默认值0.
ffplay -i jidu.mp4 -vf delogo=50:51:60:60:100:0
依次是 左上X坐标,左上Y坐标,宽,高,set delogo area band size, 是否加框。
例子:ffmpeg -i 1.mp4 -vf delogo=40:25:100:30:10:1 a.mp4
subtitle
字幕
第一种是外挂字幕(软字幕),视频文件和字幕文件分离。当播放某视频文件时,会自动载入相同文件夹下同名的字幕文件,当然也可以用播放器(如:VLC media player)手动载入字幕(不要求字幕文件和视频文件同名并在相同文件夹下,可任意载入)。
第二种是将字幕封装到容器中,就是所谓的字幕流,和视频流、音频流同等地位。值得说明的是,并非所有的容器都支持字幕流,先进的 MKV 是支持的,MP4 目前我只知道支持苹果的 MOV text。
第三种是内嵌字幕(硬字幕),利用 video filter(subtitles、ass、甚至是 overlay)将字幕文件烧进视频流中,就像水印一样。
首先需要科普下。vob,mkv等格式文件以流的形式存储字幕,而mp4不支持这种方式。如果希望生成带字幕的mp4文件,只能将字幕“烧录”到视频中。 也就是说我们需要将字幕流与视频流进行合成。最终只留下视频流。这样肯定会对原始的视频的画质造成一定影响。
ffmpeg -i video.avi -vf "ass=subtitle.ass"out.avi
ffmpeg -i video.avi -vf subtitles=st.srtout.avi
指定字体 ffmpeg -i o.mp4 -vf "subtitles=st.srt:force_style='FontName=Microsoft YaHei'" out.mp4
添加idx/sub字幕 ffmpeg -i o.mp4 -i BareWitness_2002_He_CN_2886841.sub -i BareWitness_2002_He_CN_2886841.idx -filter_complex "[0:v][2:s]overlay" -vcodec h264 -acodec aac the_equalizer-captioned2.mp4
加秒表时间
ffmpeg -i rtmp://10.80.3.17:1935/live/1 -vf "drawtext=fontfile=/usr/share/fonts/chinese/TrueType/simhei.ttf: text='fuck': timecode='09\:57\:00\:00': r=25: \x=(w-tw)/1.5: y=h-(20*lh):fontcolor=white: box=1: boxcolor=0x00000000@1" -vcodec h264 -y out.wmv
drawtext
间隔出现文字
ffmpeg -loglevel verbose -i 1.mp4 -filter_complex "drawtext=fontfile=/usr/share/fonts/chinese/TrueType/simhei.ttf:text=亦非云:x=200:y=100:fontsize=40:fontcolor=#333333@1.0:shadowy=0:x=100:y=x/dar:enable='between(t,3,5)'" -c:a copy out.mp4 -y
:enable='between(t,3,5)' 可以处理开始时间,结束时间 ;shadowy是字跟阴影的距离;@1.0是透明度;dar是固定值,- setdar='dar=16/9' 。
每隔3秒出现水印
ffmpeg -i t.mp4 -vf "movie=a.png [watermark]; [in][watermark] overlay=10:10:enable=lt(mod(t\,3)\,1) [out]" -vcodec h264 -c:a copy outputvideo1.mp4
更强的逻辑见:http://www.ffmpeg.org/ffmpeg-utils.html