前言
之前笔者从事安卓开发的时候想要学习音视频实践,脑子里面想的是要是有专门针对安卓开发的FFmpeg教程就好了。慢慢地发现这个想法很不靠谱,因为那时关于音视频的相关教程本来就少,如果还要是针对安卓的就凤毛麟角了。
后来为了学习FFmpeg,笔者也是断断续续的,从音视频的基础资料开始,从FFmpeg编译到实践,希望通过自己的学习可以一点一点地揭开FFmpeg的神秘面纱,直到今天笔者只敢说仅是音视频开发大军中的一个入门新手而已,虽说自己摸索挺久,
但依旧难以进阶,我想其中有两个主要的原因,一是缺少仙人指路,二是断断续续,缺乏系统性的学习总结。
学习最重要的是融会贯通,如果你内心想要学习,但是又以没有完全针对性的教程资料为由,最后你会发现自己还是想的比做的多,还不如不想...
对于FFmpeg这东西,你说它难,其实它也就那么一回事,你说它简单,无数人在编译阶段就被迫放弃了,或许它难的不是它本身,更多学习者一个敢于开始的勇气和持之以恒的坚持吧。
为了让新手可以更快速地入门FFmpeg,笔者将开始连载关于FFmpeg相关文章,主要涉及音视频解封装、音视频解码、音视频编码、音频重采样等相关知识点。
在本系列文章的最后,可能会以一个小小的实践作为收尾,这个实践的内容大体是:
1、输入多个mp3文件,解码成pcm,然后进行重采样,拼接合并编码成aac音频;
2、输入多个mp4文件,提取出视频解码成yuv,然后拼接合并编码成h264;
3、将1中的aac音频和2中的h264视频合并成新的mp4文件。
今天我们主要是先把环境搭建好,毕竟千里之行始于足下。
笔者环境
笔者使用的范例环境了Mac系统,开发工具是CLion。
安装FFmpeg
关于引入在PC上引入FFmpeg的话还是比较简单的,可以通过命令行工具进行安装,然后将相关库提取处理即可,又或者可以直接使用源码直接编译相关库都可以。但是如果要想把FFmpeg继承到安卓中去就要使用NDK教程编译了,
对于如何使用NDK教程编译FFmpeg童鞋们可以去翻我之前的文章,或许后面有时间我在整理一份都行。
鉴于FFmpeg是一个C语言库,天生具备跨平台能力,所以学习的话笔者建议直接在PC上实践学习即可,如果你都学会了,那移植到其他平台那不是so easy吗。
今天笔者使用的是命令行安装的方式集成FFmpeg,在Mac上我们可以使用Homebrew包管理工具进行安装,Linux上可以用apt。
1、首先使用Homebrew安装ffmpeg:
brew install ffmpeg
然后静静等待即可,一般如果失败的话多是网络问题吧,解决方式众所周知...
2、安装成功后我们用brew info命令查看一下安装到哪里去了,后面引入工程时需要用到,命令是:
brew info ffmpeg
例如笔者的输出如图:
配置CLion工程
新建好CLion工程后,我们将FFmpeg的库路径和头文件配置一下,配置CMakeLists.txt:
cmake_minimum_required(VERSION 3.17)
# 注意 FFmpegPro是工程名称,开发这需要按照实际进行替换
project(FFmpegPro)
set(CMAKE_CXX_STANDARD 11)
# FFmpeg的安装目录,可以通过命令"brew info ffmpeg"获取
set(FFMPEG_DIR /opt/homebrew/Cellar/ffmpeg/5.0)
# 头文件搜索路径
include_directories(${FFMPEG_DIR}/include/)
# 动态链接库或静态链接库的搜索路径
link_directories(${FFMPEG_DIR}/lib/)
add_executable(FFmpegPro main.cpp)
#链接库
target_link_libraries(FFmpegPro
#FFmpeg 库
avcodec
avfilter
avformat
avutil
swresample
swscale
)
简单测试一下配置是否成功,在main代码中简单调用一些ffmpeg库的API,如果能正常运行则表示配置成功:
#include <iostream>
extern "C"{
#include "libavcodec/avcodec.h"
#include <libavformat/avformat.h>
#include "libavutil/avutil.h"
}
int main(int arg,char **argv) {
// 打印ffmpeg的信息
std::cout << "av_version_info:" << av_version_info() << std::endl;
std::cout << "av_version_info:" << avcodec_configuration() << std::endl;
return 0;
}
运行如果能正常打印出ffmpeg的版本号即表示环境配置成功。