网站首页 > 编程文章 正文
日常生活和工作中,难免遇到一些视频处理的事情,比如视频格式转换,大小压缩,截屏等,要是在Windows下还好办,格式工厂啊,小丸工具箱都算比较良心的好软件,但是Linux下就比较尴尬了,没有那么多好用的GUI软件,然而问题不大,有ffmpeg,自己动手,丰衣足食嘛!
FFmpeg的名称来自MPEG视频编码标准,前面的“FF”代表“Fast Forward”,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。可以轻易地实现多种视频格式之间的相互转换。
FFmpeg的用户有Google,Facebook,Youtube,优酷,爱奇艺,土豆等。
几乎所有视频音频处理的软件都是基于FFmpeg
目前国内外的所有视频、音频处理软件,包括视频格式转换、视频中抽取音频、屏幕录像、视频转GIF 等常见功能,几乎都是基于FFmpeg做了个GUI封装
这里先讲一些FFmpeg和视频处理中的基本概念。
1.容器/文件(Conainer/File):即特定格式的多媒体文件,比如mp4、flv、mkv等。
2.媒体流(Stream):表示时间轴上的一段连续数据,如一段声音数据、一段视频数据或一段字幕数据,可以是压缩的,也可以是非压缩的,压缩的数据需要关联特定的编解码器。
3.数据帧/数据包(Frame/Packet):通常,一个媒体流是由大量的数据帧组成的,对于压缩数据,帧对应着编解码器的最小处理单元,分属于不同媒体流的数据帧交错存储于容器之中。
一般情况下:
Frame对应压缩前的数据,Packet对应压缩后的数据。
4.编解码器(Codec):以帧为单位实现压缩数据和原始数据之间的相互转换的
5.复用(mux):把不同的流按照某种容器的规则放入容器,这种行为叫做复用(mux)
6.解复用(mux):把不同的流从某种容器中解析出来,这种行为叫做解复用(demux)
7.码率和帧率是视频文件的最重要的基本特征,对于他们的特有设置会决定视频质量。如果我们知道码率和时长那么可以很容易计算出输出文件的大小。
8.帧率:帧率也叫帧频率,帧率是视频文件中每一秒的帧数,肉眼想看到连续移动图像至少需要15帧。
9.码率:比特率(也叫码率,数据率)是一个确定整体视频/音频质量的参数,秒为单位处理的位数,码率和视频质量成正比,在视频文件中中比特率用bps来表达。
有了这些概念后,直接上手使用吧。怎么安装,我就不再描述了
实例1-压缩视频大小
直接上命令
ffmpeg -threads 4 -i vid1559883307870mix.mp4 -vcodec libx264 -preset fast -crf 28 -y -vf scale=1280:720 -acodec libmp3lame -ab 128k thread.mp4
来解释下每个参数的意义
- -threads 4 开启多线程
- -i vid1559883307870mix.mp4 表示输入要转换的文件
- -vcodec libx264 设定视频的编码器,未设定时则使用与输入流相同的编解码器。X264是压缩率最高,目前兼容性最好的一种编码(X265压缩率更高,但还不常用)。
- -preset fast 指定编码的配置。x264编码算法有很多可供配置的参数,不同的参数值会导致编码的速度大相径庭,甚至可能影响质量。为了免去用户了解算法,然后手工配置参数的麻烦。x264提供了一些预设值,而这些预设值可以通过preset指定。这些预设值有包括:ultrafast,superfast,veryfast,faster,fast,medium,slow,slower,veryslow和placebo。ultrafast编码速度最快,但压缩率低,生成的文件更大,placebo则正好相反。x264所取的默认值为medium。需要说明的是,preset主要是影响编码的速度,并不会很大的影响编码出来的结果的质量。压缩高清电影时,我一般用slow或者slower,当你的机器性能很好时也可以使用veryslow,不过一般并不会带来很大的好处。
- -crf 28:这是最重要的一个选项,用于指定输出视频的质量,取值范围是0-51,默认值为23,数字越小输出视频的质量越高。这个选项会直接影响到输出视频的码率。最好的办法是大家可以多尝试几个值,每个都压几分钟,看看最后的输出质量和文件大小,自己再按需选择。对质量要求较高时,选22以下;对尺寸要求非常高时,选26(但质量确实是会稍差一些),否则选24的性价比比较高(或者默认的23也行),如果对尺寸实在要求非常非常高,那就28以上吧。
- scale=1280:720 设置视频显示的尺寸
- -acodec libmp3lame 设置音频编码为MP3
- -ab 128k 设置音频流量,值越小,压缩率越高,质量越差。
经过这么一压缩,我原本45M的手机视频压缩成了5M,而且没有比较大的质量损失。看来效果不错。
实例2-录屏
在Windows下,可以用FastStone Capture等来实现录屏,Linux下也可以用vokoscreenNG,但实际上,FFmpeg在命令行下就可以做到,不需要GUI。
上命令
ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i :0.0+100,200 output.mp4
参数解释:
-framerate 25:表示我录制的帧率为25
-video_size:需要录制的宽度和高度
x11grab:表明我们是通过x11抓屏的方式 ,这是Linux下的命令,如果是Win,则使用gdigrab
实例3-从视频截选指定长度的内容生成GIF图片
这个操作就更常见了,贴吧和微博太需要了
惯例,先上命令
ffmpeg -ss 3 -t 5 -i input.mp4 -s 480*270 -f gif out.gif
参数意义,猜一下应当也差不多了。
其中-t 5表示录取5秒的视频转为GIF
实例4-从视频中抽取音频
这个操作也很常见了,还是直接上命令
ffmpeg -i 起风了.mp4 -f mp3 -vn qfl.mp3
就这样,从一个29M的MV里提取出了4M的MP3。
实例5-音频格式转换
这个命令演示从大体积无损音乐转换为小体积MP3格式
ffmpeg -i mo.flac -ab 256k mo.mp3
非常简单,只需要指定下比特率即可,当然不指定也可。
总结
实际上,ffmpeg能干的不止这些。和ffmpeg配套的ffplay实际上也是各种视频播放器的核心。这里顺便提个历史 ffmpeg耻辱柱。
由于FFmpeg是在LGPL/GPL协议下发布的(如果使用了其中一些使用GPL协议发布的模块则必须使用GPL协议),任何人都可以自由使用,但必须严格遵守LGPL/GPL协议。有很多播放软件都使用了FFmpeg的代码,但它们并没有遵守LGPL/GPL协议,没有公开任何源代码。我们应该对这种侵权行为表示耻辱。
截止到2014年加入FFmpeg耻辱柱的播放软件:暴风影音、QQ影音、KMP、GOM Player、PotPlayer都在其列。后面由于资本家的压力,这个页面被迫撤回。
最后,总结下常用参数
还有什么是ffmpeg搞不定的呢
- 上一篇: 教程:使用树莓派搭建B站弹幕点歌台
- 下一篇: 推荐?一款Java音频视频编码器,很赞
猜你喜欢
- 2024-09-08 技术分享| 如何使用FFmpeg命令处理音视频
- 2024-09-08 ubuntu ffmpeg开发环境搭建(ffmpeg linux开发)
- 2024-09-08 嘉宾博文:OpenCV如何在区块链操作系统中进行交叉编译
- 2024-09-08 想做人工智能的你,OpenCV安装好了吗?AI大神手把手教会你
- 2024-09-08 Kotlin编写一个AudioMerger 在线音视频解析七
- 2024-09-08 FFmpeg中与视频解码相关知识简介(ffmpeg hevc解码)
- 2024-09-08 ffmpeg教程-手把手教你如何简单快捷处理音视屏
- 2024-09-08 C++与音视频处理: 处理音频和视频数据的编码和解码
- 2024-09-08 ffmpeg安装大放送,包括编译需要的支持库
- 2024-09-08 ffmpeg推流桌面直播(ffmpeg推流rtsp命令)
你 发表评论:
欢迎- 05-09Spring Boot3 RESTful 接口参数校验,这篇吃透就够了!
- 05-09《Spring6》第02节:基于XML方式搭建Spring6框架开发环境
- 05-09MapStruct架构设计(mapstruct @mapping)
- 05-09分布式微服务架构组件(分布式微服务架构设计)
- 05-09Java Swing组件下的JButton实例(java swing 组件)
- 05-09java基础都在这了,小主们拿去吧(java基础是指什么)
- 05-09AOP的实现落地(拦截过滤),一切都要从Servlet说起
- 05-09【Spring Boot】WebSocket 的 6 种集成方式
- 最近发表
-
- Spring Boot3 RESTful 接口参数校验,这篇吃透就够了!
- 《Spring6》第02节:基于XML方式搭建Spring6框架开发环境
- MapStruct架构设计(mapstruct @mapping)
- 分布式微服务架构组件(分布式微服务架构设计)
- Java Swing组件下的JButton实例(java swing 组件)
- java基础都在这了,小主们拿去吧(java基础是指什么)
- AOP的实现落地(拦截过滤),一切都要从Servlet说起
- 【Spring Boot】WebSocket 的 6 种集成方式
- Java 中五种最常见加密算法:原理、应用与代码实现
- 用注解进行参数校验,spring validation介绍、使用、实现原理分析
- 标签列表
-
- spire.doc (59)
- system.data.oracleclient (61)
- 按键小精灵源码提取 (66)
- pyqt5designer教程 (65)
- 联想刷bios工具 (66)
- c#源码 (64)
- graphics.h头文件 (62)
- mysqldump下载 (66)
- sqljdbc4.jar下载 (56)
- libmp3lame (60)
- maven3.3.9 (63)
- 二调符号库 (57)
- 苹果ios字体下载 (56)
- git.exe下载 (68)
- diskgenius_winpe (72)
- pythoncrc16 (57)
- solidworks宏文件下载 (59)
- qt帮助文档中文版 (73)
- satacontroller (66)
- hgcad (64)
- bootimg.exe (69)
- android-gif-drawable (62)
- axure9元件库免费下载 (57)
- libmysqlclient.so.18 (58)
- springbootdemo (64)
本文暂时没有评论,来添加一个吧(●'◡'●)