FFmpeg 是什么
FFmpeg 既是一款音视频编解码工具,同时也是一组音视频编解码开发套件,作为编解码开发套件,他为开发者提供了丰富的音视频处理的调用接口。
FFmpeg 提供了多种媒体格式的封装和解封装,包括多种音视频编码、多种协议的流媒体、多种色彩格式转换、多种采样率转换、多种码率转换等; FFmpeg 框架提供了多种丰富的插件模块,包含封装与解封转的插件、编码与解码的插件等。
官方地址:https://www.ffmpeg.org/
GitHub:https://github.com/FFmpeg/FFmpeg
为什么要学 FFmpeg 开发
FFmpeg 是一款知名的开源音视频处理软件,它提供了丰富而友好的接口支持开发者进行二次开发。
FFmpeg 读作 “ef ef em peg” ,其中的 “FF” 指的是 “Fast Forward”,“mpeg” 则是 “Moving Picture Experts Group” (动态图像专家组)。
FFmpeg 项目功能复杂而庞大,基本上支持所有常见的音视频处理操作,如封装格式转换、音视频转码、音视频播放和剪辑、视频添加水印滤镜等。
尽管 FFmpeg 功能强大,但是由于其采用的是带有传染性的 LGPL/GPL 开源协议,所以一些大厂基本上都是自己独立开发类似的音视频处理库,甚至在接口和组织模块上模仿 FFmpeg 。
功能模块
FFmpeg 有六个常用的功能模块:
- libavformat:多媒体文件或协议的封装和解封装库,如 Mp4、Flv 等文件封装格式,RTMP、RTSP 等网络协议封装格式;
- libavcodec:音视频编解码库;
- libavfilter:音视频、字幕滤镜库;
- libswscale:图像格式转换库;
- libswresample:音频重采样库;
- libavutil:工具库;
Android编译
编译方式
参考 https://juneyang.blog.csdn.net/article/details/126819292。
编译出来引入到我们的项目我们就可以进行C++开发了,但是没基础难度高。
所以可以先从别人封装好的工具入手
FFmpegKit
https://github.com/arthenica/ffmpeg-kit
FFmpegKit是一组在Android、iOS、Linux、macOS、tvOS、Flutter和React Native应用程序中使用FFmpeg的工具。
主要通过命令的方式进行对FFmpeg的调用。
支持的命令可以参考:https://ffmpeg.org/ffmpeg.html
示例
获取媒体信息的方式
FFprobeKit.getMediaInformation(videoPath).
mediaInformation
处理音视频命令
# # 把前十帧转换为GIF
# -i $videoPath -vframes 10 -y -f gif ${outputPath}/ten.gif
# # 去掉视频的声音
# -i $videoPath -vcodec copy -an -y ${outputPath}/rmAudio.mp4
# # 视频音频进行合并
# -i ${outputPath}/rmAudio.mp4 -itsoffset 0.5 -i ${filesDir.absolutePath}/wind.mp3 -c:v copy -c:a aac -strict experimental -y ${outputPath}/merge.mp4
# #视频添加水印
# -i $videoPath -i ${filesDir.absolutePath}/avatar.png -filter_complex overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2 -y ${outputPath}/waterMark.mp4
直播推流和接收流
## 直播推流
# -re -i $videoPath -c copy -f flv rtmp://124.222.158.29/live/livestream?secret=dfdb1077b4474c059c569044f8923c2d"
## 接收流
# -i rtmp://124.222.158.29/live/livestream?secret=dfdb1077b4474c059c569044f8923c2d -c copy -y ${outputPath}/push.mp4"