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でライブラリを構築し、EclipseのWindows 7で使用しています。h264エンコーダーとデコーダーのみが必要なので、チュートリアルからわずかに変更したffmpegの次のコードを使用しました。

#!/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;
    }
.
.
.
}

initencoder() を呼び出す Java ソース コードを実行すると、戻り値として -1 が返され、logcat が「見つかりません」と出力します。これは、 avcodec_find_encoder() が null を返し、条件が OK である場合を意味します。何が悪いのかわからない。この関数が null を返すのはなぜですか? 私はたくさん検索しましたが、正しい方向に導くことができる解決策は見つかりませんでした。avcodec_init() を使用すると言う人もいます。しかし、ndk-build コマンドは失敗し、「avcodec_init()」への未定義の参照を示すエラーが表示されます。最初の段階から間違っているのではないかと思ったので、ライブラリのビルドを開始しました。必要なものを有効にしないなど、ライブラリの構築で間違いを犯しましたか? ここで私を助けてください。これは私にとって一種の緊急です。

4

3 に答える 3

0

関数を再利用することでこの問題を解決しました

avcodec_register_all()

avcodec_find_encoder(codec_id);

この機能は非推奨ですが、私にとってはうまくいきました。

于 2019-10-18T12:42:46.963 に答える
-1
av_register_all(); already calls avcodec_register_all() inside it.

したがって、avcodec_register_all(); を入れないでください。

于 2014-04-05T10:39:58.190 に答える