HatsuneMikuV / ijkplayer-speex

ijkplayer with speex support(iOS) ---为需要speex音频库的ijk播放器的编译文件
GNU General Public License v2.0
9 stars 3 forks source link

你好 能请教下马 android编译speex #4

Open ilnaygniy opened 5 years ago

ilnaygniy commented 5 years ago

do-ffmpeg 参照openssl添加了speex相关,但是编译ffmpeg的时候报错 ERROR: speex not found using pkg-config

HatsuneMikuV commented 5 years ago

@ilnaygniy brew install pkg-config

ilnaygniy commented 5 years ago

@HatsuneMikuV 在哪个目录下执行呢?或者我可以写在哪个脚本么

HatsuneMikuV commented 5 years ago

@ilnaygniy 在哪都行 只要在终端运行就可以 这个目的是完善你的配置环境

ilnaygniy commented 5 years ago

@HatsuneMikuV 这是我 do-compile-speex.sh 脚本

! /usr/bin/env bash

#

Copyright (C) 2014 Miguel Botón waninkoko@gmail.com

Copyright (C) 2014 Zhang Rui bbcallen@gmail.com

#

Licensed under the Apache License, Version 2.0 (the "License");

you may not use this file except in compliance with the License.

You may obtain a copy of the License at

#

http://www.apache.org/licenses/LICENSE-2.0

#

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and

limitations under the License.

#

--------------------

set -e

if [ -z "$ANDROID_NDK" ]; then echo "You must define ANDROID_NDK before starting." echo "They must point to your NDK directories.\n" exit 1 fi

--------------------

common defines

FF_ARCH=$1 if [ -z "$FF_ARCH" ]; then echo "You must specific an architecture 'arm, armv7a, x86, ...'.\n" exit 1 fi

FF_BUILD_ROOT=pwd FF_ANDROID_PLATFORM=android-9

FF_BUILD_NAME= FF_SOURCE= FF_CROSS_PREFIX=

FF_CFG_FLAGS= FF_PLATFORM_CFG_FLAGS=

FF_EXTRA_CFLAGS= FF_EXTRA_LDFLAGS=

--------------------

echo "" echo "--------------------" echo "[*] make NDK standalone toolchain" echo "--------------------" . ./tools/do-detect-env.sh FF_MAKE_TOOLCHAIN_FLAGS=$IJK_MAKE_TOOLCHAIN_FLAGS FF_MAKE_FLAGS=$IJK_MAKE_FLAG FF_GCC_VER=$IJK_GCC_VER FF_GCC_64_VER=$IJK_GCC_64_VER

----- armv7a begin -----

if [ "$FF_ARCH" = "armv7a" ]; then FF_BUILD_NAME=speex-armv7a FF_SOURCE=$FF_BUILD_ROOT/$FF_BUILD_NAME

FF_CROSS_PREFIX=arm-linux-androideabi
FF_TOOLCHAIN_NAME=${FF_CROSS_PREFIX}-${FF_GCC_VER}

FF_PLATFORM_CFG_FLAGS="android-armv7"

else echo "unknown architecture $FF_ARCH"; exit 1 fi

FF_TOOLCHAIN_PATH=$FF_BUILD_ROOT/build/$FF_BUILD_NAME/toolchain

FF_SYSROOT=$FF_TOOLCHAIN_PATH/sysroot FF_PREFIX=$FF_BUILD_ROOT/build/$FF_BUILD_NAME/output

mkdir -p $FF_PREFIX

mkdir -p $FF_SYSROOT

--------------------

echo "" echo "--------------------" echo "[*] make NDK standalone toolchain" echo "--------------------" . ./tools/do-detect-env.sh FF_MAKE_TOOLCHAIN_FLAGS=$IJK_MAKE_TOOLCHAIN_FLAGS FF_MAKE_FLAGS=$IJK_MAKE_FLAG

FF_MAKE_TOOLCHAIN_FLAGS="$FF_MAKE_TOOLCHAIN_FLAGS --install-dir=$FF_TOOLCHAIN_PATH" FF_TOOLCHAIN_TOUCH="$FF_TOOLCHAIN_PATH/touch" if [ ! -f "$FF_TOOLCHAIN_TOUCH" ]; then $ANDROID_NDK/build/tools/make-standalone-toolchain.sh \ $FF_MAKE_TOOLCHAIN_FLAGS \ --platform=$FF_ANDROID_PLATFORM \ --toolchain=$FF_TOOLCHAIN_NAME touch $FF_TOOLCHAIN_TOUCH; fi

--------------------

echo "" echo "--------------------" echo "[*] check speex env" echo "--------------------" export PATH=$FF_TOOLCHAIN_PATH/bin:$PATH

export COMMON_FF_CFG_FLAGS=

FF_CFG_FLAGS="$FF_CFG_FLAGS $COMMON_FF_CFG_FLAGS"

--------------------

Standard options:

FF_CFG_FLAGS="$FF_CFG_FLAGS zlib-dynamic"

FF_CFG_FLAGS="$FF_CFG_FLAGS no-shared"

FF_CFG_FLAGS="$FF_CFG_FLAGS --prefix=$FF_PREFIX"

FF_CFG_FLAGS="$FF_CFG_FLAGS --cross-compile-prefix=${FF_CROSS_PREFIX}-"

FF_CFG_FLAGS="$FF_CFG_FLAGS $FF_PLATFORM_CFG_FLAGS"

--------------------

echo "--------------------" echo "[*] configurate speex" echo "--------------------"

cd $FF_SOURCE

if [ -f "./Makefile" ]; then

echo 'reuse configure'

else

echo "./configure $FF_CFG_FLAGS"
./configure $FF_CFG_FLAGS -host=armv7 --disable-shared --enable-static

--extra-cflags="$FF_CFLAGS $FF_EXTRA_CFLAGS" \

--extra-ldflags="$FF_EXTRA_LDFLAGS"

fi

echo "--------------------" echo "cccccdddddd ${FF_SOURCE}" echo "--------------------"

--------------------

echo "" echo "--------------------" echo "[*] compile speex" echo "--------------------"

make

make install

--------------------

echo "" echo "--------------------" echo "[*] link speex" echo "--------------------"

ilnaygniy commented 5 years ago

这是 ffmpeg得 echo "====================" echo "[*] check env $1" echo "====================" set -e

--------------------

common defines

FF_ARCH=$1 FF_BUILD_OPT=$2 echo "FF_ARCH=$FF_ARCH" echo "FF_BUILD_OPT=$FF_BUILD_OPT" if [ -z "$FF_ARCH" ]; then echo "You must specific an architecture 'arm, armv7a, x86, ...'." echo "" exit 1 fi

FF_BUILD_ROOT=pwd FF_ANDROID_PLATFORM=android-9

FF_BUILD_NAME= FF_SOURCE= FF_CROSS_PREFIX= FF_DEP_OPENSSL_INC= FF_DEP_OPENSSL_LIB=

FF_DEP_SPEEX_INC= FF_DEP_SPEEX_LIB=

FF_DEP_LIBSOXR_INC= FF_DEP_LIBSOXR_LIB=

FF_CFG_FLAGS=

FF_EXTRA_CFLAGS= FF_EXTRA_LDFLAGS= FF_DEP_LIBS=

FF_MODULE_DIRS="compat libavcodec libavfilter libavformat libavutil libswresample libswscale" FF_ASSEMBLER_SUB_DIRS=

--------------------

echo "" echo "--------------------" echo "[*] make NDK standalone toolchain" echo "--------------------" . ./tools/do-detect-env.sh FF_MAKE_TOOLCHAIN_FLAGS=$IJK_MAKE_TOOLCHAIN_FLAGS FF_MAKE_FLAGS=$IJK_MAKE_FLAG FF_GCC_VER=$IJK_GCC_VER FF_GCC_64_VER=$IJK_GCC_64_VER

----- armv7a begin -----

if [ "$FF_ARCH" = "armv7a" ]; then FF_BUILD_NAME=ffmpeg-armv7a FF_BUILD_NAME_OPENSSL=openssl-armv7a FF_BUILD_NAME_LIBSOXR=libsoxr-armv7a FF_BUILD_NAME_SPEEX=speex-armv7a FF_SOURCE=$FF_BUILD_ROOT/$FF_BUILD_NAME

FF_CROSS_PREFIX=arm-linux-androideabi
FF_TOOLCHAIN_NAME=${FF_CROSS_PREFIX}-${FF_GCC_VER}

FF_CFG_FLAGS="$FF_CFG_FLAGS --arch=arm --cpu=cortex-a8"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-neon"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-thumb"

FF_EXTRA_CFLAGS="$FF_EXTRA_CFLAGS -march=armv7-a -mcpu=cortex-a8 -mfpu=vfpv3-d16 -mfloat-abi=softfp -mthumb"
FF_EXTRA_LDFLAGS="$FF_EXTRA_LDFLAGS -Wl,--fix-cortex-a8"

FF_ASSEMBLER_SUB_DIRS="arm"

elif [ "$FF_ARCH" = "armv5" ]; then FF_BUILD_NAME=ffmpeg-armv5 FF_BUILD_NAME_OPENSSL=openssl-armv5 FF_BUILD_NAME_LIBSOXR=libsoxr-armv5 FF_BUILD_NAME_SPEEX=speex-armv5 FF_SOURCE=$FF_BUILD_ROOT/$FF_BUILD_NAME

FF_CROSS_PREFIX=arm-linux-androideabi
FF_TOOLCHAIN_NAME=${FF_CROSS_PREFIX}-${FF_GCC_VER}

FF_CFG_FLAGS="$FF_CFG_FLAGS --arch=arm"

FF_EXTRA_CFLAGS="$FF_EXTRA_CFLAGS -march=armv5te -mtune=arm9tdmi -msoft-float"
FF_EXTRA_LDFLAGS="$FF_EXTRA_LDFLAGS"

FF_ASSEMBLER_SUB_DIRS="arm"

elif [ "$FF_ARCH" = "x86" ]; then FF_BUILD_NAME=ffmpeg-x86 FF_BUILD_NAME_OPENSSL=openssl-x86 FF_BUILD_NAME_SPEEX=speex-armv7a FF_BUILD_NAME_LIBSOXR=libsoxr-x86 FF_SOURCE=$FF_BUILD_ROOT/$FF_BUILD_NAME

FF_CROSS_PREFIX=i686-linux-android
FF_TOOLCHAIN_NAME=x86-${FF_GCC_VER}

FF_CFG_FLAGS="$FF_CFG_FLAGS --arch=x86 --cpu=i686 --enable-yasm"

FF_EXTRA_CFLAGS="$FF_EXTRA_CFLAGS -march=atom -msse3 -ffast-math -mfpmath=sse"
FF_EXTRA_LDFLAGS="$FF_EXTRA_LDFLAGS"

FF_ASSEMBLER_SUB_DIRS="x86"

elif [ "$FF_ARCH" = "x86_64" ]; then FF_ANDROID_PLATFORM=android-21

FF_BUILD_NAME=ffmpeg-x86_64
FF_BUILD_NAME_OPENSSL=openssl-x86_64
FF_BUILD_NAME_SPEEX=speex-x86_64
FF_BUILD_NAME_LIBSOXR=libsoxr-x86_64
FF_SOURCE=$FF_BUILD_ROOT/$FF_BUILD_NAME

FF_CROSS_PREFIX=x86_64-linux-android
FF_TOOLCHAIN_NAME=${FF_CROSS_PREFIX}-${FF_GCC_64_VER}

FF_CFG_FLAGS="$FF_CFG_FLAGS --arch=x86_64 --enable-yasm"

FF_EXTRA_CFLAGS="$FF_EXTRA_CFLAGS"
FF_EXTRA_LDFLAGS="$FF_EXTRA_LDFLAGS"

FF_ASSEMBLER_SUB_DIRS="x86"

elif [ "$FF_ARCH" = "arm64" ]; then FF_ANDROID_PLATFORM=android-21

FF_BUILD_NAME=ffmpeg-arm64
FF_BUILD_NAME_OPENSSL=openssl-arm64
FF_BUILD_NAME_SPEEX=speex-armv64
FF_BUILD_NAME_LIBSOXR=libsoxr-arm64
FF_SOURCE=$FF_BUILD_ROOT/$FF_BUILD_NAME

FF_CROSS_PREFIX=aarch64-linux-android
FF_TOOLCHAIN_NAME=${FF_CROSS_PREFIX}-${FF_GCC_64_VER}

FF_CFG_FLAGS="$FF_CFG_FLAGS --arch=aarch64 --enable-yasm"

FF_EXTRA_CFLAGS="$FF_EXTRA_CFLAGS"
FF_EXTRA_LDFLAGS="$FF_EXTRA_LDFLAGS"

FF_ASSEMBLER_SUB_DIRS="aarch64 neon"

else echo "unknown architecture $FF_ARCH"; exit 1 fi

if [ ! -d $FF_SOURCE ]; then echo "" echo "!! ERROR" echo "!! Can not find FFmpeg directory for $FF_BUILD_NAME" echo "!! Run 'sh init-android.sh' first" echo "" exit 1 fi

FF_TOOLCHAIN_PATH=$FF_BUILD_ROOT/build/$FF_BUILD_NAME/toolchain FF_MAKE_TOOLCHAIN_FLAGS="$FF_MAKE_TOOLCHAIN_FLAGS --install-dir=$FF_TOOLCHAIN_PATH"

FF_SYSROOT=$FF_TOOLCHAIN_PATH/sysroot FF_PREFIX=$FF_BUILD_ROOT/build/$FF_BUILD_NAME/output FF_DEP_OPENSSL_INC=$FF_BUILD_ROOT/build/$FF_BUILD_NAME_OPENSSL/output/include FF_DEP_OPENSSL_LIB=$FF_BUILD_ROOT/build/$FF_BUILD_NAME_OPENSSL/output/lib FF_DEP_LIBSOXR_INC=$FF_BUILD_ROOT/build/$FF_BUILD_NAME_LIBSOXR/output/include FF_DEP_LIBSOXR_LIB=$FF_BUILD_ROOT/build/$FF_BUILD_NAME_LIBSOXR/output/lib FF_DEP_SPEEX_INC=$FF_BUILD_ROOT/build/$FF_BUILD_NAME_SPEEX/output/include FF_DEP_SPEEX_LIB=$FF_BUILD_ROOT/build/$FF_BUILD_NAME_SPEEX/output/lib

case "$UNAME_S" in CYGWIN_NT-*) FF_SYSROOT="$(cygpath -am $FF_SYSROOT)" FF_PREFIX="$(cygpath -am $FF_PREFIX)" ;; esac

mkdir -p $FF_PREFIX

mkdir -p $FF_SYSROOT

FF_TOOLCHAIN_TOUCH="$FF_TOOLCHAIN_PATH/touch" if [ ! -f "$FF_TOOLCHAIN_TOUCH" ]; then $ANDROID_NDK/build/tools/make-standalone-toolchain.sh \ $FF_MAKE_TOOLCHAIN_FLAGS \ --platform=$FF_ANDROID_PLATFORM \ --toolchain=$FF_TOOLCHAIN_NAME touch $FF_TOOLCHAIN_TOUCH; fi

--------------------

echo "" echo "--------------------" echo "[*] check ffmpeg env" echo "--------------------" export PATH=$FF_TOOLCHAIN_PATH/bin/:$PATH

export CC="ccache ${FF_CROSS_PREFIX}-gcc"

export CC="${FF_CROSS_PREFIX}-gcc" export LD=${FF_CROSS_PREFIX}-ld export AR=${FF_CROSS_PREFIX}-ar export STRIP=${FF_CROSS_PREFIX}-strip export PKG_CONFIG_PATH=/home/liyanying/opt/ijkplayer-android/android/contrib/build/speex-armv7a/output/lib/pkgconfig: FF_CFLAGS="-O3 -Wall -pipe \ -std=c99 \ -ffast-math \ -fstrict-aliasing -Werror=strict-aliasing \ -Wno-psabi -Wa,--noexecstack \ -DANDROID -DNDEBUG"

cause av_strlcpy crash with gcc4.7, gcc4.8

-fmodulo-sched -fmodulo-sched-allow-regmoves

--enable-thumb is OK

FF_CFLAGS="$FF_CFLAGS -mthumb"

not necessary

FF_CFLAGS="$FF_CFLAGS -finline-limit=300"

export COMMON_FF_CFG_FLAGS= . $FF_BUILD_ROOT/../../config/module.sh

--------------------

with openssl

if [ -f "${FF_DEP_OPENSSL_LIB}/libssl.a" ]; then echo "OpenSSL detected"

FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-nonfree"

FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-openssl"

FF_CFLAGS="$FF_CFLAGS -I${FF_DEP_OPENSSL_INC}"
FF_DEP_LIBS="$FF_DEP_LIBS -L${FF_DEP_OPENSSL_LIB} -lssl -lcrypto"

fi

------------------

with speex

if [ -f "${FF_DEP_SPEEX_LIB}/libspeex.a" ]; then echo "Speex detected" FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-libspeex" echo "----------find speex ----------" echo $FF_DEP_SPEEX_INC echo $FF_DEP_SPEEX_LIB echo "--------------------------------" FF_CFLAGS="$FF_CFLAGS -I${FF_DEP_SPEEX_INC}" FF_DEP_LIBS="$FF_DEP_LIBS -L${FF_DEP_SPEEX_LIB} -lspeex" fi

-------------------

if [ -f "${FF_DEP_LIBSOXR_LIB}/libsoxr.a" ]; then echo "libsoxr detected" FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-libsoxr"

FF_CFLAGS="$FF_CFLAGS -I${FF_DEP_LIBSOXR_INC}"
FF_DEP_LIBS="$FF_DEP_LIBS -L${FF_DEP_LIBSOXR_LIB} -lsoxr"

fi

FF_CFG_FLAGS="$FF_CFG_FLAGS $COMMON_FF_CFG_FLAGS"

--------------------

Standard options:

FF_CFG_FLAGS="$FF_CFG_FLAGS --prefix=$FF_PREFIX"

Advanced options (experts only):

FF_CFG_FLAGS="$FF_CFG_FLAGS --cross-prefix=${FF_CROSS_PREFIX}-" FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-cross-compile" FF_CFG_FLAGS="$FF_CFG_FLAGS --target-os=linux" FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-pic"

FF_CFG_FLAGS="$FF_CFG_FLAGS --disable-symver"

if [ "$FF_ARCH" = "x86" ]; then FF_CFG_FLAGS="$FF_CFG_FLAGS --disable-asm" else

Optimization options (experts only):

FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-asm"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-inline-asm"

fi

case "$FF_BUILD_OPT" in debug) FF_CFG_FLAGS="$FF_CFG_FLAGS --disable-optimizations" FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-debug" FF_CFG_FLAGS="$FF_CFG_FLAGS --disable-small" ;; *) FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-optimizations" FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-debug" FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-small" ;; esac

--------------------

echo "" echo "--------------------" echo "[*] configurate ffmpeg" echo "--------------------" cd $FF_SOURCE if [ -f "./config.h" ]; then echo 'reuse configure' else which $CC ./configure $FF_CFG_FLAGS --enable-libspeex\ --extra-cflags="$FF_CFLAGS $FF_EXTRA_CFLAGS" \ --extra-ldflags="$FF_DEP_LIBS $FF_EXTRA_LDFLAGS" make clean fi

--------------------

echo "" echo "--------------------" echo "[] compile ffmpeg" echo "--------------------" cp config. $FF_PREFIX make $FF_MAKE_FLAGS > /dev/null make install mkdir -p $FF_PREFIX/include/libffmpeg cp -f config.h $FF_PREFIX/include/libffmpeg/config.h

--------------------

echo "" echo "--------------------" echo "[*] link ffmpeg" echo "--------------------" echo $FF_EXTRA_LDFLAGS

FF_C_OBJ_FILES= FF_ASM_OBJ_FILES= for MODULE_DIR in $FF_MODULE_DIRS do C_OBJ_FILES="$MODULE_DIR/.o" if ls $C_OBJ_FILES 1> /dev/null 2>&1; then echo "link $MODULE_DIR/.o" FF_C_OBJ_FILES="$FF_C_OBJ_FILES $C_OBJ_FILES" fi

for ASM_SUB_DIR in $FF_ASSEMBLER_SUB_DIRS
do
    ASM_OBJ_FILES="$MODULE_DIR/$ASM_SUB_DIR/*.o"
    if ls $ASM_OBJ_FILES 1> /dev/null 2>&1; then
        echo "link $MODULE_DIR/$ASM_SUB_DIR/*.o"
        FF_ASM_OBJ_FILES="$FF_ASM_OBJ_FILES $ASM_OBJ_FILES"
    fi
done

done

$CC -lm -lz -shared --sysroot=$FF_SYSROOT -Wl,--no-undefined -Wl,-z,noexecstack $FF_EXTRA_LDFLAGS \ -Wl,-soname,libijkffmpeg.so \ $FF_C_OBJ_FILES \ $FF_ASM_OBJ_FILES \ $FF_DEP_LIBS \ -o $FF_PREFIX/libijkffmpeg.so

mysedi() { f=$1 exp=$2 n=basename $f cp $f /tmp/$n sed $exp /tmp/$n > $f rm /tmp/$n }

echo "" echo "--------------------" echo "[] create files for shared ffmpeg" echo "--------------------" rm -rf $FF_PREFIX/shared mkdir -p $FF_PREFIX/shared/lib/pkgconfig ln -s $FF_PREFIX/include $FF_PREFIX/shared/include ln -s $FF_PREFIX/libijkffmpeg.so $FF_PREFIX/shared/lib/libijkffmpeg.so cp $FF_PREFIX/lib/pkgconfig/.pc $FF_PREFIX/shared/lib/pkgconfig for f in $FF_PREFIX/lib/pkgconfig/*.pc; do

in case empty dir

if [ ! -f $f ]; then
    continue
fi
cp $f $FF_PREFIX/shared/lib/pkgconfig
f=$FF_PREFIX/shared/lib/pkgconfig/`basename $f`
# OSX sed doesn't have in-place(-i)
mysedi $f 's/\/output/\/output\/shared/g'
mysedi $f 's/-lavcodec/-lijkffmpeg/g'
mysedi $f 's/-lavfilter/-lijkffmpeg/g'
mysedi $f 's/-lavformat/-lijkffmpeg/g'
mysedi $f 's/-lavutil/-lijkffmpeg/g'
mysedi $f 's/-lswresample/-lijkffmpeg/g'
mysedi $f 's/-lswscale/-lijkffmpeg/g'

done

HatsuneMikuV commented 5 years ago

这个脚本 你不需要更改 你报错的原因是你的电脑环境有问题 需要你安装pkg-config

HatsuneMikuV commented 5 years ago

@ilnaygniy 你编译安卓的?稍等我看看今天能上传不,现在支持的是ios的

ilnaygniy commented 5 years ago

@HatsuneMikuV 嗯 我再编译Android 得 pkg-config --list-all 的时候 并没有显示有speex 应该是没关联上吧 怎么可以关联呢?

ilnaygniy commented 5 years ago

用的ubuntu 模拟器