Win7 安装 虚拟机 linux 编译ffmpeg 生成so文件

参考:https://www.jianshu.com/p/aaacd4ecb6f1 

敝人图正确道路,不拐卖磨脚走windows(会出现大量的错误,需要解决,太繁琐不如直接linux)

下面是补充:

在linux 系统里面预先安装好:vim,  yasm,   gcc(gcc  使用来编译C语言的 文件)


0.0 linux基本命令介绍
进入编辑模式,i
进入命令模式,Esc
命令模式:
【shift + :】然后输入 【q!】 回车 强制退出;----可在终端命令框最后一行可以看到效果
shift + z z保存退出;
x删除,dd删除行;
1.1 vim安装:apt-get install vim-gtk  (网速不好 非常耗时)
对于用虚拟机或云主机编译,并第一次使用apt-get install命令,可能会报错,需apt-get update更新一下仓库,再apt-get install vim-gtk安装即可。
可能还会报用户名不正确等奇怪的错,不用怕,这些都比较简单,自行百度解决即可。
1.2 vim配置
vim安装好后,vim /etc/vim/vimrc打开配置文件,在文件末尾添加如下配置:
set nu //行号显示
set tabstop=4 //tab为4空格(默认为8个)
set cursorline //高亮显示光标所在行
set ruler //右下角显示光标坐标
3.1 安装yasm: sudo apt-get install yasm(网速不好 非常耗时)
4 安装gcc:
    4.1 在搜索中找到 'Software & Updates',
        然后在 "Ubuntu Software" 菜单中将 "Source code"框勾选上。
         参考 [https://blog.csdn.net/Cyuyandashen/article/details/79416989]
    注释:1.这是用来添加一些 ‘deb-src’ 在 '/etc/apt/sources.list'文件中
        否则会提示:E: You must put some 'source' URIs in your sources.list
    4.2 安装gcc:sudo apt-get install gcc

  
Ubuntu:
2018-07-11日添加 linux
Ubuntu 18.04-LTS-桌面版-64位
下载地址:
http://releases.ubuntu.com/18.04/ubuntu-18.04-desktop-amd64.iso
bt种子:
http://releases.ubuntu.com/18.04/ubuntu-18.04-desktop-amd64.iso.torrent

Ubuntu 18.04-LTS-服务器版-64位
下载地址:
http://releases.ubuntu.com/18.04/ubuntu-18.04-live-server-amd64.iso
bt种子:
http://releases.ubuntu.com/18.04/ubuntu-18.04-live-server-amd64.iso.torrent

2.2 在Linux环境下编译FFmpeg

这里我使用的编译环境为:
开发工具:Android Studio 2.3.2
操作系统:Ubuntu 18.04-LTS 桌面版 64位

NDK版本:r17 【https://dl.google.com/android/repository/android-ndk-r17-linux-x86_64.zip】

    更多ndk版本 参考:【https://blog.csdn.net/liujian8654562/article/details/81033829】   

FFmpeg版本:FFmpeg 4.0.1 "Wu" 【http://ffmpeg.org/releases/ffmpeg-4.0.1.tar.gz】
{
别人写的:
当然也可以用高版本:
NDK版本:r12以上
FFmpeg版本:3.x以上
说明: ffmpeg2.x版本要用NDK r11以下的版本来编,
      ffmpeg3.x以上的版本一般用r12以上的NDK来编,具体的对应关系还有待研究

}

2.2.1 下载、安装NDK

step 1:下载NDK,我这里是android-ndk-r17b版本,并解压--必须在linux里面进行解压extra

step 2:配置NDK环境变量:
打开配置文件:vim ~/.bashrc(没装vim的“sudo apt-get install vim-gtk”安装一下,如果 安装出错,且看下面的补充),按i切换输入模式,在文件末尾添加

export NDKROOT=/home/dongxiang/Develop/NDK/android-ndk-r14b
export PATH=$NDKROOT:$PATH
按ESC退出回到命令模式,再按shift + zz(即:ZZ), 保存修改。
更新环境变量: source ~/.bashrc
输入ndk-build -version命令,如果出现如下信息,说明NDK安装成功。
image.png
补充:linux基本命令与vim安装、配置
1)linux基本命令介绍
进入编辑模式,i
进入命令模式,Esc
命令模式:
shift + :退出;q!强制退出;
shift + z z保存退出;
x删除,dd删除行;
2)vim安装:apt-get install vim-gtk
对于用虚拟机或云主机编译,并第一次使用apt-get install命令,可能会报错,需apt-get update更新一下仓库,再apt-get install vim-gtk安装即可。
可能还会报用户名不正确等奇怪的错,不用怕,这些都比较简单,自行百度解决即可。
3)vim配置
vim安装好后,vim /etc/vim/vimrc打开配置文件,在文件末尾添加如下配置:
set nu //行号显示
set tabstop=4 //tab为4空格(默认为8个)
set cursorline //高亮显示光标所在行
set ruler //右下角显示光标坐标

2.2.2 下载FFmpeg源码、编写编译脚本

step 1:下载ffmpeg源码,我这里下载的是ffmpeg-3.2.11版本,unzip ffmpeg-4.01.zip解压到ffmpeg-4.01目录(unzip用sudo apt-get install unzip命令安装)。

step 2:下载FFmpeg源码之后,首先需要对源代码中的configure文件进行修改。由于编译出来的动态库文件名的版本号在.so之后(例如“libavcodec.so.5.100.1”),而android平台不能识别这样文件名,所以需要修改这种文件名。即使暴力去掉so后面的后缀,在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_MAJOR='$(SLIBPREF)$(FULLNAME)$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'

step 3:在当前目录下新建一个build_android.sh脚本文件
内容为:注意要在linux里面,用编辑器打开,将换行删除,在进行换行(或者设置utf-8 无BOM)

#!/bin/bash
make clean
#填写你具体的ndk解压目录
export NDK=/home/dongxiang/Develop/NDK/android-ndk-r17b
#export NDK=/android/ndk/android-ndk-r13b
export SYSROOT=$NDK/platforms/android-14/arch-arm/ 
#export SYSROOT=$NDK/platforms/android-9/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 
#export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
export CPU=arm
#编译后的文件会放置在 当前路径下的android/arm/下;必须创建好android 文件夹
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"
 
 
#./configure 即为ffmpeg 根目录下的可执行文件configure
#你可以在ffmpeg根目录下使用./configure --hellp 查看 ./configure后可填入的参数。
 
./configure 
    --target-os=linux \
    --prefix=$PREFIX 
    --arch=arm \
    --disable-doc \
    --enable-shared \
    --disable-static \
    --disable-yasm \
    --disable-symver \
    --enable-gpl \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --disable-doc \
    --disable-symver \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
    --extra-ldflags="$ADDI_CFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install

在这个脚本前面,配置了三个变量(NDK、SYSROOT、TOOLCHAIN),都是指定好NDK的一些工具,目录的,NDK指定自己所用的NDK安装路径。要注意的是在:SYSROOT里面,我编译的platform是android-14的,因为NDK对platform有时会有一些影响的,做过深入的NDK开发的同学应该清楚,所以这个要看具体的需要进行更改什么的。

  • --enable-static --disable-shared:这两个是看编译出来的库是静态库(.a)还是动态库(.so),如果要编译成动态库就--enable-shared --disable-static,或者两个都编译出来。
  • --disable-ffmpeg:不要ffmpeg这个工具,ffmpeg是一个命令行工具,非常强大,在官网也可以看到,但我们通过代码开发,就不需要它了
  • --disable-ffplay --disable-ffprobe --disable-ffserver:这些都是不需要的工具,当然也可以编译出来看看
  • --disable-avdevice:这个库是用来操作一些硬件设备的,如摄像头这些,但Android中感觉不需要它,也可以编译出来试试能不能使用在Android上
  • --disable-doc:取消文档
  • --disable-symver:禁用 symbol versioning
  • PREFIX=(pwd)/android/CPU:指定编译成功的库所在的目录,这个配置是:当前目录下的android目录下的指定的cpu平台目录下

动态库与静态库:

动态库就是只要Android设备里面有公开这个so,那APP就可以使用,就是只要一次安装,其他APP就可以使用了,但APP打包进去的so都是在当前APP的私有目录下的,不能被其他APP使用的,所以动态库的优势就没有了, 而且就暴露了它的缺点,就是so非常大的时候,就会形成Apk包非常大。
静态库就是会把需要的代码打包到自己的so里面,所以这样子就可以解决动态库上面的那个缺点
所以这里我们编译出来的是静态库,因为编译出来的库有50多M,所以使用静态库的方式,可以使打包出来的apk最小化。


2.2.3 编译.so文件

1.首先切换到root用户:(root包含所有权限 permission)

su root  然后输入密码;

如果是首次安装linux:
1. 打开一个terminal,然后输入下面的命令
  sudo passwd root
回车后会出现让你输入原始密码,新密码和确认密码:
[sudo] password for you: ---> 输入你的密码(你现在这个用户的密码)
Enter new UNIX password: ---> 设置root 密码
Retype new UNIX password: ---> 重复密码
这样你的root的密码设置好了.
注:root可以省略,命令为passwd而不是password,我犯过这个错误.
2. 在terminal中利用su命令就可以切换到root用户了.
注:su和sudo的区别是:
  1) su的密码是root的密码,而sudo的密码是用户的密码;
  2) su直接将身份变成root,而sudo是以用户登录后以root的身份运行命令,不需要知道root密码.
3.然后 su root 登录root账号了

接下来输入命令:

首先赋予文件权限    chmod +x build_android.sh

 然后执行命令文件    ./build_android.sh。

如果build_android.sh文件是在Windows下创建的,编译会报错,报错的原因是因为编码格式问题,解决方式:
1)用Notepad++打开设置成“utf-8 无BOM”格式,然后上传到Linux,并用doc2unix工具(sudo apt-get install doc2unix命令安装)对脚本格式进行转换:doc2unix build_android.sh;
2)在Linux环境下创建.sh文件,传输到Windows下修改文件内容,再上传到Linux。

因为编译是比较耗时的,编译个20分钟是很正常的,电脑性能好的,会快点,差的可能半小时都正常。
经过一段时间的编译,我们就可以在脚本里面定义的那个目录里面看到编译成功的库了。在当前目录下就会有一个android的目录,点进里面后,就会看到编译成功的库了,如下图:

image.png

可以看到有16个.so文件,有带数字与不带数字的,我们要用的是带数字的,共8个,这些数字是类似与版本号的东西,ffmpeg4.x编出来的.so文字数字会大些。

这样,我们就把ffmpeg4.01 编译好了。


内容大部分都是自己写的,下载的东西有点多;
链接:https://pan.baidu.com/s/1Z5rpmtBOjvNuj-PIZT6AMQ 密码:7ptn

猜你喜欢

转载自blog.csdn.net/a2241076850/article/details/80284662