在开发中各种第三方库和环境配置是比较消耗时间和耐心的,就将ffmpeg交叉编译的过程记录一下。其实其他三方库的编译过程也是这样的,交叉编译其他库时也可以参考本文过程。
Ubuntu上安装的方式大概有以下三种:
① apt-get安装apt-get install build-essential
;
② dpkg安装deb文件dpkg -i example.deb
;
③ wget或者手动下载源码后手动编译,手动编译也有两种方式:configure之后make && make install,mkdir build; cd build; cmake .
。为了全局可用,需要配置环境变量,也就是在/etc/peofile
、~/.bashrc
内export PATH=$PATH:
;有时还需要加入动态装载器(在ld.so.conf
加入lib路径)然后运行sudo ldconfig
命令加入ld.so.cache
。
1.资源准备
需要下载交叉编译器和ffmpeg源码,使用交叉编译器编译ffmpeg;
序号 | 网址 |
---|---|
交叉编译器 | https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/ |
ffmpeg源码 | https://github.com/BtbN/FFmpeg-Builds/releases |
下载源码自己编译即可,如果想要搭建windows命令行可以选择已经编译好的版本
我的目标平台是RK3568,下载x86_64_aarch64-linux-gnu;
2. 安装交叉编译器
交叉编译器就在/bin目录下,只需要将编译器的/bin目录加入环境变量即可;
tar -vxf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar
# 添加环境变量,把前面的改成自己的目录即可,或者加入/etc/profile
vim ~/.bashrc
export PATH=$PATH:/home/hjs/rk3568/toolKits/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin
source ~/.bashrc
验证是否成功:
3. 交叉编译ffmpeg
–prefix是库编译成功后的安装地址,修改成你想要保存库的目录即可
./configure --prefix=/home/hjs/rk3568/3rparty/ffmpeg --enable-cross-compile --arch=arm64 --target-os=linux --cc=aarch64-linux-gnu-gcc --disable-x86asm --cross-prefix=aarch64-linux-gnu-
make -j4
make install
./configure --prefix=/home/hjs/rk3568/3rparty/ffmpeg --enable-cross-compile --arch=arm --target-os=linux --cc=aarch64-linux-gnu-gcc --disable-x86asm
用上述配置时出现上图错误 unknown mnemonic itt' --
itt gt’ ,使用本章开始的配置即可。
4.验证是否成功
简单写个cpp程序,配置Makefile编译后复制到目标板上运行,看看是否正常工作
#include <iostream>
extern "C"{
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavutil/imgutils.h"
}
int main(){
std::cout << avcodec_configuration() << std::endl;
std::cout << av_image_get_buffer_size(AV_PIX_FMT_YUV420P, 516, 618, 1) << std::endl;
getcha();
return 0;
}
CC = aarch64-linux-gnu-g++
TARGET = ffmpeg
SRC = main.cpp
OBJ = $(patsubst %.cpp, %.o, $(SRC))
OBJM = main.o
# LIBS += -L/usr/local/3party/ffmpeg/lib -lavcodec -lavutil
# INCS += -I/usr/local/3party/ffmpeg/include/
LIBS += -L/home/hjs/rk3568/3rparty/ffmpeg/lib -lavcodec -lavutil
INCS += -I/home/hjs/rk3568/3rparty/ffmpeg/include/
$(TARGET):$(OBJM)
$(CC) -o $@ $^ $(LIBS)
%.o:%.cpp
$(CC) -o $@ -c $< $(INCS)
.PHONY:clean
clean:
rm -rf *.o $(TARGET)
其中LIBS和INCS的路径就是上面–prefix配置的库安装路径,make
之后,将可执行文件复制到开发板上运行;复制方法可以用FileZilla(ftp)、scp命令、SSH或者U盘等;
scp ./ffmpeg root@192.168.10.150:/root/test
运行结果如图所示,说明交叉编译链和ffmpeg交叉环境有效。