帧率 fps的概念

帧率,单位FPS(frame per second), 用于衡量视频每秒的处理帧数,对于编码器而言说明编码器在1s的编码的速度,通常可以使用一帧的编码时间倒数简单计算;对于解码器而言,帧率表示1秒内解码帧数。

电视节目中比较常用的帧率制式有NTSC、PAL。另外,帧率可能会因为视频是否是交织(interlaved,i)或逐行(progressive,p)的,描述上有所不同。对于交织的视频,一帧数据包含两场:顶场和底场。

NTSC标准使用60i fps,意思是每秒60场,亦即30帧。(60 fields),30帧

PAL标准使用50i fps,意思是每秒50场,亦即25帧。

如何设置转码帧率

ffmpeg提供了-r用于设置转码之后的帧率,命令行如下:

ffmpeg -i input.avi -r 30 output.mp4

使用fps filter

这里介绍第一个filter,名字是fps,可用于设置输出视频的帧率,语法如下:

fps=fps=number_of_frames

比如下面命令行将input.avi的帧率处理成25帧,输出到output.mp4中

ffmpeg -i input.avi -vf fps=fps=25 output.mp4

预定义的帧率

ffmpeg提供了几种常用的帧率:

缩写				帧率			准确值
ntsc-film 23.97fps 24000/1001
film 24fps 24/1
pal、qpal、spal 25fps 25/1
ntsc、qntsc、sntsc 29.97fps 30000/1001

在使用-r参数是可以用上面的缩写指代特定帧率。

码率 bitrate

码率是指单位时间内处理的音视频数据的比特数,单位bps。在同样的编码条件下,码率决定音视频数据的质量。

比较常用的码率控制策略有下面三种:

  • ABR:平均码率,固定编码大小的情况下较常用
  • CBR:固定码率,多数用于流媒体串流或直播,用于保存不实用。
  • VBR:自适应码率,简单场景使用低码率编码,复杂场景使用高码率编码。同等大小情况下,编码质量比VBR和CBR要好。

ffmpeg中设置码率的参数在FFmpeg Basics学习笔记(1)ffmpeg基础已经介绍了,有兴趣可以看看。

CBR设置

设置为CBR码率输出时,需要指定minrate和maxrate参数,并保证-b和二者的参数相同即可。

ffmpeg -i in.avi -b 500K -minrate 500K -maxrate 500K -bufsize 1M out.mkv

限制输出文件的大小

可以使用-fs命令

ffmpeg -i in.avi -fs 10MB out.mp4

视频缩放

视频缩放可分为两种,保持宽高比的缩放(Scale)、任意比例缩放(Resize)。前者通常不破坏原始图像的显示比例,视觉效果通常比较好,类似数学中的等比例变换;后者比较灵活,可以任意变换。

比如下面的缩放处理,将源视频缩放为320x240大小

ffmpeg -i in.mp4 -s 320x240 out.mp4

ffmpeg中预先定义了一些分辨率,比如:(注意描述视频时通常是宽x高)

  • qcif、cif、4cif、16cif,宽高都是2倍递增的关系。只需要记住cif:352x288
  • vga 表示640x480分辨率
  • hd720 表示1280x720分辨率,通常说的720p
  • hd1080 表示1920x1080分辨率,通常说的1080p

scale video filter

scale视频filter支持视频的缩放。其基础语法如下:

scale=width:height[inter1={1|-1}]

其中width和height表示缩放之后的视频宽高,inter表示是否是自动启用去交织的功能。在实际命令函中还可以出现以下参数:

  • iw、ih 输入源的视频宽高
  • ow、oh 输出的视频宽高
  • a、sar、dar(a 宽高比=iw/ih; sar 输入源的宽高比; dar 输入源的显示宽高比=a*sar)
  • hsub、vsub 水平和垂直方向上色度分量的采样步长,比如对YUV422p的格式,hsub=2、vsub=1

具体使用可以参考下面命令行:

ffmpeg -i in.mp4 -vf sacle=320:240 out.mp4

下面两条语句分别实现等比例缩放、指定宽高的等比缩放

ffmpeg -i in.mp4 -vf scale=iw0.6:ih0.6 out.mp4

ffmpeg -i in.mp4 -vf scale=200:200/a out.mp4

视频裁剪 Crop

视频裁剪指的是从指定视频的某个区域(通常是矩形)取出部分画面。

crop video filter

crop filter的语法如下:

crop=ow[:oh[❌[y:[:keep_aspect]]]]

除了能使用scale filter提供的参数外,还可以使用用x、y、n、pos、t等参数,具体含义如下:

  • x,y 裁剪区域起始点坐标,默认为((iw-ow)/2, (ih-oh)/2)
  • n、pos、t分别用于标识当前帧数、位置及时间戳

只截取源视频的中心区域(长宽取一半)

ffmpeg -i in.avi -vf crop=iw/2:ih/2 out.mp4

cropdetect video filter

自动截取非黑色的区域。在4:3和16:9视频显示时通常填充黑边,cropdetect filter会比较有用。其语法如下:

cropdetect[=limit[:round[:reset]]]

各字段含义:

  • limit: 黑色判定门限,取值范围[0,255],默认为24
  • round,向上取整参数,整数对齐,比如必须要求输出宽高是16的倍数、偶数。
  • reset,重新计算裁剪区域的间隔

ffmpeg命令行格式,

ffmpeg -i input.mpg -vf cropdetect=limit=0 output.mp4

pad video filter

区域填充特殊颜色,通常色彩填充多用于视频分辨率和屏幕分辨率不一致的情况下,为了保证视频的效果,保持拉伸的宽高比,在左右填充或者上下填充。pad filter语法如下:

pad=width[:height[:x[:y[:color]]]]

除了可以使用crop filer中参数,这里提供了color,用于指定填充颜色;width和height为输出视频的分辨率;x和y表示输入源的左上角在输出画面上的偏移。

下面语句的功能是在800x640的图片外围填充30个像素的粉红色边框。

ffmpeg -i photo.jpg -vf pad=860:660:30:30:pink framed_photo.jpg

视频的镜像

hflip video filter

hflip实现对视频的水平翻转。语法如下:

-vf hflip

翻转效果类似下面的示例:(翻转之后图像互为水平镜像)

ABC	  |   CBA
DEF | FED

vflip video filter

vflip实现对视频的垂直翻转。语法如下:

-vf vflip

翻转效果类似下面(垂直镜像)

000    |    888
111 | 111
888 | 000

transpose video filter

transpose filter用于实现特定角度旋转和翻转配合的效果。其语法如下:

-vf transpose={0,1,2,3}

0	逆时针旋转90°+垂直翻转
1 顺时针旋转90°
2 逆时针旋转90°
3 顺时针旋转90°+垂直翻转

类型0和3是旋转和垂直翻转配合的处理。下面两个输出是一样的:

ffplay -f lavfi -i smptebars -vf transpose=0

ffplay -f lavfi -i smptebars -vf transpose=2,vflip

顺时针旋转90°的效果是这样的(左边是原图,右边是transpose之后的图)

AB			CA
CD DB

顺时针旋转90°+垂直翻转的效果如下:

AB			DB
CD CA

对比下图即可。

附加说明

本部分内容主要涉及《Ffmpeg Basic》的第3章到第7章(包含第7章),介绍了比较多的视频编码参数和处理,比如帧率、码率、缩放、裁剪、填充和旋转。

概念性内容比较多,建议可以简单了解下有关内容,实际需要用到的时候再深入研究下。

FFmpeg Basics学习笔记(2)的更多相关文章

  1. FFmpeg Basics学习笔记(1)ffmpeg基础

    1 FFmpeg的由来 FFmpeg缩写中,FF指的是Fast Forward,mpeg是 Moving Pictures Experts Group的缩写.官网:ffmpeg.org 编译好的可执行 ...

  2. FFmpeg Basic学习笔记(3)

    视频叠加--画中画效果 overlay video filter 视频叠加比较常见的应用场景是台标的叠加,在画面左上角.右上角.左下角或右下角叠加台标. ffmpeg提供的overlay filter ...

  3. FFmpeg编程学习笔记二:音频重採样

    ffmpeg实现音频重採样的核心函数swr_convert功能很强大,但是ffmpeg文档对它的凝视太过简单.在应用中往往会出这样那样的问题,事实上在读取数据->重採样->编码数据的循环中 ...

  4. FFmpeg Basic学习笔记(4)

    图像处理 常见的图片格式包括YUV.BMP.JPG.GIF.PNG. 图像的创建 可以使用下面命令从输入源中截取图像 ffmpeg -i input -ss t image.type 从videocl ...

  5. FFmpeg Basics阅读笔记1:介绍

    Multimedia handling with a fast audio and video encoder 作者:Frantisek Korbel 网址:http://ffmpeg.tv/ FFm ...

  6. Markdown 学习笔记: Basics

    Markdown 学习笔记: Basics 原文:Basics. 了解Markdown格式化句法的要点 本页对如何使用Markdown提供了一个简单的概述.在"句法"页中对Mark ...

  7. FFmpeg常用命令学习笔记(一)基本信息查询命令

    笔者才开始学习音视频开发,FFmpeg学习笔记系列主要是从慕课网李超老师的FFmpeg音视频核心技术精讲与实战课程学习的心得体会. FFmpeg音视频核心技术精讲与实战:https://coding. ...

  8. ffmpeg学习笔记

           对于每一个刚開始学习的人,刚開始接触ffmpeg时,想必会有三个问题最为关心,即ffmpeg是什么?能干什么?怎么開始学习?本人前段时间開始接触ffmpeg,在刚開始学习过程中.这三个问 ...

  9. jQuery学习笔记 - 基础知识扫盲入门篇

    jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...

随机推荐

  1. 使用自连接、for xml path('')和stuff合并显示多行数据到一行中(转)

    原文: http://njm.iteye.com/blog/795881 --使用 自连接.for xml path('')和stuff合并显示多行数据到一行中 --注 --1.计算列可以不用包含在聚 ...

  2. netstat统计的tcp连接数与⁄proc⁄pid⁄fd下socket类型fd数量不一致的分析

    最近,线上一个应用,发现socket数缓慢增长,并且不回收,超过警告线之后,被运维监控自动重启了. 首先到zabbix上观察JVM历史记录,发现JVM-Perm space最近两周没有数据,猜测是程序 ...

  3. HSSFWorkbook 与 XSSFWorkbook

    刚开始使用new HSSFWorkbook(new FileInputStream(excelFile))来读取Workbook,对Excel2003以前(包括2003)的版本没有问题,但读取Exce ...

  4. 【ASP.NET】ASP.NET中权限验证使用OnAuthorization实现

    在项目开发中,通常我们都会涉及到用户登录才能访问的网页,比如购物网站,我们浏览商品,添加购物车(以前开发的时候在这里就需要登录用户,但是现在有了缓存的实现,这里可以将商品加入缓存,等到结账的时候再登录 ...

  5. 【MySQL】MySQL之MySQL5.7中文乱码

    自己的MySQL服务器不能添加中文,于是自己使用 show variables like 'character%'; 查看了当前的编码格式 我又通过以下方法将其设置为utf-8 SET charact ...

  6. Spring Cloud问题分析

    基于Spring Cloud框架开发时,经常会碰到各种开发问题,那么碰到这些问题时如何去解决呢?下面描述基于Spring Cloud问题定位的基本思路,大概可以分为如下几步: 排查配置问题 环境问题 ...

  7. OpenCV 学习笔记03 直线和圆检测

    检测边缘和轮廓不仅重要,还经常用到,它们也是构成其他复杂操作的基础. 直线和形状检测与边缘和轮廓检测有密切的关系. 霍夫hough 变换是直线和形状检测背后的理论基础.霍夫变化是基于极坐标和向量开展的 ...

  8. 关于 os模块的常用用法

    作为常用模块中的os模块,需要掌握的用法是非常重要的,今天就在这里把它归纳总结总结,以便自己日后的使用 一.os模块 含义:提供程序与操作系统直接操作的各个功能 二.常用的几个用法 os.getcwd ...

  9. 一步一步掌握线程机制(三)---synchronized和volatile的使用

    现在开始进入线程编程中最重要的话题---数据同步,它是线程编程的核心,也是难点,就算我们理解了数据同步的基本原理,但是我们也无法保证能够写出正确的同步代码,但基本原理是必须掌握的. 要想理解数据同步的 ...

  10. 在CentOS上编译安装MySQL 5.7.13步骤详解

    MySQL 5.7主要特性 更好的性能 对于多核CPU.固态硬盘.锁有着更好的优化,每秒100W QPS已不再是MySQL的追求,下个版本能否上200W QPS才是用户更关心的. 更好的InnoDB存 ...