ffmpeg学习二:《FFmpeg Basics》读书笔记(上)
为了更好的理解ffmpeg工程,官方推荐了一本书:《FFmpeg Basics》。完整的读完这本书,应该对这个工程能有一个基本的理解了。本菜英文不好,姑且从这本书中提炼出一些比较常用的知识,做个笔记吧。
一.波特率,帧率,和文件大小
1.1帧率
1-1-1帧率的基本概念
帧率,英文说就是frames per second(FPS or fps),也就是每秒钟的帧数,完整的说就是每秒钟编码到视频文件中的帧数称之为帧率。帧率超过15HZ,人眼才能感觉到它是视频,小于15就会觉得这是在播放幻灯片…现在Android设备通常要求的是60Hz,也就是一秒钟播放60帧的画面,这样就会觉得视频非常的流畅。
帧率又分为两种模式,交错模式和持续模式。交错模式主要指各行扫描,也就是说一幅图片显示出来,分两次来显示,第一次显示奇数行,第二次显示偶数行。持续模式则是一行一行的从头到尾的显示。
1-1-2设置帧率
1-1-2-1 使用-r选项
为了设置帧率,我们需要在输出文件之前添加-r选项,格式如下:
ffmpeg -i input -r fps output
比如,我们想把一个avi格式的视频文件的帧率,从25Hz改为30Hz,我们可以这么做:
ffmpeg -i input.avi -r 30 output.mp4
1-1-2-2使用视频过滤器
除了-r选项,我们还可以使用视频过滤器来重置帧率,比如,要把一个输入文件的帧率改为25,我们可以使用如下命令:
ffmpeg -i clip.mpg -vf fps=fps=25 clip.webm
那么什么是视频过滤器呢?视频文件可以看做是一帧一帧的图片组成的,过滤器就是对使用一套规则,对着一组图片进行处理。把一个视频的帧率改为25,就意味着我们创建了一个规则,也就是1秒钟编码25帧图片到视频文件中去。对于两个视频文件,这必然意味着解码与编码的双重工作,也就是说修改了帧率,其实就是把源视频文件解码再重新编码。
1-2比特率
Bit rate,每秒钟处理的bit的数量。这个参数直接影响着音视频质量,比特率决定了编码的时候,1秒钟存储的bit数。
1-2-1设置比特率
比特率的设置使用-b选项。对于视频比特率和音频比特率,分别对应着-b:v和-b:a的格式来设置对应的比特率。比如,我们要设置一个视频文件的比特率,可以这样:
ffmpeg -i film.avi -b 1.5M film.mp4
这样会把视频流和音频流的比特率都设置为1.5M。
我们也可以分别设置视频流和音频流的比特率:
ffmpeg -i film.avi -b:v 1.5M -b:a 1M film.mp4
1-3文件大小的计算
视频文件的大小计算公式:
video_size = video_bitrate * time_in_seconds / 8
无压缩音频文件大小的计算公式:
audio_size = sampling_rate * bit_depth * channels * time_in_seconds / 8
压缩后音频文件大小的计算公式:
audio_size = bitrate * time_in_seconds / 8
对于一个包含音频和视频的文件,其大小为二者之和。
比如,我们有一段10分钟的视频文件,视频比特率为1500kbits,音频比特率为128kbits,那么整个文件的大小计算如下:
file_size = (video_bitrate + audio_bitrate) * time_in_seconds / 8
file_size = (1500 kbit/s + 128 kbits/s) * 600 s
file_size = 1628 kbit/s * 600 s
file_size = 976800 kb = 976800000 b / 8 = 122100000 B / 1024 = 119238.28125 KB
file_size = 119238.28125 KB / 1024 = 116.443634033203125 MB ≈ 116.44 MB
1 byte (B) = 8 bits (b)
1 kilobyte (kB or KB) = 1024 B
1 megabyte (MB) = 1024 KB, etc.
二.视频的缩放
2-1 使用-s选项
重新改变视频的大小,使用-s选项指定视频帧的大小:
ffmpeg -i input_file -s 320x240 output_file
2-2高级缩放
高级缩放使用的是scale视频过滤器。
使用格式如下:
scale=width:height[:interl={1|-1}]
比如,下面两个命令有相同的结果:
ffmpeg -i input.mpg -s 320x240 output.mp4
ffmpeg -i input.mpg -vf scale=320:240 output.mp4
-vf 就是(video filter),scale是这个视频过滤器的名字,ffmpeg工程中有很多的视频过滤器,后面还有很多…
2-2按比例缩放
缩小到一半:
ffmpeg -i input.mpg -vf scale=iw/2:ih/2 output.mp4
缩小到0.9倍大小:
ffmpeg -i input.mpg -vf scale=iw*0.9:ih*0.9 output.mp4
三.视频裁剪
3-1crop
视频裁剪又用到了另一个视频过滤器:crop
用法如下:
各个参数的意义:
举例:如果我们要分别裁剪视频的左三分之一,中间三分之一,右三分之一,可分别执行如下命令:
ffmpeg -i input -vf crop=iw/3:ih:0:0 output
ffmpeg -i input -vf crop=iw/3:ih:iw/3:0 output
ffmpeg -i input -vf crop=iw/3:ih:iw/3*2:0 output
3-2cropdetect
cropdetect过滤器用来自动裁剪视频的非黑色区域。有些视频上下或者左右会有黑色区域,如果我们想获得只包含有效数据(不包含黑色区域)的视频,那么,我们可以使用这个过滤器。
比如所,为了裁剪非黑区域,我们可以使用如下命令:
ffmpeg -i input.mpg -vf cropdetect=limit=0 output.mp4
limit用来限定颜色的值。这里的意思就是裁剪的区域的颜色值为黑色。从中我们可以看到我们可以给limit不同的赋值,来裁剪出非指定颜色的区域。
3-3裁剪时间
视频播放器通常有一个进度条,而且会显示播放的时间,大多数播放器一般会在鼠标扫过播放器的时候才会显示这些。那么,如果我们想要裁剪出时间,我们要怎么办呢?
ffmpeg有一个testsrc的视频源,这个视频包含了时间的显示:
那么我们想要裁剪出其中的时间,可以这样:
ffmpeg -f lavfi -i testsrc -vf crop=29:52:256:94 -t 10 timer1.mpg
crop可以有四种取值,分别对应不同的时间范围:
四.视频填充
视频填充使用的pad视频过滤器,这个过滤器用法如下:
各个参数的意义:
比如说,我们要个一个图片填充30个像素的粉红色边框,可以这样:
ffmpeg -i photo.jpg -vf pad=860:660:30:30:pink framed_photo.jpg
效果如下:
4-1填充4:3的视频为16:9
命令格式如下:
ffmpeg -i input -vf pad=ih*16/9:ih:(ow-iw)/2:0:color output
4-2填充16:9的视频为4:3
命令格式如下:
ffmpeg -i input -vf pad=iw:iw*3/4:0:(oh-ih)/2:color output
当然了,填充的视频不局限于4:3还是16:9,我们完全可以填充为任意比例的视频。
五.翻转和旋转视频
5-1水平翻转
水平翻转使用hflip视频过滤器。
用法举例:
ffplay -f lavfi -i testsrc -vf hflip
5-2垂直翻转
垂直翻转使用vflip视频过滤器。
用法举例:
ffplay -f lavfi -i rgbtestsrc -vf vflip
5-3旋转
旋转使用transpose视频过滤器。
transpose用法如下:
这里很好理解,你可以发现下面两个命令是等价的:
ffplay -f lavfi -i smptebars -vf transpose=0
ffplay -f lavfi -i smptebars -vf transpose=2,vflip
下面两个命令也是等价的:
ffplay -f lavfi -i smptebars -vf transpose=3
ffplay -f lavfi -i smptebars -vf transpose=1,vflip
六.模糊化、锐化和其他去噪
6-1模糊化
模糊化可提高特定噪声的图片的质量。ffmpeg提供了两种模糊化的视频过滤器:boxblur和smartblur。
用法举例:
ffmpeg -i input.mpg -vf boxblur=1.5:1 output.mp4
ffmpeg -i halftone.jpg -vf smartblur=5:0.8:0 blurred_halftone.png
6-2降低锐化
降低锐化可以使用unsharp视频过滤器。
用法举例:
ffmpeg -i input -vf unsharp output.mp4
ffmpeg -i input -vf unsharp=6:6:-2 output.mp4
6-3去噪
denoise3d可用于减少噪声。
用法举例:
ffmpeg -i input.mpg -vf mp=denoise3d output.webm
这一章目前一笔带过,reader可以自行阅读《FFmpeg Basic》这本书第八章。
七.覆盖-图片中的图片
覆盖是非常常见的视频处理,比如有些视频会有时间显示,有些电视节目会显示频道的Logo等等。
覆盖
视频覆盖技术可以在后面的视频或者图片上覆盖一层前面的视频或者图片。ffmpeg提供了overlay视频过滤器实现覆盖。用法见下表:
用法格式如下:
ffmpeg -i input1 -i input2 -filter_complex overlay=x:y output
input1是后台视频,input2是前台视频。x,y是覆盖开始的左上角的位置。
注意,这里使用的是-filter_complex选项,而不是-vf选项。因为现在有两个输入源,以前的例子都是只有一个输入源。
7-1角落的logo
左上角的Logo:
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay pair1.mp4
右上角的logo:
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w pair2.mp4
右下角的logo:
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w:H-h pair3.mp4
左下角的Logo:
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=0:H-h pair4.mp4
7-2特定时刻显示logo
比如,要在5秒后显示Logo:
ffmpeg -i video_with_timer.mp4 -itsoffset 5 -i logo.png ^
-filter_complex overlay timer_with_logo.mp4
7-2给视频添加时间
首先从testsrc视频源中裁剪出时间:
ffmpeg -f lavfi -i testsrc -vf crop=61:52:224:94 -t 30 timer.ogg
然后把它覆盖到另一个视频上:
ffmpeg -i start.mp4 -i timer.ogg -filter_complex overlay=451 startl.mp4
八.给视频添加文字
给视频添加文字使用drawtext视频过滤器。
8-1显示文字
如下例子:
ffplay -f lavfi -i color=c=white ^
-vf drawtext=fontfile=/Windows/Fonts/arial.ttf:text=Welcome
fontfile用来指定字体,text用来指定要显示的内容。
8-2指定位置
那么,要指定在具体的位置显示,该怎么指定位置呢?可以使用x,y来指定要显示的位置:
比如:
ffplay -f lavfi -i color=c=white -vf ^
drawtext="fontfile=arial.ttf:text='Good day':x=(w-tw)/2:y=(h-th)/2"
这要字体Good day就会显示在视频中间了。
8-3字体大小和颜色的设置
比如:
ffplay -f lavfi -i color=c=white -vf drawtext=^
"fontfile=arial.ttf:text='Happy Holidays':x=(w-tw)/2:y=(h-th)/2:^
fontcolor=green:fontsize=30"
也就是说我们可以使用fontcolor和green:fontsize分别指定文字的颜色和大小。
8-4动态文字
变量t代表视频当前的秒数。我们可以通过t来改变x,y,从而使得文字的位置动态的改变。
8-4-1水平方向的移动
举例:
ffmpeg -f lavfi -i color=c=#abcdef -vf drawtext=
"fontfile=arial.ttf:text='Dynamic RTL text':x=w-t*50:
fontcolor=darkorange:fontsize=30" output
这里,x=w-t*50,因此,x随着t的增大不断的减小,位置也不断的左移。
8-4-2垂直方向的移动
举例:
ffmpeg -i palms.avi -vf drawtext="fontfile=arial.ttf:textfile=Credits:
x=w/2:y=h-t*100:fontcolor=white:fontsize=30" clip.mp4
这里y=h-t*100,随着时间的增加,h不断减小,文字不断的上移。
ffmpeg学习二:《FFmpeg Basics》读书笔记(上)相关推荐
- FFmpeg从入门到精通读书笔记(1)
笔者才开始学习音视频开发,FFmpeg从入门到精通读书笔记系列主要是基于阅读刘歧.赵文杰编著的<FFmpeg从入门到精通>以及雷霄骅博士博客总结写的入门心得体会. 官方文档资料 FFmpe ...
- Maltab在数学建模中的应用(第二版)——读书笔记上
Maltab在数学建模中的应用(第二版)--读书笔记上 1.MATLAB与数据文件的交互 1.1数据拟合 1.2数据拟合实例 1.3数据可视化 1.4层次分析法 2.规划问题的MATLAB求解(多约束 ...
- 《学习之道》读书笔记
<学习之道>读书笔记 不要太过于专注,适当的时候要放松,启用发散思维,会让更多的想法出现来帮助解决问题. 爱迪生遇到棘手的问题,会拿着球,躺着睡一会,当睡着的时候球会从手中脱落,掉到预先准 ...
- 强化学习(RLAI)读书笔记第十六章Applications and Case Studies(不含alphago)
强化学习(RLAI)读书笔记第十六章Applications and Case Studies(不含alphago) 16.1 TD-Gammon 16.2 Samuel's Checkers Pla ...
- 强化学习(RLAI)读书笔记第十六章Applications and Case Studies(alphago)
强化学习(RLAI)读书笔记第十六章Applications and Case Studies(alphago) 16.6 Mastering the Game of Go 16.6.1 AlphaG ...
- FFmpeg 学习:FFmpeg 学习整理总结
一.FFmpeg 播放视频的基本流程整理 播放流程: video.avi(Container) -> 打开得到 Video_Stream -> 读取Packet -> 解析到 Fra ...
- ffmpeg基础库编程开发 读书笔记
第一章 1.6 容器和协议 1. 媒体文件和编码的区别 文件是既包括视频又包括音频.甚至还带有脚本的一个集合,也可以叫做容器: 文件当中的视频和音频的压缩算法才是具体的编码. 2. 两大标准指定组织 ...
- 《软技能》读书笔记(上)
前言 这是一本真正从"人"(而非技术也非管理)的角度关注软件开发人员自身发展的书.书中论述的内容既涉及生活习惯,又包括思维方式,凸显技术中"人"的因素,全面讲解 ...
- 机器学习之二十一(读书笔记)
Transfer Learning(迁移学习) zero-shot learning(零样本学习) 三十四.Transfer Learning(迁移学习) 1.介绍 假设你现在有一些跟你要进行的t ...
最新文章
- 【待继续研究】解析机器学习技术在反欺诈领域的应用
- Laravel3 学习笔记
- 查看域名真实IP地址NSlookup命令使用浅析
- c# string 占位符_C# 基础知识系列- 9 字符串的更多用法(一)
- php对联广告,html左右对联代码 cms网站对联广告html代码
- python3librequest_python3.x學習之urilib.request簡單學習
- git pull出现错误的解决办法
- 正切函数半角定理推导
- 卡巴斯基2010激活码
- 苹果自带的清理软件_为大家推荐几款苹果电脑清理软件中排名较高的软件
- 志金庸小说里,让你印象最深的是哪一段?
- Mybatis辅助神器-MyBatis Log Plugin,定位java中SQL问题
- 会php学java入门要多久_php自学需要多久
- CF 1567 C. Carrying Conundrum(思维)
- 图片批量压缩工具软件免费版 Caesium Image Compressor
- scrapy链接mysql_Scrapy存入MySQL(四):scrapy item pipeline组件实现细节
- Trino-378安装部署
- Bootstrap按钮元素使用方法
- 入侵Linux服务器,黑客惯用手法:提权
- IATF16949汽车工业质量管理体系认证流程
热门文章
- 全球与中国微型电机市场深度研究分析报告
- input修改自动填充背景色(单一色以及透明)
- 针对大量数据,MATLAB生成EXCEL文件并进行排版处理的源码
- Skype是台湾繁体中文,告诉大家变成简体的办法
- (三)消息队列——AMQP的理解以及RabbitMQ概述
- ZCMU—1109: 胥哥的DOTA(C语言)
- 主成分分析逆变换_主成分分析(PCA)(转)
- tensorboard生成的网址打不开的解决方法
- rabbitMQ的延迟交换机详解
- Matlab灰色预测GM(1,1)和GM(2,1)对比