Ошибка кодировщика libx264 в сборке ffmpeg для Android

Прямо сейчас у меня есть сценарий сборки ffmeg, который распознает libx264 и успешно компилируется. Я также скомпилировал x264 и получил библиотеку libx264.a. И ffmpeg, и libx264 построены из исходного кода. Я также могу успешно построить ffmpeg без libx264. Ниже вы можете найти мой скрипт, который пытается собрать ffmpeg с libx264.

#!/bin/bash
NDK=~/Android_NDK_r7b
PLATFORM=$NDK/platforms/android-8/arch-arm/
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
alitan=~/x264/ndk7_build
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=" -I$alitan/include" \
--disable-shared \
--enable-static \
--extra-ldflags=" -L$alitan/lib " \
--enable-version3 \
--enable-gpl \
--disable-doc \
--disable-everything \
--enable-libx264 \
--enable-encoder=libx264 \
$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=./DONE/$CPU
ADDITIONAL_CONFIGURE_FLAG=
build_one

Приведенный выше сценарий не дает мне libx264.a в выходных сборках ffmpeg. Несколько других сценариев следующие. Если я включаю кодировщик x264, я получаю неопределенные ссылки на некоторые переменные в x264.c (в libavcodec). Если я включаю общий доступ в конфигурации ffmpeg, я получаю сообщение об ошибке, в котором говорится, что он не может перейти к моему каталогу префиксов (кстати, нет проблем с разрешениями).

Я использую последние версии ffmpeg и x264 (клонировал git сегодня) и ndk 7. Ubuntu работает на виртуальной машине, установленной в Windows 7. Для получения дополнительных сведений о моем приключении по переносу ffmpeg / x264 на Android вы можете обратиться к здесь.

Что мне делать, чтобы использовать libx264 с ffmpeg? Я продолжал пробовать этот скрипт с разными конфигурациями, удалил все папки ffmpeg x264 и переустановил их, но безрезультатно.

Заранее большое спасибо.

ИЗМЕНИТЬ Ниже мой сценарий сборки x264. Он строится нормально, дает мне статическую библиотеку и заголовки.

export ARM_ROOT=/home/mehmet/Android_NDK_r7b
export ARM_INC=$ARM_ROOT/platforms/android-8/arch-arm/usr/include/
export ARM_LIB=$ARM_ROOT/platforms/android-8/arch-arm/usr/lib/
export ARM_TOOL=$ARM_ROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
export ARM_LIBO=$ARM_TOOL/lib/gcc/arm-linux-androideabi/4.4.3
export PATH=$ARM_TOOL/bin:$PATH
export PATH=$ARM_TOOL/arm-linux-androideabi/bin:$PATH
export ARM_PRE=arm-linux-androideabi
#tries to build for 4.4.3 toolchain

./configure --prefix=./ndk7_build \
--disable-gpac \
--extra-cflags=" -I$ARM_INC -fPIC -DANDROID -fpic -mthumb-interwork -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -Wno-psabi -march=armv5te -mtune=xscale -msoft-float -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -DANDROID -Wa,--noexecstack -MMD -MP " \
--extra-ldflags=" -nostdlib -Bdynamic -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,nocopyreloc -Wl,-soname,/system/lib/libz.so -Wl,-rpath-link=$ARM_LIB,-dynamic-linker=/system/bin/linker -L$ARM_LIB -nostdlib $ARM_LIB/crtbegin_dynamic.o $ARM_LIB/crtend_android.o -lc -lm -ldl -lgcc " \
--cross-prefix=${ARM_PRE}- \
--disable-asm \
--enable-static \
--host=arm-linux \

Вот что происходит на терминале, когда я включаю кодировщик libx264.

STRIP   ffmpeg
INSTALL install-progs-yes
INSTALL ffmpeg
INSTALL ffprobe
libavcodec/libavcodec.a(libx264.o): In function `X264_frame':
/home/mehmet/ffmpeg/libavcodec/libx264.c:158: undefined reference to `x264_picture_init'
/home/mehmet/ffmpeg/libavcodec/libx264.c:178: undefined reference to `x264_encoder_reconfig'
/home/mehmet/ffmpeg/libavcodec/libx264.c:189: undefined reference to `x264_encoder_encode'
/home/mehmet/ffmpeg/libavcodec/libx264.c:195: undefined reference to `x264_encoder_delayed_frames'
libavcodec/libavcodec.a(libx264.o): In function `encode_nals':
/home/mehmet/ffmpeg/libavcodec/libx264.c:100: undefined reference to `x264_bit_depth'
libavcodec/libavcodec.a(libx264.o): In function `X264_close':
/home/mehmet/ffmpeg/libavcodec/libx264.c:230: undefined reference to `x264_encoder_close'
libavcodec/libavcodec.a(libx264.o): In function `X264_init':
/home/mehmet/ffmpeg/libavcodec/libx264.c:283: undefined reference to `x264_param_default'
/home/mehmet/ffmpeg/libavcodec/libx264.c:291: undefined reference to `x264_param_default_preset'
/home/mehmet/ffmpeg/libavcodec/libx264.c:313: undefined reference to `x264_param_parse'
/home/mehmet/ffmpeg/libavcodec/libx264.c:448: undefined reference to `x264_param_apply_fastfirstpass'
/home/mehmet/ffmpeg/libavcodec/libx264.c:451: undefined reference to `x264_param_apply_profile'
/home/mehmet/ffmpeg/libavcodec/libx264.c:494: undefined reference to `x264_encoder_open_125'
/home/mehmet/ffmpeg/libavcodec/libx264.c:505: undefined reference to `x264_encoder_headers'

person kerim yucel    schedule 31.08.2012    source источник
comment
@rogerdpack Я отредактировал вопрос своим скриптом сборки x264.   -  person kerim yucel    schedule 01.09.2012
comment
Я думаю, что проблема с отсутствием символов x264 - правильный сценарий. Можете ли вы распечатать отсутствующие символы для x264. Я спрашиваю об этом, потому что считаю, что вам нужно использовать последнюю версию ffmpeg для последней версии x264.   -  person av501    schedule 01.09.2012
comment
Также эти ребята, похоже, столкнулись с подобной проблемой и решили ее. Взгляните: http://stackoverflow.com/questions/8812827/build-ffmpeg-with-x264-for-android?rq=1   -  person av501    schedule 01.09.2012
comment
Попробуйте посмотреть stackoverflow.com / questions / 8812827 / один раз. У них была такая же проблема.   -  person av501    schedule 01.09.2012
comment
@ av501 Я тоже думал об этом, поэтому только сегодня загрузил последнюю версию ffmpeg вместе с последней версией x264. Я снова проверю config.log с помощью --enable-encoder = libx264 и попытаюсь понять, что не так.   -  person kerim yucel    schedule 01.09.2012
comment
У этих парней была такая же проблема: stackoverflow.com/questions/8812827/ Попробуйте их решение один раз.   -  person av501    schedule 01.09.2012
comment
@ av501 Я уже сделал закладку несколько дней назад :). На самом деле я пробую самый простой вариант, который предпочтительнее в этом посте, а именно включение x264 и ничего больше. Как я уже говорил, без включенного кодировщика он строится нормально, но не дает libx264.a в выводе сборки ffmpeg. Настоящая проблема начинается при включении кодировщика.   -  person kerim yucel    schedule 01.09.2012
comment
Вопрос снова редактируется с выходом сценария с включенным кодировщиком, видимым с терминала.   -  person kerim yucel    schedule 01.09.2012
comment
@kerimyucel, сборка ffmpeg не даст вам libx264. Поэтому я не уверен, что вы имеете в виду, говоря, что в выводе сборки ffmpeg не указывается lix264.a. Сборка x264 дает libx264. Таким образом, ваш ffmpeg должен иметь -L для пути к библиотеке x264, по которому вы собираете x264, и его библиотека доступна. Я не вижу такого пути в вашем файле сборки ffmpeg. Ваша сборка x264 сгенерирует файл libx264. Узнай, где это. Затем добавьте этот путь в свою сборку ffmpeg. Это ваша проблема.   -  person av501    schedule 01.09.2012
comment
@ av501 ffmpeg, включая libx264.a, было просто недоразумением с моей стороны, я думал, что он будет включать статическую библиотеку вместе с другими (libavcodec и т. д.). Думаю, я добавил путь к libx264 как для заголовка, так и для самой статической библиотеки. (флаги extrald и extracf). Стоит ли добавить что-нибудь еще?   -  person kerim yucel    schedule 01.09.2012
comment
@kerimyucel, этого должно хватить. Есть ли x264 / ndk7_build, где доступен libx264.a? Так как же выглядит командная строка сборки? Посмотрите на командную строку сборки. Это правильно?   -  person av501    schedule 01.09.2012
comment
@ av501 Да, у меня есть заголовки и статическая библиотека в этой папке, в подпапках / include и / lib соответственно. Как я уже говорил ранее, когда я запускаю скрипт без включения кодировщика libx264, он строится блестяще, без проблем. Я не понимаю, что может быть не так, когда я включаю encoderlibx264, я получаю сообщения об ошибках, опубликованные в моем вопросе.   -  person kerim yucel    schedule 01.09.2012
comment
Может строиться нормально. Работает ли ром ffmpeg без libx264? Также x264 строится отдельно. Так можно ли запустить x264 отдельно, а не как часть ffmpeg?   -  person av501    schedule 01.09.2012
comment
FFmpeg без включения кодировщика x264 работает нормально, никаких проблем с этим. Я мог бы использовать их по отдельности (оборачивая их с помощью JNI в java), но я стараюсь избегать этого по мере возможности. Тем временем я пробовал что-то еще, я видел, как мой скрипт x264 оптимизирует код для arm5, тогда как ffmpeg делает это для armv7. Я изменил флаги x264 для оптимизации armv7, запустил скрипт с включенным кодировщиком, но все равно с той же ошибкой, что и исходный пост.   -  person kerim yucel    schedule 01.09.2012
comment
Я вижу некоторые флаги в x264, которых нет для ffmpeg. В идеале оба должны работать с обоими флагами. Меня беспокоит -lc -lm -lgcc и т. Д. Где взять библиотеки для линковки? Он должен использовать те, которые есть в файловой системе. Другой вопрос: можете ли вы создать и запустить исполняемый файл x264 отдельно и запустить? Дело в том, что поскольку ffmpeg не может найти libx264, есть две возможности: 1. Путь к библиотеке неверен. 2. Неправильный формат библиотеки. Итак, у меня есть единственное подозрение, что это сборка x264, так как вы должны были проверить, в порядке ли пути.   -  person av501    schedule 01.09.2012
comment
Я не пробовал запускать исполняемый файл, на самом деле я не создаю исполняемый файл для libx264. Думаю, может быть проблема с флагами компоновщика. Мы обсуждаем это под ответом выше.   -  person kerim yucel    schedule 01.09.2012


Ответы (2)


https://github.com/guardianproject/android-ffmpeg/blob/master/configure_ffmpeg.sh

посмотрите ссылку выше и посмотрите, как восьмёрка включает L..X264 в свой ./ffmpeg/configure ...

если вы получите правильные библиотеки в цепочке поиска для шага конфигурации на ffmpeg, тогда все эти неопределенные ссылки исчезнут ...

person Robert Rowntree    schedule 01.09.2012
comment
Если я не ошибаюсь, флаги в сценарии конфигурации, который вы опубликовали, просто добавляют некоторые оптимизации для NEON по сравнению с моим сценарием, так что это не должно вызывать проблем. В отношении моей проблемы я ставлю на флаги в сценарии libx264, который я использую. Кто-нибудь может обнаружить что-нибудь в сценарии x264, который я опубликовал выше? (хотя он работает нормально, что-то должно быть не так, поэтому я получаю сообщение об ошибке в исходном сообщении) - person kerim yucel; 01.09.2012
comment
--extra-ldflags = -L $ alitan / lib \ это выражение библиотеки компоновщика. Как это включает -L..X264 для компоновщика? - person Robert Rowntree; 01.09.2012
comment
Я пытаюсь искать заголовки libx264 и статическую библиотеку в другой папке (это $ alitan / include и / lib соответственно), тогда как опубликованный вами скрипт ищет их в parentdirectory / x264, не так ли? У меня также есть make install'd x264 build, поэтому я ищу его в выходной папке сборки, которая является x264 / alitan. Если честно, я не вижу разницы. - person kerim yucel; 01.09.2012
comment
мне кажется, что ваша сборка x264 выводит статическую библиотеку в ./configure --prefix =. / android2 \. Разве вам не нужно координировать эту цель с последующими шагами сборки - то есть библиотеками, которые ищет компоновщик на этапе config_ffmpeg? - person Robert Rowntree; 01.09.2012
comment
Итак, я предполагаю, что вы говорите, что мне нужно передать компоновщику параметр, например -wl, -rpath-link = $ alitan / lib -L $ alitan / lib следует добавить в ldflags? Правильно ли я понял? - person kerim yucel; 01.09.2012
comment
шаг 4 ffmpeg_config ... оператор компоновщика для того, где берется статическая библиотека X264, должен согласовываться с выходным ./lib назначением из предыдущего шага (т.е. x264 make / install для кросс-инструментальной цепочки помещает свое статическое место) .. i посмотрел на вашу конфигурацию x264, и я думаю, что вывод идет на --prefix ... поэтому ffmeg_config должен знать, где взять x264 lib. - person Robert Rowntree; 01.09.2012
comment
Я знаю, что вы имеете в виду, на самом деле сценарии x264 и ffmpeg выше указывали на разные папки сборки для x264, но я исправил это. Причина, по которой я изменил префикс для установки x264, заключается в том, что я пытался собрать с разными конфигурациями. Соответственно отредактировал скрипт x264 в сборке. Он находит путь к libx264, я уверен, поскольку, когда я включаю libx264 в конфигурации ffmpeg, он строится. Когда я добавляю encoderlibx264, появляется ошибка, показанная в исходном сообщении. - person kerim yucel; 01.09.2012
comment
блин! github.com/guardianproject/android-ffmpeg .. Итак, у меня x264 отлично работает на android ... и чтобы запустить x264 ... я использовал этот проект ... у него нет всего необходимого мне Android, поэтому я добавил свой собственный. Но я знаю, что его x264 надежен .. github.com/rowntreerob/android-ffmpeg удачи с проблемами кросс-инструментальной цепочки ... - person Robert Rowntree; 01.09.2012
comment
Я знаю, что это нелепо, он может связываться без кодировщика, я получаю libffmpeg.so, но с кодировщиком я получаю ошибки и не могу получить libffmpeg.so. Я постараюсь сделать это какое-то время, если нет, то обязательно попробую ссылку, которую вы разместили. Большое спасибо. - person kerim yucel; 01.09.2012

Что ж, благодаря мерзавцу Роберта, я проверил его, и он отлично работает. Я не знаю почему, но использование сборки в стиле SYSROOT и добавление флагов оптимизации armv7 сработало. Я создал двоичный файл для ffmpeg, связанный с x264 с поддержкой кодировщика x264. Спасибо за вашу помощь.

person kerim yucel    schedule 01.09.2012
comment
ммм ... meta.stackexchange. ru / questions / 5234 / ... если вам нравится ответ, который вам кто-то дает, не стесняйтесь "принять" его - person Robert Rowntree; 03.09.2012