ffmpeg的Android交叉编译及在Qt for Android中的使用

来源:互联网 发布:邢帅教育 知乎 编辑:程序博客网 时间:2024/06/06 09:20
在将ffmpeg库移植到Qt for Android进行开发过程中过程遇到一些问题,这里将移植过程及遇到的问题记录如下,也让后面的人在使用Qt for android过程中遇到同类问题时解决起来更加简单快捷。
1.编译ffmpeg脚本网上很多,这里用的脚本,内容如下:

make clean 
 
export NDK=/home/fish/android/android-ndk-r10b
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt 
export PLATFORM=$NDK/platforms/android-19/arch-arm 
export PREFIX=build
build_one(){ 
  ./configure --target-os=linux --prefix=$PREFIX --enable-cross-compile --enable-runtime-cpudetect --disable-asm --arch=arm --cc=$PREBUILT/linux-x86/bin/arm-linux-androideabi-gcc --cross-prefix=$PREBUILT/linux-x86/bin/arm-linux-androideabi- --disable-stripping --nm=$PREBUILT/linux-x86/bin/arm-linux-androideabi-nm --sysroot=$PLATFORM --enable-gpl --enable-shared --disable-static --enable-small --disable-ffprobe --disable-ffplay --disable-ffmpeg --disable-ffserver --disable-debug --extra-cflags="-fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -marm -march=armv7-a"  

 
build_one 
 
make 
make install 
 
安装到/home/XXXX/ffmpeg-3.0.1/build后,进入/home/XXXX/ffmpeg-3.0.1/build目录可以看到bin/、include/、lib/等目录,在lib目录下执行readelf -h lib*查看库文件的头信息,是否为ARM平台。

2.在Qt for android中需要用到ffmpeg函数时,则将交叉编译得到ffmpeg动态库文件路径添加到工程的.pro文件中:
    LIBS += "$$PWD/ffmpeg/libs/libavformat-57.so" \
            "$$PWD/ffmpeg/libs/libavcodec-57.so" \
            "$$PWD/ffmpeg/libs/libavdevice-57.so" \
            "$$PWD/ffmpeg/libs/libavfilter-6.so" \
            "$$PWD/ffmpeg/libs/libavutil-55.so" \
            "$$PWD/ffmpeg/libs/libswresample-2.so" \
            "$$PWD/ffmpeg/libs/libswscale-4.so" \
    "$$PWD/ffmpeg/libs/libpostproc-54.so"
                           
 3. 在将编译生成的APK安装包部署到Android设备上时,需要一个必不可少的操作,点击"add"按钮添加所需的ffmpeg动态库,这样才不会在部署到真机上后,出现程序无法打开的情况,
    通过ADB登陆手机shell,查看logcat内容:
    E/dalvikvm(14692): dlopen("/data/app-lib/org.qtproject.example.ffmepg_client-2/libffmepg_client.so") failed: dlopen failed: could not load library     "libavformat.so.57" needed by "libffmepg_client.so"; caused by library



表现在pro文件的就是:
contains(ANDROID_TARGET_ARCH,armeabi-v7a) {
    ANDROID_EXTRA_LIBS = \
        $$PWD/ffmpeg/libs/libavcodec-57.so \
        $$PWD/ffmpeg/libs/libavdevice-57.so \
        $$PWD/ffmpeg/libs/libavfilter-6.so \
        $$PWD/ffmpeg/libs/libavformat-57.so \
        $$PWD/ffmpeg/libs/libavutil-55.so \
        $$PWD/ffmpeg/libs/libpostproc-54.so \
        $$PWD/ffmpeg/libs/libswresample-2.so \
        $$PWD/ffmpeg/libs/libswscale-4.so \
}
备注:将其换成静态库编译时,得到的静态库在Qt编译时出现如下错误,这两个是数学公式里的对数,由于没有对数源码参考,所以这个问题未能解决:
     libavcodec/imc.c:473: error: undefined reference to 'log2f'
    libavcodec/ffv1enc.c:636: error: undefined reference to 'log2'

1 0
原创粉丝点击