Native开发工具之交叉编译移植(五)

246 阅读3分钟

阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:space.bilibili.com/474380680
本文将通过以下三个部分来介绍交叉编译移植

  • FFmpeg 编译
  • FFmpeg+LIBX264+FACC交叉编译 实现264流录制AVI文件
  • 移植FFmpeg在arm交叉编译时遇到的问题

一、FFmpeg 编译

FFmpeg 是什么?

FFmpeg 全称(First Forward MPEG),是一款领先的开源多媒体框架,采用 LGPL 或 GPL 许可证,除了具有音视频编解码功能外,还有视频格式转换、视频抓图、视频水印、推流等功能。 FFmpeg 在 Linux 平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括 Windows 、Mac OS X 等。

FFmpeg的官方网站是:ffmpeg.org/

Windows 平台下,编译好的可用版本一般有三个: Static ,Shared ,Dev 。Static 里面有 3 个应用程序:ffmpeg.exe ,ffplay.exe ,ffprobe.exe ,动态链接库都被编译在 exe 文件中,每个 exe 的体积都很大,可直接运行,如播放一段视频,命令行下执行:ffmpeg video.mp4。Shared 里面除了 3 个应用程序:ffmpeg.exe ,ffplay.exe ,ffprobe.exe 之外,还有一些动态链接库,如 avcodec-54.dll 之类的,Shared 里面的 exe 体积较小。Dev 版本主要用于开发的,里面包含了一些库文件 xxx.lib 和文件 xxx.h 。

Linux 平台下,本文选择的版本是 2.6.9 ,地址:ffmpeg.org/olddownload…

编译 FFmpeg

搭建 Linux 开发环境,安装 Ubuntu 虚拟机或者电脑装成双系统,或者购买一个低配的阿里云主机,文件传输工具推荐 FileZilla 或 XFTP 。

Linux 环境下配置 NDK

首先下载 Linux 环境下的 NDK (注意科学上网),如 android-ndk-r11c-linux-x86_64.bin
执行如下命令进行解压缩:
./android-ndk-r11c-linux-x86_64.bin
配置环境变量,首先编辑 .bashrc 文件。
vim ~/.bashrc
在文件结尾添加两行代码:

export NDKROOT=( NDK 解压的根目录)如 、/usr/workspace/ndk/android-ndk-r11c
export PATH=$NDKROOT:$PATH

更新环境变量:
source ~/.bashrc

编译准备

首先下载 FFmpeg ,地址:ffmpeg.org/olddownload…
解压:uzip ffmpeg-2.6.9.zip
然后编写用于编译的 Shell 脚本,在 ffmpeg-2.6.9 根目录下执行:vim build_android.sh

#!/bin/bash
make clean
export NDK=/home/wuhuannan/Android/Sdk/ndk-bundle
export SYSROOT=$NDK/platforms/android-14/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
export CPU=arm
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"

./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_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install

然后修改根目录下的 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)'

修改文件权限:

chmod +x build_android.sh configure

执行一下脚本开始编译:

./build_android.sh

约几分钟后,编译生成的动态库文件如下:

二、FFmpeg+LIBX264+FACC交叉编译 实现264流录制AVI文件

需求:
把标准的h264流保存成avi格式的实现文件,所以须要h264的解码器,avi文件容器,传输协议类型是文件。这些会体如今ffmpeg的configure配置上--disable-everything --enable-protocol=file --enable-encoder=libx264 --enable-encoder=libfaac --enable-libx264 --enable-gpl --enable-libfaac --enable-nonfree --enable-muxer=avi --enable-demuxer=avi。
1 .下载libx264 ffmpeg facc
下载的三个包:x264-snapshot-20120718-2245-stable.tar.bz ffmpeg-0.11.1.tar.gz faac-1.28.tar.bz2
2 .交叉编译libx264

2.1 解压x264-snapshot-20120718-2245-stable.tar.bz 到文件夹 /root/workspace/multimedia/ffpmeg

2.2 进入文件夹 /root/workspace/multimedia/ffpmeg/x264-snapshot-stable

2.3 创建文件夹 /root/workspace/multimedia/ffpmeg/out

2.4 运行configure 构造Makefile

./configure --enable-static --host=arm-linux --disable-asm --prefix=/root/workspace/multimedia/ffpmeg/out

2.5 改动config.mak

CC=/opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-gcc

LD=/opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-gcc -o

AR=/opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-ar rc

RANLIB=/opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-ranlib

STRIP=/opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-strip

保存

2.6 运行 make

2.7 运行 make install,结束。

编译好的静态库 放在out文件夹里

3 交叉编译 faac
3.1 解压 ffmpeg 到文件夹/root/workspace/multimedia/ffmpeg

3.2 进入文件夹 /root/workspace/multimedia/ffmpeg/ffmpeg-1.0

3.3 运行configure 构造Makefile

./configure --enable-static --host=arm-linux --with-mp4v2 --prefix=/root/workspace/multimedia/ffpmeg/out CC=/opt/dm6467t/arm-2009q1-203/bin/arm-none-linux-gnueabi-gcc CXX=/opt/dm6467t/arm-2009q1-203/bin/arm-none-linux-gnueabi-g++

3.4 运行 make

3.5 运行 make install

3.6 运行 make clean,结束。

编译好的静态库,放在out文件夹里 尽管配置了静态库但动态库已编译了。

4 交叉编译 ffmpeg
4.1 解压 ffmpeg 到文件夹/root/workspace/multimedia/ffmpeg

4.2 进入文件夹 /root/workspace/multimedia/ffmpeg/ffmpeg-1.0

4.3 运行configure 构造Makefile

./configure --arch=arm --target-os=linux --cc=/opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-gcc cxx=/opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-g++ strip=/opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-strip --enable-cross-compile --disable-avdevice --disable-avfilter --disable-network --enable-static --disable-shared --enable-small --disable-debug --disable-everything --enable-protocol=file --enable-encoder=libx264 --enable-encoder=libfaac --enable-libx264 --enable-gpl --enable-libfaac --enable-nonfree --enable-muxer=avi --enable-demuxer=avi --prefix=/root/workspace/smart-box-apps-v1.0/sbox_app/multimedia/ffpmeg/out --extra-cflags=-I/root/workspace/smart-box-apps-v1.0/sbox_app/multimedia/ffpmeg/out/include --extra-ldflags=-L/root/workspace/smart-box-apps-v1.0/sbox_app/multimedia/ffpmeg/out/lib

4.4 运行 make

4.5运行 make install,结束。

编译好的静态库 放在out文件夹里。

说明: --disable-everything 一定要关闭全部,然后再打开你须要的模块。不然编译的静态库有几十兆

5 使用 ffmpeg 库
改动原有的Makefile 加入:
INCLUDES+=-I$(SBOX_APP_DIR)/multimedia/ffpmeg/out/include

LIBS+=$(SBOX_APP_DIR)/multimedia/ffpmeg/out/lib/libavformat.a

LIBS+=$(SBOX_APP_DIR)/multimedia/ffpmeg/out/lib/libavcodec.a

LIBS+=$(SBOX_APP_DIR)/multimedia/ffpmeg/out/lib/libx264.a

LIBS+=$(SBOX_APP_DIR)/multimedia/ffpmeg/out/lib/libfaac.a

LIBS+=$(SBOX_APP_DIR)/multimedia/ffpmeg/out/lib/libavdevice.a

LIBS+=$(SBOX_APP_DIR)/multimedia/ffpmeg/out/lib/libavfilter.a

LIBS+=$(SBOX_APP_DIR)/multimedia/ffpmeg/out/lib/libavutil.a

LIBS+=$(SBOX_APP_DIR)/multimedia/ffpmeg/out/lib/libswresample.a

LIBS+=$(SBOX_APP_DIR)/multimedia/ffpmeg/out/lib/libswscale.a

编译出可运行程序2.2M大小,裁剪成功。

三、移植FFmpeg在arm交叉编译时遇到的问题

遇到的问题1:


aarch64-himix100-linux-gcc is unable to create an executable file.C compiler test failed.
解决方法:

1、首先查看移植时具体出现的问题:vi ffbuild/config.log ,config.log是在./congfigure遇到问题时的记录日志,直接查看最后一行



出现:aarch64-himix100-linux-gcc: error: missing argument to '-mcpu='

2、这是因为./congfigure配置选项--cpu类型没有赋值,看了一下交叉编译平台的cpu类型是cortex-a73

3、在配置选项加入 ./congfigure --cpu=cortex-a73,即可解决。(gcc编译的就不是arm系统了,直接删除arch=arm这项)

遇到的问题2:

libavcodec/arm/idctdsp_arm.S:1: 错误: junk at end of line, first unrecognized character is `@'

解决方法1:

.S文件是gcc自己管理的,这种问题很大可能是汇编器的问题,可能是汇编器版本不匹配,或者没有汇编器,替换一下同一汇编版本的 .S 。

解决方法2:

在配置选项加入 ./congfigure --disable-asm,即可解决。
参考 www.jianshu.com/p/4075d1ba5…
blog.csdn.net/weixin_4243…
www.cnblogs.com/tlnshuju/p/…

阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:space.bilibili.com/474380680