Моя нынешняя ситуация; ffmpeg и libx264 были скомпилированы для Android, как для общих, так и для статических библиотек соответственно. Поскольку у меня есть libx264.a и libffmpeg.so со мной, остается только связать их и получить библиотеку ffmpeg, которая позволит мне продолжить работу с моим приложением. Однако некоторые вопросы остаются без ответа. Я использую Ubuntu с виртуальной машиной под Windows 7. Я использую последнюю версию x264, версию ffmpeg 0.10.4 и NDK 7.
Я попытался настроить флаги (extracf и extrald), чтобы включить процесс компиляции libx264 в ffmpeg, однако я продолжаю терпеть неудачу. Ниже вы можете найти мой скрипт сборки для ffmpeg и ошибок, с которыми я столкнулся.
NDK=~/Android_NDK_r7b
PLATFORM=$NDK/platforms/android-8/arch-arm/
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
x264=/usr/local
#x264v2=~/x264
function build_one
{
./configure --target-os=linux \
--prefix=$PREFIX \
--enable-cross-compile \
--extra-libs="-lgcc" \
--arch=arm \
--cc=$PREBUILT/bin/arm-linux-androideabi-gcc \
--cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \
--nm=$PREBUILT/bin/arm-linux-androideabi-nm \
--sysroot=$PLATFORM \
# --extra-cflags=" -O3 -fpic -DANDROID -DHAVE_SYS_UIO_H=1 -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -finline-limit=300 $OPTIMIZE_CFLAGS " \
--extra-cflags="-I$x264/include" \
--enable-shared \
--enable-static \
#--extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib -lc -lm -ldl -llog" \
--extra-ldflags="-L$x264/lib" \
--disable-everything \
# --enable-demuxer=mov \
# --enable-demuxer=h264 \
# --disable-ffplay \
--enable-gpl \
--enable-libx264 \
# --enable-protocol=file \
# --enable-avformat \
# --enable-avcodec \
# --enable-encoder=libx264 \
# --enable-decoder=rawvideo \
#--enable-decoder=mjpeg \
# --enable-decoder=h263 \
# --enable-decoder=mpeg4 \
# --enable-encoder=h264 \
# --disable-network \
#--enable-zlib \
# --disable-avfilter \
#--disable-avdevice \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make -j4 install
$PREBUILT/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o
$PREBUILT/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -soname libffmpeg.so -shared -nostdlib -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a -lc -lm -lz -ldl -llog --warn-once --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a
}
#arm v7vfpv3
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU "
PREFIX=./androidIncludeTrialsNDK7/$CPU
ADDITIONAL_CONFIGURE_FLAG=
build_one
Если я в основном удаляю строки extracf и extrald и использую другие (прокомментированные выходы), он отлично работает, за исключением ошибки libx264. В противном случае я получаю следующие erros.
./buildnew.sh: line 35: --extra-cflags=-I/usr/local/include: No such file or directory
./buildnew.sh: line 38: --extra-ldflags=-L/usr/local/lib: No such file or directory
./buildnew.sh: line 40: --disable-everything: command not found
./buildnew.sh: line 44: --enable-gpl: command not found
Процесс компиляции заканчивается следующим.
make: *** [libavdevice/v4l.o] Error 1
make: *** Waiting for unfinished jobs....
/home/mehmet/Android_NDK_r7b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-ar: creating libavcodec/libavcodec.a
/home/mehmet/Android_NDK_r7b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-ld: cannot open output file ./androidIncludeTrialsNDK7/armv7-a/libffmpeg.so: No such file or directory
У меня есть x264, установленный в моем каталоге /home/mehmet/x264, и я также проверяю whereis x264.a, он показывает мне как /usr/local/lib. Я попытался изменить путь $ x264, чтобы указать на папку home/mehmet/x264, но я получаю ту же ошибку.
Наконец, если я включаю флаги extracf и extrald (как прокомментированные, так и используемые). Я получаю ту же ошибку, о которой говорилось выше. Боюсь, я делаю простую опечатку здесь, но не вижу ее, и это сводит меня с ума. Большое спасибо за вашу помощь.
Лучший.
РЕДАКТИРОВАТЬ
Я удалил комментарии и теперь получаю следующее.
./buildnew.sh: 4: ./buildnew.sh: function: not found
ERROR: libx264 not found
Над ошибкой наблюдается от терминала, когда я запускаю скрипт. Он создает до некоторой степени и завершает процесс со следующей ошибкой.
libavcodec/libavcodec.a(libx264.o): In function 'X264_frame':
/home/mehmet/ffmpeg-0.10.4/libavcodec/libx264.c:159: undefined reference to 'x264_picture_init'
/home/mehmet/ffmpeg-0.10.4/libavcodec/libx264.c:179: undefined reference to 'x264_encoder_reconfig'
/home/mehmet/ffmpeg-0.10.4/libavcodec/libx264.c:191: undefined reference to 'x264_encoder_encode'
/home/mehmet/ffmpeg-0.10.4/libavcodec/libx264.c:197: undefined reference to 'x264_encoder_delayed_frames'
libavcodec/libavcodec.a(libx264.o): In function 'encode_nals':
/home/mehmet/ffmpeg-0.10.4/libavcodec/libx264.c:196: undefined reference to 'x264_bit_depth'
libavcodec/libavcodec.a(libx264.o): In function 'X264_close':
/home/mehmet/ffmpeg-0.10.4/libavcodec/libx264.c:231: undefined reference to 'x264_encoder_close'
libavcodec/libavcodec.a(libx264.o): In function 'X264_init':
/home/mehmet/ffmpeg-0.10.4/libavcodec/libx264.c:284: undefined reference to 'x264_param_default'
/home/mehmet/ffmpeg-0.10.4/libavcodec/libx264.c:292: undefined reference to 'x264_param_default_preset'
/home/mehmet/ffmpeg-0.10.4/libavcodec/libx264.c:305: undefined reference to 'x264_param_parse'
/home/mehmet/ffmpeg-0.10.4/libavcodec/libx264.c:502: undefined reference to 'x264_param_apply_fastfirstpass'
/home/mehmet/ffmpeg-0.10.4/libavcodec/libx264.c:505: undefined reference to 'x264_param_apply_profile'
/home/mehmet/ffmpeg-0.10.4/libavcodec/libx264.c:544: undefined reference to 'x264_encoder_open_125'
/home/mehmet/ffmpeg-0.10.4/libavcodec/libx264.c:554: undefined reference to 'x264_encoder_headers'
./buildnew.sh: 51: ./buildnew.sh: build_one: not found
Ваши ошибки не связаны с ffmpeg/libx264. Вы не можете иметь эти комментарии посередине. Посмотрите на ошибку
./buildnew.sh: строка 35: --extra-cflags = -I/usr/local/include: Нет такого файла или каталога
Он думает, что -extra-cflags - это команда и так далее для каждой строки, которая является первой после комментария.
Ваша команда должна быть непрерывной и без комментариев. Оператор "\" не работает с комментариями.