我是靠谱客的博主 朴实硬币,最近开发中收集的这篇文章主要介绍linux下ffmpeg编译成so文件,如何将FFmpeg源码编译一个so库,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.如何编译成一个so包

我们从上篇文章FFmpeg编译知道,正常打出来的有5个so包,当然有它的好处是按需引入。但是如果都需要,那是不是觉得很多呢?那可不可以打出一个so呢?答案是当然可以,下面以armv7-a平台为例,脚本如下。

#!/bin/bash

export TMPDIR=/Users/zhouwen/Desktop/ffmpeg/ffmpegoutput #这句很重要,不然会报错 unable to create temporary file in

# NDK的路径,根据自己的安装位置进行设置

NDK=/Users/zhouwen/Desktop/ffmpeg/android-ndk-r10e

# 编译针对的平台,可以根据自己的需求进行设置

# 这里选择最低支持android-14, arm架构,生成的so库是放在

# libs/armeabi文件夹下的,若针对x86架构,要选择arch-x86

PLATFORM=$NDK/platforms/android-14/arch-arm

# 工具链的路径,根据编译的平台不同而不同

# arm-linux-androideabi-4.9与上面设置的PLATFORM对应,4.9为工具的版本号,

# 根据自己安装的NDK版本来确定,一般使用最新的版本

TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64

function build_one

{

echo "开始编译ffmpeg"

echo "OPTIMIZE_CFLAGS ${OPTIMIZE_CFLAGS}"

echo "PREFIX ${PREFIX}"

echo "NDK ${NDK}"

echo "TOOLCHAIN ${OPTIMIZE_CFLAGS}"

./configure

--prefix=$PREFIX

--target-os=linux

--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi-

--arch=arm

--sysroot=$PLATFORM

--extra-cflags="-I$PLATFORM/usr/include"

--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc

--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm

--disable-shared

--enable-runtime-cpudetect

--enable-gpl

--enable-small

--enable-cross-compile

--disable-debug

--enable-static

--disable-doc

--disable-asm

--disable-ffmpeg

--disable-ffplay

--disable-ffprobe

--disable-ffserver

--disable-postproc

--disable-avdevice

--disable-symver

--disable-stripping

# --extra-ldflags="-L$PLATFORM/usr/lib -nostdlib" #①这一句我注释掉了,不然会报 ld: -single_module: unknown option

$ADDITIONAL_CONFIGURE_FLAG

sed -i '' 's/HAVE_LRINT 0/HAVE_LRINT 1/g' config.h

sed -i '' 's/HAVE_LRINTF 0/HAVE_LRINTF 1/g' config.h

sed -i '' 's/HAVE_ROUND 0/HAVE_ROUND 1/g' config.h

sed -i '' 's/HAVE_ROUNDF 0/HAVE_ROUNDF 1/g' config.h

sed -i '' 's/HAVE_TRUNC 0/HAVE_TRUNC 1/g' config.h

sed -i '' 's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g' config.h

sed -i '' 's/HAVE_CBRT 0/HAVE_CBRT 1/g' config.h

sed -i '' 's/HAVE_RINT 0/HAVE_RINT 1/g' config.h

make clean

make -j4

make install

echo "编译完成ffmpeg"

echo "开始编译ffmpeg so"

$TOOLCHAIN/bin/arm-linux-androideabi-ld

-rpath-link=$PLATFORM/usr/lib

-L$PLATFORM/usr/lib

-L$PREFIX/lib

-soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o

$PREFIX/libffmpeg.so

libavcodec/libavcodec.a

libavfilter/libavfilter.a

libswresample/libswresample.a

libavformat/libavformat.a

libavutil/libavutil.a

libswscale/libswscale.a

-lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker

$TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9/libgcc.a

echo "完成编译ffmpeg so"

# $TOOLCHAIN/bin/arm-linux-androideabi-ld

# -rpath-link=$PLATFORM/usr/lib

# -L$PLATFORM/usr/lib

# -L$PREFIX/lib

# -soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o

# $PREFIX/libffmpeg.so

# libavcodec/libavcodec.a

# libavfilter/libavfilter.a

# libswresample/libswresample.a

# libavformat/libavformat.a

# libavutil/libavutil.a

# libswscale/libswscale.a

# -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker

# $TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9/libgcc.a

}

# arm v7vfp

CPU=armv7-a

OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "

PREFIX=$(pwd)/android/$CPU

ADDITIONAL_CONFIGURE_FLAG=

build_one

其实在上篇FFmpeg编译中脚本的基础上添加如下即可打出一个so包:

echo "开始编译ffmpeg so"

$TOOLCHAIN/bin/arm-linux-androideabi-ld

-rpath-link=$PLATFORM/usr/lib

-L$PLATFORM/usr/lib

-L$PREFIX/lib

-soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o

$PREFIX/libffmpeg.so

libavcodec/libavcodec.a

libavfilter/libavfilter.a

libswresample/libswresample.a

libavformat/libavformat.a

libavutil/libavutil.a

libswscale/libswscale.a

-lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker

$TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9/libgcc.a

echo "完成编译ffmpeg so"

2.执行编译

编译完成大概需要几分钟。

开始编译ffmpeg

OPTIMIZE_CFLAGS -mfloat-abi=softfp -mfpu=vfp -marm -march=armv7-a

PREFIX /Users/zhouwen/Desktop/ffmpeg/ffmpeg-3.0/android/armv7-a

NDK /Users/zhouwen/Desktop/ffmpeg/android-ndk-r10e

TOOLCHAIN -mfloat-abi=softfp -mfpu=vfp -marm -march=armv7-a

INSTALL libavutil/time.h

INSTALL libavutil/timecode.h

INSTALL libavutil/timestamp.h

INSTALL libavutil/tree.h

INSTALL libavutil/twofish.h

INSTALL libavutil/version.h

INSTALL libavutil/xtea.h

INSTALL libavutil/tea.h

INSTALL libavutil/lzo.h

INSTALL libavutil/avconfig.h

INSTALL libavutil/ffversion.h

INSTALL libavutil/libavutil.pc

编译完成ffmpeg

3.编译成功

android/armv7-a下生成一个ffmpeg.so

9ec753a7204e

image.png

4.移植使用

copy libffmpeg.so及相应的同文件到工程里就好

That's All

最后

以上就是朴实硬币为你收集整理的linux下ffmpeg编译成so文件,如何将FFmpeg源码编译一个so库的全部内容,希望文章能够帮你解决linux下ffmpeg编译成so文件,如何将FFmpeg源码编译一个so库所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部