天天看点

FFmpeg项目初探学习笔记

FFmpeg是广泛使用于的多媒体解决方案,是一个自由软件项目的名称,采用LGPL或GPL许可证。它提供了录制/转换以及流化音视频的完整解决方案。包含非常先进的音频/视频编解码库libavcodec。为了保证高可移植性和编解码质量,libavcodec里很多代码都是新开发的。“FFmpeg”这个词中的“FF”指的是“Fast Forward”,而“mpeg”指的是一种压缩率比较大的活动图像和声音的压缩标准。

一.FFmpeg简介:

命令行工具概述(Command Line Tool Documentation):

ffmpeg -i input.avi -r 24 output.avi
           

以上可以把input.avi中的帧率变成24,输出的output.avi就是24fps的视频。

  • ffmpeg:包含FFmpeg的各种功能,如gif/格式转换/截图/编解码等;
  • ffmpeg-all:包含FFmpeg工具及FFmpeg组件;
  • ffplay:一个使用FFmpeg和SDL库的/简单的/可移植性的媒体播放器。
  • ffplay-all:包含ffplay工具及FFmpeg组件;
  • ffporbe:用来查看多媒体文件的信息;
  • ffporbe-all:包含ffprobe工具及FFmpeg组件;
  • ffserver:与流媒体服务器相关,负责响应客户端的流媒体请求,把流媒体数据发送给客户端;
  • ffserver-all:包含ffserver工具及FFmpeg组件。

组件概述(Componets Documentation):

  • Utilities:libavutils提供的通用的features及工具;
  • Video scaling and pixel format converter:视频缩放和缩放像素格式转换器;
  • Audio resampler:音频重新取样;
  • Encoders and decoder(codecs):编码和解码;
  • Bitstream filters:码流过滤器;
  • Muxers and demuxers(formats):数据合成及数据分离;
  • Protocols:协议;
  • Input and output devices:输入和输出设备;
  • Filters:过滤器。

类库概述(Libraries Documentation):

  • libavutil:包含一些公共的工具函数的使用库,包含算术运算/字符操作等;
  • libswscale:(原始视频格式转换)用于视频场景比例缩放/色彩映射转换/图像颜色空间或格式转换,如RGB565/RGB888等与YUV420等之间的转换;
  • libswresample:原始音频格式转码;
  • libavcodec:用于各种类型声音/图像编解码,该库是音视频编解码核心库,实现了市面上可见绝大部分编解码器的功能;
  • libavformat:用于各种类型音视频封装格式的生成和解析,包含获取解码核心库所需信息以生成解码上下文结构和读取音视频帧的功能,音视频的格式解析协议,为libavcodec分析码流提供独立的音频或视频码流源;
  • libavdevice:硬件采集/加速/显示。操作计算机中常用的音视频捕捉或输出设备有ALSA/AUDIO_BEOS/JACK/OSS/1394/VFW等;
  • libfilter:filter(FileIO/FPS/DrawText)音视频铝箔器的开发,如宽高比/裁剪/格式化/非格式化/伸缩等。

二.FFmpeg源码目录结构:

对照FFmpeg-3.1.3补充如下两个库:

  • libavresample:音视频封装编解码格式预设等;
  • libpostproc:(同步/时间计算的简单算法)用于后期效果处理,音视频应用的后处理,如图像的去块效应。

文件概述(General Documentation):

  • Frequently Asked Questions:常见问题;
  • Supported External Libraries,Formats ,Codecs or Features:支持扩展库/格式/编解码或特性;
  • Platform Specific Information:平台具体信息;
  • Developer Documentation:开发者概述;
  • Git How-To:Git;
  • FFmpeg Automated Testing Environment:FFmpeg自动化测试环境。

三.在Mac OS下编译FFmpeg(摘自何俊林android音视频开发一书):

下载源码及配置环境变量:

FFmpeg下载地址,选择Mac OS下载。解压后如下图

FFmpeg项目初探学习笔记

下载NDK安装包,并配置NDK环境:

  • 启动终端Terminal;
  • 进入当前用户的home目录(输入cd ~ 或/User/YourUserName);
  • 创建.bash_profile文件(输入touch .bash_profile);
  • 编辑.bash_profile文件(输入open -e .bash_profile);
FFmpeg项目初探学习笔记
  • 在.bash_profile中配置NDK及SDK的开发环境,需要输入Mac OS下的NDK的目录:
FFmpeg项目初探学习笔记
  • 保存文件,关闭 .bash_profile。更新刚配置的环境变量,输入source.basd_profile。并查看刚刚配置设置的环境变量,离开编辑器后在终端输入$PATH并按下Enter键来确定是否编辑成功,成功之后配置文件内容如下:
FFmpeg项目初探学习笔记
  • 进入终端NDK下的sample目录,输入cd hello-jni/命令,按下enter键然后执行ndk-build命令。

开始编译FFmpeg:

  • 修改FFmpeg的configure文件,由于编译出来的动态库文件的版本号在.so之后(如libavcodec.so.5.100.1),而Android平台不能识别这样的文件名字,所以需修改文件名,在configure替换如下内容:
#SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
#LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
#SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
#SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'

SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)'
SLIBNAME_WITH_MAJOR='$(SLIBPREF).$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
           
  • 编写shell脚本,拷贝ffmpeg下名为version.sh的shell脚本,复制为名为build_android.sh:

如执行./build_android.sh时出现-bash ./build_android.sh:Permission denied则是改shell文件权限未开,则需要开读写权限"chmod a+x build_android.sh",如出现“-bash: ./build_android.sh: /bin/bash^M: bad interpreter: No such file or directory”则是文本格式要修改,vim build_android.sh编辑"set ff=unix"。