首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法将FFmpeg C库移植到android中

无法将FFmpeg C库移植到android中
EN

Stack Overflow用户
提问于 2012-12-28 07:39:11
回答 3查看 5.1K关注 0票数 3

我想做的事情-:访问ffmpeg.c文件以修改int (int,char **argv)函数到JNI,并将ffmpeg的命令作为字符串传递。

我曾尝试将ffmpeg C库移植到android(ARM处理器)。我遵循不同的方法来做这件事。

第一次尝试:使用官方的ffmpeg安装文档。步骤如下

( a) git克隆git:// ffmpeg e.ffmpeg.org/ffmpeg.git ffmpeg

( b)读取安装文件。

( c)下载x264库,并使用build_x264.sh进行编译。

代码语言:javascript
复制
    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)然后使用build_android.sh从(http://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2)下载ffmpeg库

代码语言:javascript
复制
#!/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)最初它工作得很完美。但在此之后,错误出现了:

代码语言:javascript
复制
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

第二次尝试:然后我遵循android/main.html->构建中的步骤

a)我从上面的链接下载了预构建libffmpeg.so。

b)将libffmpeg.so添加到libs/armeabi/中。

( c)使Android.mk

代码语言:javascript
复制
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)

然后,通过将其ffmpeg-test.c int主函数更改为我的JNI函数,完成所有ndk设置和all.Copy ffmpeg.c从库到的操作,并包含所有必要的包含文件。

错误:

控制台:

代码语言:javascript
复制
  /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'

还有许多其他未定义的引用。

EN

回答 3

Stack Overflow用户

发布于 2012-12-28 16:58:19

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

查看git上的这个项目,寻找对'ffmpeg.c.main()‘进行更改的线索--我相信这个项目的构建在自述的NDK发布时会运行得很好。

注意:

您应该花一些时间处理NDK发行版中的所有文档文件,以便您了解make是如何工作的。

对于android来说,'main()‘函数的退出条件通常需要稍加修改。

票数 1
EN

Stack Overflow用户

发布于 2013-03-01 10:10:57

要修复多个定义,请添加:

代码语言:javascript
复制
$PREBUILT/bin/arm-linux-androideabi-ar -dv libavcodec.a log2_tab.o
$PREBUILT/bin/arm-linux-androideabi-ar -dv libavutil.a log2_tab.o

但是,您也可能希望添加此配置选项:

代码语言:javascript
复制
--disable-symver

通过这种方式,我成功地用ndk v8编译了ffmpeg的头版本,但是使用了LGPL许可证,它包含了更少的特性。

票数 0
EN

Stack Overflow用户

发布于 2016-04-28 09:16:50

要解决多重定义问题,需要删除重复的*.o,这样就不会发生冲突。我能够使用以下命令实现同样的目标。

rm /libavcodec/log2 2_tab.o

rm /ffmpeg-3.0.1/libavcodec/reverse.o

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14066268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档