文章目录
ffmpeg入门教程https://www.jianshu.com/p/042c7847bd8a
本文将会持续更新,敬请关注
视频播放器原理
命令行详解可参考ffmpeg入门教程或者参考官网文档
实例来源于《FFmpeg从入门到精通》
-filter_complex为视频添加logo
movie为视频添加logo
movie实现视频画中画
movie实现视频画中画跑马灯
视频添加中文水印的正确姿势
中文水印乱码
视频添加实时时间水印
视频间隔性添加水印
视频九宫格
vframes 视频截图
fps滤镜定时截图
截取关键帧图片
setpts视频倍速处理
欢迎分享、转载、联系、指正、批评、撕逼
ffmpeg入门教程https://www.jianshu.com/p/042c7847bd8a
本文将会持续更新,敬请关注
视频播放器原理
———————————————— 版权声明
此处摘抄部分为CSDN博主「雷霄骅」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/leixiaohua1020/article/details/18893769
视音频技术主要包含以下几点:封装技术,视频压缩编码技术以及音频压缩编码技术。如果考虑到网络传输的话,还包括流媒体协议技术。
视频播放器播放一个互联网上的视频文件,需要经过以下几个步骤:解协议,解封装,解码视音频,视音频同步。如果播放本地文件则不需要解协议,为以下几个步骤:解封装,解码视音频,视音频同步。他们的过程如图所示。
解协议的作用
就是将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如HTTP,RTMP,或是MMS等等。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。
解封装的作用
就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。
解码的作用
就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。
视音频同步的作用
就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。
命令行详解可参考ffmpeg入门教程或者参考官网文档
https://www.jianshu.com/p/042c7847bd8a
实例来源于《FFmpeg从入门到精通》
-filter_complex为视频添加logo
ffmpeg -i C:\Users\Administrator\Desktop\袋熊.mp4
-i F:\表情包\JB`~O0J_SH{U{VA0U{3%X~I.gif
-filter_complex "[1:v]scale=300:300[logo];[0:v][logo]overlay=x=0:y=0"
C:\Users\Administrator\Desktop\filtered_video.mp4
-
2
个-i
指定2
个输入文件 -
-filter_complex
复杂滤镜 -
[1:v]scale=300:300[logo]
将第2
个输入文件的视频流(如果是图片文件,则操作的是图片)缩放成300x300
大小,并设置标签[logo]
-
[0:v][logo]overlay=x=0:y=0
将第1
个输入文件的视频流用[logo]
覆盖在(0,0)
位置(图片的左上角在视频的0,0位置) - 最后是
输出
文件
movie为视频添加logo
ffmpeg -y -i C:\Users\cy\Desktop\video.mp4
-vf "movie=C\\:/Users/cy/Desktop/logo.jpg[logo];[in][logo]overlay=100:100[out]"
C:\Users\cy\Desktop\video_filtered.mp4
movie实现视频画中画
ffmpeg -y -i C:\Users\Administrator\Desktop\video.mp4
-vf "movie=C\\:/Users/Administrator/Desktop/video.mp4,scale=480x320[logo];[in][logo]overlay[out]"
C:\Users\Administrator\Desktop\video_filter.mp4
将画中画放置于右下角
ffmpeg -y -i C:\Users\Administrator\Desktop\video.mp4
-vf "movie=C\\:/Users/Administrator/Desktop/video.mp4,scale=480x320[logo];
[in][logo]overlay=x=main_w-480:y=main_h-320[out]" C:\Users\Administrator\Desktop\video_filter.mp4
-
main_w
主视频宽度 -
main_h
主视频高度
movie实现视频画中画跑马灯
ffmpeg -y -i C:\Users\Administrator\Desktop\video.mp4
-vf "movie=C\\:/Users/Administrator/Desktop/video.mp4,scale=480x320[logo];
[in][logo]overlay=x='if(gte(t,1),-w+t*400,NAN)':y=0 [out]"
-vcodec libx264 C:\Users\Administrator\Desktop\video_filtered.flv
-
t
时间,s -
[in]
指输入视频 -
[out]
指输出视频 -
gte(t,1)
如果t>=1
,返回1,否则返回0 -
if(gte(t,1),-w+t*400,NAN)
如果gte(t,1)
非0,返回-w+t*400
,否则返回NAN
,非数,即不显示跑马灯视频。
表示从主视频播放1s后开始显示跑马灯,跑马灯视频左上角x坐标为-w+t*400,w是跑马灯视频宽度 -
-vcodec
指定编解码器
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191202112423383.gif
视频添加中文水印的正确姿势
ffmpeg -y -i C:\Users\cy\Desktop\video.mp4 -vf
"drawtext=fontsize=100:fontfile=C\\:/Windows/Fonts/simhei.ttf:text='傻逼,你好':
fontcolor=green:box=1:boxcolor=yellow:x=20:y=20" C:\Users\cy\Desktop\video_filtered.mp4
-
-y
强制覆盖输出文件 -
-i
指定输入文件 -
-vf
-filter:v
的别名,为视频流添加滤镜处理 -
drawtext
添加文字水印 -
fontsize
指定字体大小 -
fontfile
指定字体库 -
text
指定文字内容 -
fontcolor
指定文字颜色 -
box=1
表示为水印添加背景色 -
boxcolor
指定背景色 -
x=20:y=20
指定水印偏移的位置 - 最后是
输出
文件
fontfile=C\\:/Windows/Fonts/simhei.ttf
指定的字体是黑体
,
windows系统下,字体在C:\Windows\Fonts
下,
注意:指定fontfile路径时,:
号必须用\\
转义,路径不能用\
,必须/
,否则乱码,因为路径指定有误,ffmpeg无法找到字库
中文水印乱码
fontfile=C\\:\Windows\Fonts\simhei.ttf
fontfile=C\:\Windows\Fonts\simhei.ttf
视频添加实时时间水印
ffmpeg -y -i C:\Users\cy\Desktop\video.mp4 -vf
"drawtext=fontsize=100:text='%{localtime\:%Y-%m-%d %H-%M-%S}':
fontcolor=green:box=1:boxcolor=yellow:x=20:y=20"
C:\Users\cy\Desktop\video_filtered.mp4
%{localtime\:%Y-%m-%d %H-%M-%S}
注意大小写,否则GG
视频间隔性添加水印
ffmpeg -y -i C:\Users\cy\Desktop\video.mp4
-vf "drawtext=fontsize=100:text='helloworld':fontcolor=green:
box=1:boxcolor=yellow:x=20:y=20:enable=lt(mod(t\,2)\,1)"
C:\Users\cy\Desktop\video_filtered.mp4
-
t
时间,s -
mod(t\,2)
计算t%2 -
lt(mod(t\,2)\,1)
如果mod(t\,2)<1
,返回1,否则返回0 -
enable=lt(mod(t\,2)\,1)
每隔1s显示一次水印,enable=lt(mod(t\,3)\,1)
每隔3s.
注意:逗号需要转义
视频九宫格
图片来源于《FFmpeg从入门到精通》
ffmpeg -y -i C:\Users\Administrator\Desktop\video.mp4 -i C:\Users\Administrator\Desktop\video.mp4
-i C:\Users\Administrator\Desktop\video.mp4 -i C:\Users\Administrator\Desktop\video.mp4
-filter_complex "nullsrc=size=640x480[base];
[0:v]scale=320x240[topleft];
[1:v]scale=320x240[topright];
[2:v]scale=320x240[bottomleft];
[3:v]scale=320x240[bottomright];
[base][topleft]overlay=shortest=1[tmp1];
[tmp1][topright]overlay=shortest=1:x=320[tmp2];
[tmp2][bottomleft]overlay=shortest=1:y=240[tmp3];
[tmp3][bottomright]overlay=shortest=1:x=320:y=240"
-vcodec libx264 C:\Users\Administrator\Desktop\video_filtered.flv
-
nullsrc
创建画布
最短的那条流决定了编码时长
默认情况下,编解码处理是处理完所有媒体流才会结束的,也就是最长的那条流决定处理的时长。可以使用 -shortest参数指定最短的那条流决定处理时长。
比如要合并video.avi 和 audio.mp3,音频audio.mp3时长比视频video的短,现在要处理完音频即退出,如下:
ffmpeg -i video.avi -i audio.mp3 -shortest output.mp4 //添加-shortest参数
此处overlay=shortest=1
,表示用作overlay的视频流结束后,停止编码(当然要所有用作overlay的视频流都结束后才会停止编码),如果不指定该参数,编码会永不停止,视频后面会一直黑屏。
vframes 视频截图
ffmpeg -y -i C:\Users\Administrator\Desktop\video.mp4 -ss 00:00:4
-vframes 1 C:\Users\Administrator\Desktop\video.png
-
-ss
定位时间 -
-vframes
限制输出的视频帧数
fps滤镜定时截图
ffmpeg -y -i C:\Users\Administrator\Desktop\haibao.mp4 -vf fps=1/2 C:\Users\Administrator\Desktop\haibao%d.png
-
fps
frame per seconds 帧率 -
fps=1/2
每2s截图1张 (可理解为1/2张每s) -
fps=1
每1s截图1张 -
fps=2
每1s截图2张
截取关键帧图片
ffmpeg -y -i C:\Users\Administrator\Desktop\video.mp4
-vf "select='eq(pict_type,PICT_TYPE_I)'" -vsync vfr C:\Users\Administrator\Desktop\thumb%d.png
setpts视频倍速处理
半速处理
ffmpeg -y -i C:\Users\Administrator\Desktop\video.mp4 -filter_complex "setpts=PTS*2"
C:\Users\Administrator\Desktop\video_.mp4
输出的视频文件的时长是原来的2 倍,播放速度当然是原来的1/2
-
setpts
更改输入帧的PTS(显示时间戳)。 -
PTS*2
原来帧在PTS时 显示,*2
让帧延迟到PTS*2
时显示
2倍速处理
ffmpeg -y -i C:\Users\Administrator\Desktop\video.mp4 -filter_complex "setpts=PTS/2"
C:\Users\Administrator\Desktop\video_.mp4
输出的视频文件的时长和原来一样(好奇),播放速度当然是原来的2倍
本文将会持续更新,敬请关注
欢迎分享、转载、联系、指正、批评、撕逼
Github:https://github.com/AnJiaoDe
:https://www.jianshu.com/u/b8159d455c69
CSDN:https://blog.csdn.net/confusing_awakening
ffmpeg入门教程:https://www.jianshu.com/p/042c7847bd8a
微信公众号
QQ群