LINUX.ORG.RU

ffmpeg android NDK

 , , ,


0

2

Хочу собрать ffmpeg на android NDK под armv7a. Все отлично собирается, но при попытке добавить в ffmpeg libspeex(--enable-libspeex) выходит ошибка

ijkplayer/android/contrib/build/ffmpeg-armv7a/toolchain/bin//arm-linux-androideabi-gcc
ERROR: speex not found using pkg-config

на формуме написали, что эта сторонняя либа и ее нужно собрать
libspeex is an external library, which you should build it first, and set include path and lib path with ffmpeg's configure
На убунту я установил libspeex-dev, но это не помогло. Правильно ли я понимаю, что нужно скачать исходники libspeex и сначала собрать, а потом их подсунуть в ffmpeg? Или что мне делать?

★★★★

Правильно ли я понимаю, что нужно скачать исходники libspeex и сначала собрать, а потом их подсунуть в ffmpeg? Или что мне делать?

да. собрать под arm

Harald ★★★★★
()

На убунту я установил libspeex-dev, но это не помогло.

Да, Убунта - не андроид.

Правильно ли я понимаю, что нужно скачать исходники libspeex и сначала собрать, а потом их подсунуть в ffmpeg?

И правда: точно так же как с ffmpeg. Скачать исходники, собрать с NDK и подсунуть.

gag ★★★★★
()
Ответ на: комментарий от gobot

Разумеется, как же иначе? И не забыть указать инсталяционный путь вроде --prefix=/path/to/your/install/dir. Потом можно безопасно make install.

Почитать Supporting Cross-Compilation. И указать вот тот путь как SYSROOT при сборке ffmpeg.

gag ★★★★★
()
Ответ на: комментарий от gag

Там ffmpeg побирается скриптом уже готовым, все prefix и SYSROOT уже заданы, нужно только libspeex подсунуть.
Как я понял магия в:

--extra-cflags=-I/path/to/speex
--extra-ldflags='-L/path/to/speex -lspeex

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

Если не используется pkg-config или, если при неудаче с pkg-config ffmpeg пытается использовать стандартные пути для проверки наличия libspeex, то да, надо попробовать с extra.

Только апостроф в конце на забудь:

--extra-ldflags='-L/path/to/speex -lspeex'

gag ★★★★★
()

На убунту я установил libspeex-dev, но это не помогло.

Это очевидно.

Правильно ли я понимаю, что нужно скачать исходники libspeex и сначала собрать, а потом их подсунуть в ffmpeg?

Да.

andreyu ★★★★★
()
Ответ на: комментарий от gag

./configure выдает ошибку. Что ему надо?
Unknown option "-lspeex'".

--arch=arm --cpu=cortex-a8 --enable-neon --enable-thumb --disable-gpl --disable-nonfree --enable-runtime-cpudetect --disable-gray --disable-swscale-alpha --disable-programs --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-avdevice --enable-avcodec --enable-avformat --enable-avutil --enable-swresample --enable-swscale --disable-postproc --enable-avfilter --disable-avresample --enable-network --disable-d3d11va --disable-dxva2 --disable-vaapi --disable-vda --disable-vdpau --disable-videotoolbox --disable-encoders --disable-decoders --enable-decoder=aac --enable-decoder=aac_latm --enable-decoder=h264 --enable-decoder=h263 --enable-libspeex --enable-decoder=libspeex --extra-ldflags='-L/home/bibil/libspeex-Android/libs/armeabi-v7a -lspeex' --extra-cflags=-I/home/bibil/libspeex-Android/libs/armeabi-v7a --pkg-config=true --enable-decoder=nellymoser --disable-hwaccels --disable-muxers --enable-muxer=mp4 --disable-demuxers --enable-demuxer=aac --enable-demuxer=concat --enable-demuxer=data --enable-demuxer=flv --enable-demuxer=hls --enable-demuxer=live_flv --enable-demuxer=mov --enable-demuxer=mpegps --enable-demuxer=mpegts --enable-demuxer=h263 --disable-parsers --enable-parser=aac --enable-parser=aac_latm --enable-parser=h264 --enable-parser=h263 --enable-bsfs --disable-bsf=chomp --disable-bsf=dca_core --disable-bsf=dump_extradata --disable-bsf=hevc_mp4toannexb --disable-bsf=imx_dump_header --disable-bsf=mjpeg2jpeg --disable-bsf=mjpega_dump_header --disable-bsf=mov2textsub --disable-bsf=mp3_header_decompress --disable-bsf=mpeg4_unpack_bframes --disable-bsf=noise --disable-bsf=remove_extradata --disable-bsf=text2movsub --disable-bsf=vp9_superframe --enable-protocols --enable-protocol=async --disable-protocol=bluray --disable-protocol=concat --disable-protocol=crypto --disable-protocol=ffrtmpcrypt --enable-protocol=ffrtmphttp --disable-protocol=gopher --disable-protocol=icecast --disable-protocol=librtmp* --disable-protocol=libssh --disable-protocol=md5 --disable-protocol=mmsh --disable-protocol=mmst --disable-protocol=rtmp* --enable-protocol=rtmp --enable-protocol=rtmpt --disable-protocol=rtp --disable-protocol=sctp --disable-protocol=srtp --disable-protocol=subfile --disable-protocol=unix --disable-devices --disable-filters --disable-iconv --disable-audiotoolbox --disable-videotoolbox --prefix=/home/bibil/ijkplayer/android/contrib/build/ffmpeg-armv7a/output --cross-prefix=arm-linux-androideabi- --enable-cross-compile --target-os=linux --enable-pic --enable-asm --enable-inline-asm --enable-optimizations --enable-debug --enable-small --extra-cflags=-O3 -Wall -pipe     -std=c99     -ffast-math     -fstrict-aliasing -Werror=strict-aliasing     -Wno-psabi -Wa,--noexecstack     -DANDROID -DNDEBUG  -march=armv7-a -mcpu=cortex-a8 -mfpu=vfpv3-d16 -mfloat-abi=softfp -mthumb --extra-ldflags=  -Wl,--fix-cortex-a8

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

Можно попробовать заключить в кавычки, а не в апострофы.

А вот что это в хвосте за

--extra-cflags=-O3 -Wall -pipe     -std=c99     -ffast-math     -fstrict-aliasing -Werror=strict-aliasing     -Wno-psabi -Wa,--noexecstack     -DANDROID -DNDEBUG  -march=armv7-a -mcpu=cortex-a8 -mfpu=vfpv3-d16 -mfloat-abi=softfp -mthumb --extra-ldflags=  -Wl,--fix-cortex-a8
?

gag ★★★★★
()
Ответ на: комментарий от gag

Это параметры сборки такие, их сборочный скрипт генерирует, я не знаю что они означают, но в такой конфигурации я собирал ffmpeg под 4 архитектуры

gobot ★★★★
() автор топика
Ответ на: комментарий от EXL

Вот фрагмент скрипта https://github.com/Bilibili/ijkplayer/blob/master/android/contrib/tools/do-co...

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

а вот результат
[*] check archs
====================
FF_ALL_ARCHS = armv5 armv7a arm64 x86 x86_64
FF_ACT_ARCHS = armv7a

====================
[*] check env armv7a
====================
FF_ARCH=armv7a
FF_BUILD_OPT=

--------------------
[*] make NDK standalone toolchain
--------------------
build on Linux x86_64
ANDROID_NDK=/home/bibil/android-ndk-r12b
IJK_NDK_REL=12.1.2977051
NDKr12.1.2977051 detected

--------------------
[*] check ffmpeg env
--------------------

--------------------
[*] configurate ffmpeg
--------------------
/home/bibil/ijkplayer/android/contrib/ffmpeg-armv7a
--arch=arm --cpu=cortex-a8 --enable-neon --enable-thumb --disable-gpl --disable-nonfree --enable-runtime-cpudetect --disable-gray --disable-swscale-alpha --disable-programs --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-avdevice --enable-avcodec --enable-avformat --enable-avutil --enable-swresample --enable-swscale --disable-postproc --enable-avfilter --disable-avresample --enable-network --disable-d3d11va --disable-dxva2 --disable-vaapi --disable-vda --disable-vdpau --disable-videotoolbox --disable-encoders --disable-decoders --enable-decoder=aac --enable-decoder=aac_latm --enable-decoder=h264 --enable-decoder=h263 --enable-libspeex --enable-decoder=libspeex --extra-ldflags='-L/home/bibil/libspeex-Android/libs/armeabi-v7a/libspeex.so -lspeex' --extra-cflags=-I/home/bibil/libspeex-Android/jni/include/speex --enable-decoder=nellymoser --disable-hwaccels --disable-muxers --enable-muxer=mp4 --disable-demuxers --enable-demuxer=aac --enable-demuxer=concat --enable-demuxer=data --enable-demuxer=flv --enable-demuxer=hls --enable-demuxer=live_flv --enable-demuxer=mov --enable-demuxer=mpegps --enable-demuxer=mpegts --enable-demuxer=h263 --disable-parsers --enable-parser=aac --enable-parser=aac_latm --enable-parser=h264 --enable-parser=h263 --enable-bsfs --disable-bsf=chomp --disable-bsf=dca_core --disable-bsf=dump_extradata --disable-bsf=hevc_mp4toannexb --disable-bsf=imx_dump_header --disable-bsf=mjpeg2jpeg --disable-bsf=mjpega_dump_header --disable-bsf=mov2textsub --disable-bsf=mp3_header_decompress --disable-bsf=mpeg4_unpack_bframes --disable-bsf=noise --disable-bsf=remove_extradata --disable-bsf=text2movsub --disable-bsf=vp9_superframe --enable-protocols --enable-protocol=async --disable-protocol=bluray --disable-protocol=concat --disable-protocol=crypto --disable-protocol=ffrtmpcrypt --enable-protocol=ffrtmphttp --disable-protocol=gopher --disable-protocol=icecast --disable-protocol=librtmp* --disable-protocol=libssh --disable-protocol=md5 --disable-protocol=mmsh --disable-protocol=mmst --disable-protocol=rtmp* --enable-protocol=rtmp --enable-protocol=rtmpt --disable-protocol=rtp --disable-protocol=sctp --disable-protocol=srtp --disable-protocol=subfile --disable-protocol=unix --disable-devices --disable-filters --disable-iconv --disable-audiotoolbox --disable-videotoolbox --prefix=/home/bibil/ijkplayer/android/contrib/build/ffmpeg-armv7a/output --cross-prefix=arm-linux-androideabi- --enable-cross-compile --target-os=linux --enable-pic --enable-asm --enable-inline-asm --enable-optimizations --enable-debug --enable-small --extra-cflags=-O3 -Wall -pipe     -std=c99     -ffast-math     -fstrict-aliasing -Werror=strict-aliasing     -Wno-psabi -Wa,--noexecstack     -DANDROID -DNDEBUG  -march=armv7-a -mcpu=cortex-a8 -mfpu=vfpv3-d16 -mfloat-abi=softfp -mthumb --extra-ldflags=  -Wl,--fix-cortex-a8
/home/bibil/ijkplayer/android/contrib/build/ffmpeg-armv7a/toolchain/bin//arm-linux-androideabi-gcc


Unknown option "-lspeex'".
See ./configure --help for available options.



т.е. скрипт сначала переходит папку с сорцами FFMPEG - ./ffmpeg-armv7a потом запускает ./configure
Вот что странно: когда запускаешь напрямую ./configure в папке ffmpeg с этими же параметрами, то ошибки «Unknown option »-lspeex'"." нет, а когда этот скрипт запускает - есть. В чем разница я не могу понять

gobot ★★★★
() автор топика
Ответ на: комментарий от EXL

Проблему с «Unknown option» вроде удалось решить, но теперь другая ошибка

arm-linux-androideabi-gcc -O3 -Wall -pipe -std=c99 -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID -DNDEBUG -march=armv7-a -mcpu=cortex-a8 -mfpu=vfpv3-d16 -mfloat-abi=softfp -mthumb -I/home/bibil/libspeex-Android/jni/include/speex -mcpu=cortex-a8 -c -o /tmp/ffconf.jrtHpWFi.o /tmp/ffconf.B67qpPha.c
arm-linux-androideabi-gcc -Wl,--fix-cortex-a8 '-L/home/bibil/libspeex-Android/libs/armeabi-v7a -lspeex' -mcpu=cortex-a8 -o /tmp/ffconf.HUHGBq0J /tmp/ffconf.jrtHpWFi.o
arm-linux-androideabi-gcc: error: '-L/home/bibil/libspeex-Android/libs/armeabi-v7a: No such file or directory
C compiler test failed.

Дира эта есть

gobot ★★★★
() автор топика
Ответ на: комментарий от gag

Удалось собрать, оказывается кавычки лишние были, без них собралось

export FF_EXTRA_CFLAGS="$FF_EXTRA_CFLAGS -I/home/bibil/libspeex-Android/jni/include"
export FF_EXTRA_LDFLAGS="$FF_EXTRA_LDFLAGS -L/home/bibil/libspeex-Android/libs/armeabi-v7a -lspeex"

Спасибо!

gobot ★★★★
() автор топика

Упс...

java.lang.UnsatisfiedLinkError: dlopen failed: could not load library "libspeex.so" needed by "libijkffmpeg.so"; caused by library "libspeex.so" not found

Это на андроиде. Как я понял ffmpeg цепляет эту либу динамически? Можно ли ее внедрить в libijkffmpeg.so статично?

gobot ★★★★
() автор топика
Ответ на: комментарий от EXL

ffmpeg или speex?
Так? --pkg-config-flags="--static"
Пересобрал с этой опцией,но походу тоже самое

file libijkffmpeg.so
libijkffmpeg.so: ELF 32-bit LSB  shared object, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), not stripped

gobot ★★★★
() автор топика
Ответ на: комментарий от EXL

Я вот тут https://github.com/illuspas/libspeex-Android/blob/master/jni/Android.mk указал вместо BUILD_SHARED_LIBRARY - BUILD_STATIC_LIBRARY, все скомпилировалось... а что должно в итоге получиться? so файлы не создались, но создался libspeex.a. Что с ним делать?

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

Делать то же самое, что ты делал раньше. Только вместо

export FF_EXTRA_CFLAGS="$FF_EXTRA_CFLAGS -I/home/bibil/libspeex-Android/jni/include"
export FF_EXTRA_LDFLAGS="$FF_EXTRA_LDFLAGS -L/home/bibil/libspeex-Android/libs/armeabi-v7a -lspeex"

Нужно сделать:

export FF_EXTRA_CFLAGS="$FF_EXTRA_CFLAGS -I/home/bibil/libspeex-Android/jni/include"
export FF_EXTRA_LDFLAGS="$FF_EXTRA_LDFLAGS /home/bibil/libspeex-Android/libs/armeabi-v7a/libspeex.a"

Насколько я помню.

EXL ★★★★★
()
Ответ на: комментарий от EXL

Спасибо, попробую.
-lspeex - убрать из хвоста точно?

gobot ★★★★
() автор топика
Ответ на: комментарий от EXL

Ещё как оказалось вот такая хрень при сборке arm64

/home/bibil/ijkplayer/android/contrib/build/ffmpeg-arm64/toolchain/bin/../lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: warning: libstdc++.so, needed by /home/bibil/android-speex/libs/arm64-v8a/libspeex.so, not found (try using -rpath or -rpath-link)
/home/bibil/ijkplayer/android/contrib/build/ffmpeg-arm64/toolchain/bin/../lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: warning: libm.so, needed by /home/bibil/android-speex/libs/arm64-v8a/libspeex.so, not found (try using -rpath or -rpath-link)
/home/bibil/android-speex/libs/arm64-v8a/libspeex.so: undefined reference to `sqrtf@LIBC'
/home/bibil/android-speex/libs/arm64-v8a/libspeex.so: undefined reference to `sqrt@LIBC'
/home/bibil/android-speex/libs/arm64-v8a/libspeex.so: undefined reference to `pow@LIBC'
/home/bibil/android-speex/libs/arm64-v8a/libspeex.so: undefined reference to `acos@LIBC'
/home/bibil/android-speex/libs/arm64-v8a/libspeex.so: undefined reference to `exp@LIBC'
/home/bibil/android-speex/libs/arm64-v8a/libspeex.so: undefined reference to `log@LIBC'
collect2: error: ld returned 1 exit status
C compiler test failed.

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

Добавь -lm в

export FF_EXTRA_LDFLAGS="$FF_EXTRA_LDFLAGS -lm /home/bibil/libspeex-Android/libs/armeabi-v7a/libspeex.a"

И опять непонятно, откуда у тебя libspeex.so, удали оттуда всё это. Там должна быть только libspeex.a, если ты собирал статикой.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от EXL

откуда у тебя libspeex.so

Я не статичную собираю, ее потом. Хочу сначала под arm64 собрать хотя бы такую.

Как вот это исправить?

warning: libstdc++.so, needed libspeex.so, not found

gobot ★★★★
() автор топика
Ответ на: комментарий от EXL

Нет там ничего выше

xop=yes
xop_deps=avx
xop_external_deps=avx_external
xop_inline_deps=avx_inline
xop_suggest='xop_external xop_inline'
xv_outdev=no
xv_outdev_deps='X11_extensions_Xvlib_h XvGetPortAttribute'
xv_outdev_extralibs='-lXv -lX11 -lXext'
xvmc=yes
xvmc_deps=X11_extensions_XvMClib_h
xwma_demuxer_select=riffdec
yasm=yes
yasmexe_default=yasm
zerocodec_decoder_select=zlib
zlib_decoder_select=zlib
zlib_encoder_select=zlib
zmbv_decoder_select=zlib
zmbv_encoder_select=zlib
zmq_filter_deps=libzmq
zoompan_filter_deps=swscale
zscale_filter_deps=libzimg
mktemp -u XXXXXX
GZ5tYl
check_ld cc
check_cc
BEGIN /tmp/ffconf.P1iXXOwF.c
    1   int main(void){ return 0; }
END /tmp/ffconf.P1iXXOwF.c
aarch64-linux-android-gcc -O3 -Wall -pipe -std=c99 -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID -DNDEBUG -I/home/bibil/android-speex/jni/include -c -o /tmp/ffconf.7rxItnI8.o /tmp/ffconf.P1iXXOwF.c
aarch64-linux-android-gcc -L/home/bibil/android-speex/libs -lspeex -o /tmp/ffconf.aKutBoUR /tmp/ffconf.7rxItnI8.o
/home/bibil/ijkplayer/android/contrib/build/ffmpeg-arm64/toolchain/bin/../lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: warning: libstdc++.so, needed by /home/bibil/android-speex/libs/libspeex.so, not found (try using -rpath or -rpath-link)
/home/bibil/ijkplayer/android/contrib/build/ffmpeg-arm64/toolchain/bin/../lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: warning: libm.so, needed by /home/bibil/android-speex/libs/libspeex.so, not found (try using -rpath or -rpath-link)
/home/bibil/android-speex/libs/libspeex.so: undefined reference to `sqrtf@LIBC'
/home/bibil/android-speex/libs/libspeex.so: undefined reference to `sqrt@LIBC'
/home/bibil/android-speex/libs/libspeex.so: undefined reference to `pow@LIBC'
/home/bibil/android-speex/libs/libspeex.so: undefined reference to `acos@LIBC'
/home/bibil/android-speex/libs/libspeex.so: undefined reference to `exp@LIBC'
/home/bibil/android-speex/libs/libspeex.so: undefined reference to `log@LIBC'
collect2: error: ld returned 1 exit status
C compiler test failed.

Помогите, я в тупике )) Осталась только arm64, под все остальное(arm5, armv7a, x86_64, x86) собрал уже

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

Что касается

/home/bibil/ijkplayer/android/contrib/build/ffmpeg-arm64/toolchain/bin/../lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: warning: libm.so, needed by /home/bibil/android-speex/libs/libspeex.so, not found (try using -rpath or -rpath-link)
/home/bibil/android-speex/libs/libspeex.so: undefined reference to `sqrtf@LIBC'
/home/bibil/android-speex/libs/libspeex.so: undefined reference to `sqrt@LIBC'
/home/bibil/android-speex/libs/libspeex.so: undefined reference to `pow@LIBC'
/home/bibil/android-speex/libs/libspeex.so: undefined reference to `acos@LIBC'
/home/bibil/android-speex/libs/libspeex.so: undefined reference to `exp@LIBC'
/home/bibil/android-speex/libs/libspeex.so: undefined reference to `log@LIBC'
то здесь:
aarch64-linux-android-gcc -L/home/bibil/android-speex/libs -lspeex -o /tmp/ffconf.aKutBoUR /tmp/ffconf.7rxItnI8.o
нет -lm

gag ★★★★★
()
Ответ на: комментарий от gag

Да нет я уже понял куда добавить уже давно собрал ) А почему она по умолчанию не подключается? Я под другие архитектуры собирал, не было этой ошибки, а только под arm64

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

А... Тогда нужно смотреть в скрипты. Там это «по-умолчанию» определяется. Кстати, кроме -lm есть -lm_hard.

gag ★★★★★
()
Ответ на: комментарий от EXL

Хм, да, точно говорил... Спасибо вам за помощь, с этим lm я бы точно застрял надолго ))

gobot ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.