3

私が正確にやりたいこと: ffmpeg.cファイルにアクセスしてint main(int argc, char **argv)関数をJNIに変更し、ffmpeg のコマンドを文字列として渡します。

ffmpeg C ライブラリを android(ARM プロセッサ)に移植しようとしました。これを行うには、次のさまざまな方法に従いました。

最初の試行: 公式の ffmpeg インストール ドキュメントを使用します。手順は次のとおりです

a) git クローン git://source.ffmpeg.org/ffmpeg.git ffmpeg

b) INSTALL ファイルを読みます。

c) x264 ライブラリをダウンロードし、ビルドに成功したbuild_x264.shを使用してビルドします。

    NDK=/home/nav/Work/android/ndk
    PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt
    PLATFORM=$NDK/platforms/android-8/arch-arm
    PREFIX=/home/nav/28ffmpeg/android-ffmpeg                
    ./configure --prefix=$PREFIX --enable-static --enable-pic --disable-asm --disable-cli --host=arm-linux --cross-prefix=$PREBUILT/linux-x86/bin/arm-linux-androideabi- --sysroot=$PLATFORM
  make
  sudo make install
  sudo ldconfig

d)次に、(http://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2)からffmpegライブラリをダウンロードし、 build_android.shを使用してビルドします

#!/bin/bash

NDK=/home/nav/Work/android/ndk
PLATFORM=$NDK/platforms/android-8/arch-arm
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
PREFIX=/home/nav/28ffmpeg/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 \
                --enable-demuxer=rtsp \
                --enable-muxer=rtsp \
                --disable-ffplay \
                --disable-ffserver \
                --enable-ffmpeg \
                --disable-ffprobe \
                --enable-libx264 \
                --enable-encoder=libx264 \
                --enable-decoder=h264 \
                --enable-protocol=rtp \
                --enable-hwaccels \
                --enable-zlib \
                --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

e) 最初は完全に機能します。しかし、そのエラーが発生した後:

libavformat/libavformat.a(log2_tab.o):(.rodata+0x0): multiple definition of `ff_log2_tab'
libavcodec/libavcodec.a(log2_tab.o):(.rodata+0x0): first defined here
libavutil/libavutil.a(log2_tab.o):(.rodata+0x0): multiple definition of `ff_log2_tab'
libavcodec/libavcodec.a(log2_tab.o):(.rodata+0x0): first defined here
build_android.sh: 48: build_one: not found

結果: libffmpeg.soが見つかりません。

2回目の試行:次に、http://dl.dropbox.com/u/22605641/ffmpeg_android/main.html -> Buildsの手順に従います

a)上記のリンクからPre-Build libffmpeg.soをダウンロードしました。

b) libffmpeg.solibs/armeabi/に追加します。

c) Android.mkを作る

include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg
LOCAL_SRC_FILES := libffmpeg.so
include $(PREBUILT_SHARED_LIBRARY)

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := main
LOCAL_STATIC_LIBRARIES += ffmpeg
LOCAL_SRC_FILES := ffmpeg-test.c
include $(BUILD_SHARED_LIBRARY)

d) 次に、すべての ndk セットアップと all.Copy ffmpeg.cをライブラリからffmpeg-test.cにそのint main関数をJNI関数に変更し、必要なすべてのインクルード ファイルを含めます。

エラー:

コンソール:

  /home/nav/Work/android/ndk/ndk-build all 
Prebuilt       : libffmpeg.so <= jni/
Install        : libffmpeg.so => libs/armeabi/libffmpeg.so
Compile thumb  : main <= ffmpeg-test.c
jni/ffmpeg-test.c: In function 'print_report':
jni/ffmpeg-test.c:1139:94: warning: incompatible implicit declaration of built-in function 'log2' [enabled by default]
SharedLibrary  : libmain.so
/home/nav/Work/android/ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/main/ffmpeg-test.o: in function check_keyboard_interaction:jni/ffmpeg-test.c:2496: error: undefined reference to 'qp_hist'

および他の多くの未定義の参照。

4

3 に答える 3

1

https://github.com/guardianproject/android-ffmpeg

「ffmpeg.c.main()」に変更を加える手がかりについては、git でこのプロジェクトを参照してください。このプロジェクトのビルドは、readme に記載されている NDK のリリースで正常に動作すると思います。

ノート:

make がどのように機能するかを理解できるように、NDK ディストリビューションのすべての doc ファイルに時間を費やす必要があります。

「main()」関数の終了条件は通常、android JNI 用に少し変更する必要があります。

于 2012-12-28T16:58:19.760 に答える
0

複数の定義を修正するには、以下を追加します。

$PREBUILT/bin/arm-linux-androideabi-ar -dv libavcodec.a log2_tab.o
$PREBUILT/bin/arm-linux-androideabi-ar -dv libavutil.a log2_tab.o

ただし、次の構成オプションを追加することもできます。

--disable-symver

このようにして、私はffmpegのHEADバージョンをndk v8でコンパイルすることができましたが、機能がはるかに少ないLGPLライセンスを使用しました。

于 2013-03-01T10:10:57.380 に答える