在将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'