前言

之前笔者从事安卓开发的时候想要学习音视频实际,脑子外面想的是要是有专门针对安卓开发的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的版本号即示意环境配置胜利。

举荐浏览

C++之指针扫盲
C++之智能指针
C++之指针与援用
C++之右值援用
C++之多线程一
C++之多线程二

关注我,一起提高,人生不止coding!!!