FFMPEG初识与安装(Linux)

在这里插入图片描述

1. FFmpeg简介

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。

FFmpeg提供了强大的命令行工具,非常方便用户使用以及二次开发。
官方网站:http://www.ffmpeg.org/。
ffmpeg的Github项目地址是:https://github.com/FFmpeg/FFmpeg

FFmpeg在Linux平台下开发,它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"

一个伟大的软件产生必定有它的一段传奇历史,FFmpeg的创建者是法国天才程序员Fabrice Bellard (法布里斯贝拉)在 2000年是开发出初版;
法布里斯
贝拉:

高中就读期间开发了著名的可执行压缩程序LZEXE
2000年创建了FFmpeg项目

2011年,他用JavaScript写了一个Linux虚拟机(JSLinux)
他还是QEMU,TinyCC 的作者

2004年,迈克尔(Michael Niedermayer)接管FFmpeg, 迈克尔将滤镜子系统libavfilter 加入FFmepg项目中,使得FFmpeg的多媒体处理更加多样,更加方便。在FFmpeg发布了0.5版本后,很长一段时间没有进行新版本的发布,直到后来FFmpeg采用Git作为版本控制服务器以后才开始继续更新发布版本。

2011年3月, 由于FFmpeg项目中有一些提交者对FFmpeg的项目管理方式和发展方向不一致,FFmpeg团队分成了两派,其中一派认为FFmpeg应该更加专注于音视频开发,研究更新先进的音视频技术,这些人重新创建了一个新的项目叫Libav。 另外一派认为他们要兼顾老的FFmpeg技术,然后逐步发展。

2015年8月迈克尔主动辞去FFmpeg项目负责人的职务。迈克尔从Libav中移植了大量的代码和功能到FFmpegZhong , 从此Libav又和FFmpeg合并一起发展。

2. FFmpeg能做什么

多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。

视频采集功能:

  • ffmpeg视频采集功能非常强大,不仅可以采集视频采集卡或USB摄像头的图像,还可以进行屏幕录制,同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,支持直播应用。

  • 在Linux平台上,ffmpeg对V4L2的视频设备提供了很好的支持,如:./ffmpeg -t 10 -f video4linux2
    -s 176144 -r 8 -i /dev/video0 -vcodec h263 -f rtp rtp://192.168.1.105:5060 > /tmp/ffmpeg.sdp
    以上命令表示:采集10秒钟视频,对video4linux2视频设备进行采集,采集QCIF(176
    144)的视频,每秒8帧,视频设备为/dev/video0,视频编码为H263,输出格式为RTP,后面定义了IP地址及端口,将该码流所对应的SDP文件重定向到/tmp/ffmpeg.sdp中,将此SDP文件上传到流媒体服务器就可以实现直播了。

  • 在windows下关于ffmpeg视频采集的资料非常少,但是ffmpeg还是支持windows下视频采集的。ffmpeg支持windows下video
    forwindows(VFW)设备的视频采集,不过VFW设备已经过时,正在被WDM的视频设备所取代,但是ffmpeg还没有支持WDM的计划,不过好像有将WDM转为VFW的工具,因此ffmpeg还是可以在windows下进行视频采集的。

视频格式转换功能:

  • ffmpeg视频转换功能。视频格式转换,比如可以将多种视频格式转换为flv格式,可不是视频信号转换 。
  • ffmpeg可以轻易地实现多种视频格式之间的相互转换(wma,rm,avi,mod等),例如可以将摄录下的视频avi等转成视频网站所采用的flv格式。

视频截图功能:

  • 对于选定的视频,截取指定时间的缩略图。视频抓图,获取静态图和动态图,不提倡抓gif文件;因为抓出的gif文件大而播放不流畅。

  • 给视频加水印功能

  • 使用ffmpeg 视频添加水印(logo)。

在这里插入图片描述
【文章福利】小编推荐自己的Linux、C/C++技术交流群:【960994558】整理了一些个人觉得比较好的学习书籍、视频资料共享在里面,有需要的可以自行添加哦!~
快速学习FFmpeg视频https://www.bilibili.com/video/BV1G5411G7XY/

3.FFmpeg架构模块组成

在这里插入图片描述
libavutil

  • libavutil : 包含一些公共的工具函数;

  • AVUtil是FFmepg的核心工具库,该模块是最基础的模块之一,下面的许多其他模块都会依赖该库做一些基本的音视频处理操作。

libavformat

  • libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;

  • AVFormat
    是文件格式和协议库,封装了Protocol层和Demuxer,Muxer层,使得协议和格式对于开发者来说是透明的。AVFormat中实现了目前多媒体领域中的绝大多数媒体封装格式,包括封装和解封装,如MP4,FLV, KV, TS 等文件封装格式, RTMP, RTSP, MMS, HLS 等网络协议封装格式。

  • FFmpeg是否支持某种媒体封装格式,取决于编译时是否包含了该格式的封装库。根据实际需求,可进行媒体封装格式的扩展,增加自己定制的封装格式,即在AVFormat中增加自己的封装处理模块。

libavcodec

  • libavcodec:用于各种类型声音/图像编解码;

  • AVCodec是编解码库,该模块封装了Codec层,但是有一些Codec是具备自己的License的,FFmpeg是不会默认添加像libx264,FDK-AAC,lame等库的,但是FFmpeg就像一个平台一样,可以将其他的第三方的Codec以插件的方式添加进来,然后为开发者提供统一的接口。

  • AVCodec中实现了目前多媒体绝大多数的编解码格式,既支持编码,也支持解码。 AVCodec除了支持MPEG4,AAC,MJPEG等自带的媒体编解码格式之外,还支持第三方的编解码器,如H.264(AVC)编码,需要使用x264编码器; H.265(HEVC)编码,需要使用x265编码器;MP3(mp3lame)编码,需要使用libmp3lame编码器。如果希望增加自己的编码格式,或者硬件编解码,则需要在AVCodec中增加相应的编解码模块。

libavfilter

  • AVFilter :
    是音视频滤镜库,该模块提供了包括音频特性和视频特效的处理,在使用FFmpeg的API进行编解码的过程中,直接使用该模块为音视频数据做特效处理时非常方便同时也非常高效的一种方式。

libavdevice

  • AVDevice :
    输入输出设备,比如,需要编译出播放声音或者视频的工具ffplay,就需要确保该模块是打开的,同时也需要libSDL的预先编译,因为该设备模块播放声音与播放视频使用的都是libSDL库。

libswscale

  • libswscale : 用于视频场景比例缩放、色彩映射转换; SWScale
    模块是将图像进行格式转换的模块,例如,可以将YUV的数据转换为RGB的数据。

libpostproc

  • libpostproc : 用于后期效果处理;
  • PostProc模块用来进行后期处理,当我们使用AVFilter的时候需要打开该模块的开关,因为Filter中会使用到该模块的一些基础函数。如果是比较老的FFmpeg版本,那么有可能还会编译处理avresample模块,该模块其实也是用于对音频原始数据进行重采样,但是现在已经被废弃了,不再推荐使用该库,而是使用swrresample库进行替代。

libswrressample

  • SwrRessample 模块可用于音频重采样,可以对数字音频进行声道数,数据格式,采样率等多种基本信息的转换。

ffmpeg

  • ffmpeg : 该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等;

ffsever

  • ffsever : 一个 HTTP 多媒体即时广播串流服务器;

ffplay

  • ffplay : 是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;

4.Linux下安装ffmpeg

ffmpeg是一个很强大的音视频处理工具,官网是:FFmpeg 官网介绍ffmpeg是:一个完整的、跨平台的解决方案,可以记录、转换和传输音频和视频。ffmpeg既可以播放视频,也提供命令行工具来处理视频,另外还有强大的视频处理库用于开发,下面是以Linux为例介绍ffmpeg的安装流程的简单的命令行对视频进行转码操作,是ffmpeg中最最简单的入门内容.
  首先去官网下载源码包,这里下载的是ffmpeg-3.3.1.tar.bz2,下载之后上传至Linux准备安装,首先解压安装包:
tar -xjvf ffmpeg-3.3.1.tar.bz2
cd ffmpeg-3.3.1/
如果现在直接执行configure配置的话,可能会报如下的错误:
在这里插入图片描述
错误的意思是 yasm/nasm 包不存在或者很旧,可以使用–disable-yasm禁用这个选项编译,yasm是一款汇编器,并且是完全重写了nasm的汇编环境,接收nasm和gas语法,支持x86和amd64指令集,所以这里安装一下yasm即可,下载地址是:The Yasm Modular Assembler Project 进入后下载1.3.0的源码包,执行下面命令安装:
tar -xvzf yasm-1.3.0.tar.gz
cd yasm-1.3.0/
./configure
make
make install
编译参数都是默认的,直接安装到系统中即可,安装成功之后继续回到ffmpeg解压后的目录,执行下面命令编译并安装:
./configure --enable-shared --prefix=/monchickey/ffmpeg
make
make install

编译过程有点长,耐心等待完成之后执行 cd /monchickey/ffmpeg/ 进入安装目录,查看一下发现有bin,include,lib,share这4个目录,其中bin是ffmpeg主程序二进制目录,include是C/C++头文件目录,lib是编译好的库文件目录,share是文档目录,然后进入bin目录,执行 ./ffmpeg -version 查看当前版本的详细信息,默认情况下一般会报libavdevice.so.57: cannot open shared object file: No such file or directory,原因是lib目录未加载到链接到系统库中,系统ld目录列表在/etc/ld.so.conf中,打开文件会发现,里面引用了/etc/ld.so.conf.d/下面所有的.conf文件,比如mariadb-x86_64.conf我们只需要创建一个文件并写入lib路径即可,执行命令: vim /etc/ld.so.conf.d/ffmpeg.conf 然后添加一行内容: /monchickey/ffmpeg/lib 之后保存并退出,然后执行 ldconfig 使配置生效,现在再次执行 ./ffmpeg -version 显示就正常了
在这里插入图片描述
然后可以根据需要将bin目录添加至环境变量中以保证任何时候都能使用ffmpeg命令,下面测试一下对视频进行转码:
  首先由一个avi格式的视频文件,大小是37M,现在使用ffmpeg转换为mp4格式,执行下面命令:
ffmpeg -i test.avi out.mp4
确认之后,看到屏幕滚动开始处理,大约半分钟之后视频就转换完毕了,转换后mp4视频大小是17M,具体可以下载下来看一下
在这里插入图片描述
现在ffmpeg安装和最简单的命令行视频转换就完成了,实际上ffmpeg命令行工具可以有很多参数不用编程就可以实现强大的功能。

猜你喜欢

转载自blog.csdn.net/weixin_52622200/article/details/110714593
今日推荐