乔微博 发表于 2022-3-26 10:33:07

Android音视频之初识FFmpeg(一个强大到只能跪服的音视频框架)!

   相信每一个搞音视频开发的都或多或少的接触过FFmpeg或者听说它的大名。它可以说是音视频领域的第一开源框架,代码极其庞大,能达到熟练使用就已经不易了!在Android这个平台上如果要使用软解的话,我相信它是一个不错的选择。同时它也被应用到各大视频类的APP中,比如抖音什么的。嘿嘿当你反编译QQ或者微信你会发现它的倩影。下面直接上干货:
  访问FFmpeg开源框架的官网FFmpeg 。

点击 Download 下载最近的release版本进行编译,笔者选择的是 FFmepg 4.0 其实编译 ffmepg分为以下几个步骤:
1.cd ffmegdir (进入ffmepg源码所在的目录文件夹下面)
2. ./configure (注意该命令下面有个小点)
3. make
4. make install
以上的4个命令,可能有些初学者不是很明白(很正常,make命令,这些如果不是搞C/C++ 嵌入式方面的人 根部不会遇到这个的),依次解释下!cd 这个不用说了不管是在Window 、Mac OS 、还Linux 系统上都是进入某个文件夹的的意思。 ./configure是对所要编译的源码的配置。这操作会检测一些系统环境,例如,ffplay的编译是需要sdl(Simple DirectMedia Layer),它是一套用C语言写成的开放源代码的跨平台多媒体开发库。如果没有sdl,那么就无法编译出ffplay.(编译这个的时候笔者遇到过大坑,后面细说)。make命令是就是编译源码的命令,它会根据makefile文件进行编译(这些文件源码中已经含有)。编译完成之后,在ffmpeg文件夹下面会生成几个可执行文件ffplay(默认不生成),ffserver(默认不生成),ffmpeg,ffprobe文件夹等。实际上,至此我们已经完成了源码的编译。make install 的作用就是把这些命令和编译好的lib安装到你的系统里面。实际上你不安装也可以,在你之后用的时候,就显示的指明执行文件的路径,头文件以及lib的位置就行,不过还是建议安装一下,否则用起来还是比较费事的。 以上的4个命令可以说的非常的实用,尤其是以后编译第三方库(C/C++)的时候,这就是万能的步骤,万变不离其宗,哈哈!
前提准备 :(笔者是在Mac下编译的)
1.Mac要有安装Xcode ,恩,这个实用mac开发的程序员,我相信都已经安装过了。没有的话去APP Store安装下载。
2.安装brew  在终端上(复制黏贴)执行下面一跳命令即可:
ruby -e "$(curl --insecure -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 如果执行无效,请参考这篇文章解决  安装Homebrew解放方案
3.安装 sdl
brew install sdl2 4.安装pkgconfig  (可选,关于这个,网上说要安装,但是笔者没有安装一样完美运行)
sudo port install pkgconfig
pkg-config 安装方法
 
准备工作完成之后,我们开始编译FFmpeg.
1.先看看FFmpeg 4.0中的源码文件

其中 android_build.sh 是笔者后来添加上去的,后文会详细讲解。
按照上面的步骤进行:

发现编译出错,这是正常的现象,编译第三方库经常遇到习惯就好.首先你应该观察为什么?不知道的时候就只有度娘再不行就只能谷爸了。
configure时增加--disable-x86asm. asm是汇编编译器, 因为ffmpeg中为了提高效率用到了汇编指令。

 
--prefix=/Users/zhulei/Desktop/ffmpeg_out  指定输出文件的路径   --disable-x86asm 不使用asm汇编编译器。
接下来使用 make 命令:
make 命令敲完之后 就要经过漫长的等待了,因为编译这个挺消耗时间的!编译过程中警告不用管,错误你就要查阅相应的资料解决了。
make 命令之后紧接着一个 make install 命令:

然后我们可以打开我们的ffmpeg_out文件夹看看. bing go 编译出来了.

include 文件里面是ffmpeg各个模块要使用的头文件  lib文件夹下面则是ffmpeg库  share文件下面是ffmepg库的使用样例。bin目录下面则是ffmpeg 的工具 。
可能有人没有编译出 ffplay 这个工具 这里有2个重要的原因:
1.config.h 中的 #define CONFIG_FFPLAY 的值为0 将其改为1
2.sdl版本需要安装sdl2 而不是sdl(第一代)
尤其是第二点 真是深坑啊。
make install 之后我们可以使用ffpaly当播放器 进行播放视频了 比如在终端敲一个简单的命令:
ffplay  视频全路径     
那么到了这里就完了么。no 我们还有一个android_build.sh 脚本没有讲解 下面来看看吧:
#!/bin/bash#这里修改为你的ndk的路径NDK=/Users/zhulei/android-ndk-r13b#注意android-23文件夹的版本号,替换好自己的版本号。下面的路径同理 SYSROOT=$NDK/platforms/android-23/arch-arm64/TOOLCHAIN=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64function build_one(){ ./configure \--prefix=$PREFIX \--disable-shared \--enable-static \--disable-doc \--enable-cross-compile \--cross-prefix=$TOOLCHAIN/bin/aarch64-linux-android- \--target-os=android \--arch=aarch64 \--sysroot=$SYSROOT \--extra-cflags="-Os -fpic $ADDI_CFLAGS" \--extra-ldflags="$ADDI_LDFLAGS" \$ADDITIONAL_CONFIGURE_FLAG}CPU=arm64PREFIX=/Users/zhulei/Desktop/ffmpeg/$CPU#ADDI_CFLAGS="-marm"build_one 为什么会有这个sh脚本 ,原因很简单因为我们编译的代码要在android上运行啊,使用mac编译,没有进行相应的配置的话,默认使用mac的gcc编译器 这样编译出来的库我们是没有办法使用的。所以我们需要使用ndk里面的编译器进行编译。
--prefix  指定输出路径
--disable-shared 不编译动态库
--enable-static  编译静态库
--disable-doc   不编译文档
--enable-cross-compile 可以进行交叉编译
--cross-prefix 交叉编译器的路径 (它会自己到相应路径下寻找)
--target-os=android    android平台
--arch=aarch64  架构
--sysroot  指定了逻辑目录。编译过程中需要引用的库,头文件,如果要到/usr/include目录下去找的情况下,则会在前面加上逻辑目录
其余的extra 是一些优化特色可用不用管,对于初学者而言。
我上面的脚本是编译64位的arm库  如果需要编译32位的。需要修改 --arch  --cross-prefix  SYSROOT   TOOLCHAIN 这四个值,改成相应的ndk目录下面对应的32未的即可!
 
 
额外小技巧工具:
我们的mac电脑上安装了brew之后 以后安装软件就可方便了 。只要在终端 brew install 软件名字 ,就会自动下载并安装相应的软件 ,似不似很方便,哈哈!
比如: brew install you-get
you-get 是一个很有用的下载视频工具 。安装好了 你可以使用简单的命令行下载国内各大网站的视频,而不需要通过他们的客户端,是不是神器 ,很happy是吧,嘿嘿! you-get使用教程
轻松一刻:
看了这么久的技术文章相信客官您一定很累了,那么就让我为您献上2个精彩视频 让你缓解缓解下疲劳哈。
精彩视频1        精彩视频2
打赏一下:            
            
 
各位看官,看着打赏点吧,一毛也是爱~~

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: Android音视频之初识FFmpeg(一个强大到只能跪服的音视频框架)!