2013-04-04 2 views
6

Я создаю приложение для Android, которое будет кодировать изображение, захваченное с предварительного просмотра камеры, и затем декодировать его. Я использую библиотеку ffmpeg для кодирования и декодирования. Чтобы создать статическую библиотеку с x264, я использовал этот учебник. http://dl.dropbox.com/u/22605641/ffmpeg_android/main.html. Как исходный код ffmpeg, если я использую тот, который загружен из ссылки, приведенной в учебнике, я могу его построить, но не могу построить библиотеку, если я использую исходный код, загруженный отсюда git clone git: //source.ffmpeg.org/ffmpeg. git ffmpeg. Я создал библиотеку в ubuntu и использовал ее в Windows 7 в Eclipse. Поскольку мне нужен только h264-кодировщик и декодер, я использовал следующий код для ffmpeg, слегка модифицированный из учебника.avcodec_find_encoder (AV_CODEC_ID_H264) возвращает null

#!/bin/bash 

NDK=~/Documents/android-ndk-r8e 
PLATFORM=$NDK/platforms/android-8/arch-arm 
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86 
PREFIX=/home/android-ffmpeg 

function build_one 
{ 
    ./configure --target-os=linux --prefix=$PREFIX \ 
    --enable-cross-compile \ 
    --enable-runtime-cpudetect \ 
    --disable-asm \ 
    --arch=arm \ 
    --cc=$PREBUILT/bin/arm-linux-androideabi-gcc \ 
    --cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \ 
    --disable-stripping \ 
    --nm=$PREBUILT/bin/arm-linux-androideabi-nm \ 
    --sysroot=$PLATFORM \ 
    --enable-nonfree \ 
    --enable-version3 \ 
    --disable-everything \ 
    --enable-gpl \ 
    --disable-doc \ 
    --enable-avresample \ 
    --disable-ffplay \ 
    --disable-ffserver \ 
    --enable-ffmpeg \ 
    --disable-ffprobe \ 
    --enable-avcodec \ 
    --enable-libx264 \ 
    --enable-encoder=libx264 \ 
    --enable-encoder=libx264rgb \ 
    --enable-decoder=h263 \ 
    --enable-decoder=h264 \ 
    --enable-decoder=svq3 \ 
    --enable-zlib \ 
    --enable-gpl \ 
    --enable-pic \ 
    --disable-devices \ 
    --disable-avdevice \ 
    --extra-cflags="-I/home/android-ffmpeg/include -fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=armv7-a" \ 
    --extra-ldflags="-L/home/android-ffmpeg/lib" 
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 -L$PREFIX/lib -soname libffmpeg.so -shared -nostdlib -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavfilter/libavfilter.a libavresample/libavresample.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a -lc -lm -lz -ldl -llog -lx264 --warn-once --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a 
} 

build_one 

После создания библиотеки я смог построить android ndk. Небольшая часть моего кода JNI находится здесь.

JNIEXPORT jint JNICALL Java_com_example_testjava_TestjniActivity_initencoder(JNIEnv* env,jobject obj){ 

    av_register_all(); 
    avcodec_register_all(); 
    codec = avcodec_find_encoder(AV_CODEC_ID_H264); 
    if (!codec) { 
     __android_log_write(ANDROID_LOG_INFO, "debug", "not found");     
     return -1; 
    } 
. 
. 
. 
} 

Когда я запускаю мой Java исходный код, который вызывает initencoder() я получаю -1 в качестве возвращаемого значения и LogCat отпечатков «не найден». Это означает, что avcodec_find_encoder() возвращает значение null, и если условие в порядке. Я не знаю, что случилось. Почему эта функция возвращает null? Я много искал, но не нашел решения, которое могло бы привести меня в правильном направлении. некоторые говорят использовать avcodec_init(). Но команда ndk-build терпит неудачу и показывает ошибку, указав неопределенную ссылку на «avcodec_init()». Я начал с создания библиотеки, потому что, по-моему, я ошибаюсь с первого этапа. Неужели я ошибался в создании библиотеки, например, не позволяя мне что-то делать? Пожалуйста, помогите мне здесь. Для меня это срочно.

+0

Пожалуйста, измените ваш пост так, что она содержит конкретный вопрос. Это облегчит нам помощь. –

+1

У меня такая же проблема. Насколько мне известно, 'avcodec_register_all()' должен был позаботиться об этом, но это не так. Работает отлично на Ubuntu, но не работает на Android. Могли ли вы решить проблему? – BVB

+0

Тот же вопрос. Кто-нибудь решит? – jerry

ответ

-1
av_register_all(); already calls avcodec_register_all() inside it. 

Поэтому не ставьте avcodec_register_all();

+0

Это может быть так, но это не решает проблему. –

0

Задача: avcodec_find_encoder возвращает NULL;

Возможные причины:

  1. libx264 что-то пошло не так во время компиляции или процесса конфигурации.
  2. libx264 не был упакован в apk или загружен правильно.

Мое дело, это было как. У меня был параметр «--enable-libx264» в конфигурации, но он не предоставлял пути к совместимой с android библиотеке libx264 и включал каталоги, поэтому библиотека была скомпилирована без поддержки x264. Надеюсь, это спасет чье-то время.

Решение

После компиляции x264 с соответствующим набором инструментами и сделать их доступными для FFmpeg во время компиляции FFmpeg, установив --extracflags и размещение самостоятельно составленный x264 библиотеки и в включает в папке JNI, он перестал отвечать на NULL, по крайней мере ,

Мой FFmpeg сценарий сборки:

NDK=$HOME/Android/Sdk/ndk-bundle 
SYSROOT=$NDK/platforms/android-19/arch-arm/ 
TOOLCHAIN=$HOME/Android/Sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 
CPREFIX=$TOOLCHAIN/bin/arm-linux-androideabi- 

CPU=arm 
PREFIX=$(pwd)/android/$CPU 
ADDI_CFLAGS="-marm" 

ADDI_CFLAGS="$ADDI_CFLAGS -I${NDK}/sources/x264 -I${NDK}/sources/x264/android/arm/include -L${NDK}/sources/x264/android/arm/lib -DANDROID -I${NDK}/sources/cxx-stl/system/include" 
# -mfloat-abi=softfp -mfpu=neon" 

ADDI_LDFLAGS="$ADDI_LDFLAGS -L${NDK}/sources/x264/android/arm/lib" 
#--extra-cxxflags='-Wno-multichar -fno-exceptions -fno-rtti' 

function build_it { 
./configure \ 
    --prefix=$PREFIX \ 
    --disable-static \ 
    --enable-shared  \ 
    --disable-doc  \ 
    --disable-ffmpeg \ 
    --disable-ffplay \ 
    --disable-ffprobe \ 
    --disable-ffserver \ 
    --disable-avdevice \ 
    --disable-doc  \ 
    --disable-symver \ 
    --cross-prefix=$CPREFIX \ 
    --target-os=linux \ 
    --arch=arm  \ 
    --enable-cross-compile \ 
    --enable-gpl  \ 
    --enable-libx264 \ 
    --sysroot=$SYSROOT \ 
    --extra-cflags="-Os -fpic $ADDI_CFLAGS" \ 
    --extra-ldflags="$ADDI_LDFLAGS" \ 
    $ADDITIONAL_CONFIGURE_FLAG 


    make clean 
    make 
    make install 

    echo "build done run make install" 
} 


build_it 

Мой x264 сценарий сборки:

#Android related 

NDK=$HOME/Android/Sdk/ndk-bundle 
SYSROOT=$NDK/platforms/android-19/arch-arm/ 
TOOLCHAIN=$HOME/Android/Sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 
CPREFIX=$TOOLCHAIN/bin/arm-linux-androideabi- 
CPU=arm 
PREFIX=$(pwd)/android/$CPU 
ADDI_CFLAGS="-marm" 

export PATH="$PATH:$TOOLCHAIN/bin" 

#PKG_CONFIG_PATH="$HOME/Android/Sdk/ndk-bundle/sources/FFmpeg/lib/pkgconfig" 

function build_it { 
./configure \ 
    --prefix=$PREFIX \ 
    --bindir=$HOME/Android/Sdk/ndk-bundle/sources/bin \ 
    --enable-static \ 
    --host=arm-linux \ 
    --enable-pic \ 
    --sysroot=$SYSROOT \ 
    --cross-prefix=arm-linux-androideabi- \ 
    --enable-shared \ 
    --extra-cflags="-Os -fpic $ADDI_CFLAGS" \ 
    --extra-ldflags="$ADDI_LDFLAGS" \ 
    $ADDITIONAL_CONFIGURE_FLAG 
} 
build_it 
make 
make install