首先编译ffmpeg x264 aac,在编译ffmpeg时一开始很没有头绪,后来看到网上各种使用ndk编译ffmpeg,大概意思我理解也就是使用交叉编译环境编译x264,aac,ffmpeg时会出现很多错误,在这就不多说了,自己试试就知道了。主要还交叉编译环境的配置,一定要看准。出现 C compliter not execuate 看看ndk gcc 配置对了没。
faac编译 bl.sh
#!/bin/bash
export VERSION=4.6
export NDK=/home/into/android/android-ndk-r9d
export PREBUILT=${NDK}/toolchains/arm-linux-androideabi-$VERSION/prebuilt/linux-x86
export PLATFORM=$NDK/platforms/android-9/arch-arm
export FFMPEG_ROOT=../ffmpeg
export X264_ROOT=../x264 #上面的x264的源码目录
export ELIB="$PREFIX/lib"
export FAAC_ROOT=../fdk-aac
#export CROSS_COMPILE= $PREBUILT/arm-linux-androideabi/
#CC_PATH = $NDK/toolchains/arm-linux-androideabi-$VERSION/prebuilt/linux-x86/arm-linux-androideabi-gcc
function build_faac
{
#cd $FAAC_ROOT
pwd
CFLAGS="-fpic -DANDROID -fpic -mthumb-interwork -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -Wno-psabi -march=armv7-a -mtune=xscale -msoft-float -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -DANDROID -Wa,--noexecstack -MMD -MP "
#FLAGS="--host=arm-androideabi-linux --enable-static --disable-shared --prefix=$HOME --enable-armv5e "
CROSS_COMPILE=$PREBUILT/bin/arm-linux-androideabi-
export CPPFLAGS="$CFLAGS"
export CFLAGS="$CFLAGS"
export CXXFLAGS="$CFLAGS"
export CXX="${CROSS_COMPILE}g++ --sysroot=${PLATFORM}"
export LDFLAGS="$LDFLAGS"
export CC="${CROSS_COMPILE}gcc --sysroot=${PLATFORM}"
export NM="${CROSS_COMPILE}nm"
export STRIP="${CROSS_COMPILE}strip"
export RANLIB="${CROSS_COMPILE}ranlib"
export AR="${CROSS_COMPILE}ar"
./configure --prefix=$PREFIX --host=arm-linux \
--enable-shared \
--without-mp4v2
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS=""
build_faac
x264编译 bl.sh
#!/bin/bash
export VERSION=4.6
export NDK=/home/into/android/android-ndk-r9d
export PREBUILT=${NDK}/toolchains/arm-linux-androideabi-$VERSION/prebuilt/linux-x86
export PLATFORM=$NDK/platforms/android-9/arch-arm
export FFMPEG_ROOT=../ffmpeg
export X264_ROOT=../x264 #上面的x264的源码目录
export ELIB="$PREFIX/lib"
export FAAC_ROOT=../fdk-aac
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-static \
--enable-shared \
--enable-pic \
--disable-asm \
--disable-cli \
--host=arm-linux \
--cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \
--sysroot=$PLATFORM
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS=""
build_one
ffmpeg编译 bl.sh
#!/bin/bash
export VERSION=4.8
export NDK=/home/into/android/android-ndk-r9d
export PREBUILT=${NDK}/toolchains/arm-linux-androideabi-$VERSION/prebuilt/linux-x86
export PLATFORM=$NDK/platforms/android-19/arch-arm
#export FFMPEG_ROOT=../ffmpeg
export X264_ROOT=../x264 #上面的x264的源码目录
export ELIB="./elib"
export FAAC_ROOT=../fdk-aac
function build_one
{
./configure \
--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 \
--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-libfaac --enable-nonfree \
--enable-encoder=aac \
--enable-decoder=aac \
--enable-hwaccels \
--enable-zlib \
--target-os=linux \
--enable-shared \
--extra-cflags="-Os -marm -I./einclude -fPIC -DANDROID" \
--extra-ldflags="-L$ELIB -lx264 -lfaac" \
$ADDITIONAL_CONFIGURE_FLAG
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
# ADDI_CFLAGS="-marm -I../x264/android/arm/include -DANDROID "
# ADDI_LDFLAGS="-L../x264/android/arm/lib"
#--enable-libfaac --enable-nofree
build_one
编译完qt使用ffmpeg如果自己封装第三方动态库的话,需要使用编写android.mk 使用ndk编译第三方库,生成自己的动态库才能在qtcreator中使用。
直接使用qtcreator封装的第三方动态库会调用失败,找不到库。需要根据自己的情况编译生成自己的动态库。
Android.mk
#LOCAL_PATH := $(call my-dir)
#打包第三方库
#include $(CLEAR_VARS)
#LOCAL_MODULE := avcodec
#LOCAL_SRC_FILES := ffmpeg/lib/libavcodec-55.so
#include $(PREBUILT_SHARED_LIBRARY)
#include $(CLEAR_VARS)
#LOCAL_MODULE := avformat
#LOCAL_SRC_FILES := ffmpeg/lib/libavformat-55.so
#include $(PREBUILT_SHARED_LIBRARY)
#include $(CLEAR_VARS)
#LOCAL_MODULE := avutil
#LOCAL_SRC_FILES := ffmpeg/lib/libavutil-52.so
#include $(PREBUILT_SHARED_LIBRARY)
#include $(CLEAR_VARS)
#LOCAL_MODULE := swscale
#LOCAL_SRC_FILES := ffmpeg/lib/libswscale-2.so
#include $(PREBUILT_SHARED_LIBRARY)
#include $(CLEAR_VARS)
#LOCAL_MODULE := swresample
#LOCAL_SRC_FILES := ffmpeg/lib/libswresample-0.so
#include $(PREBUILT_SHARED_LIBRARY)
#编译共享库
#include $(CLEAR_VARS)
#LOCAL_MODULE := ffmpeg
#LOCAL_SRC_FILES := com_example_jni_FfmpegJni.c
#LOCAL_C_INCLUDES := $(LOCAL_PATH)/ffmpeg/include
#LOCAL_LDLIBS := -L$(LOCAL_PATH)/ffmpeg/lib -lavcodec-55 -lavformat-55 -lavutil-52 -lswscale-2 -lswresample-0
#include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH := $(call my-dir)
#打包第三方静态库
include $(CLEAR_VARS)
LOCAL_MODULE := avcodec
LOCAL_SRC_FILES := ffmpeg/lib/libavcodec.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avformat
LOCAL_SRC_FILES := ffmpeg/lib/libavformat.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avutil
LOCAL_SRC_FILES := ffmpeg/lib/libavutil.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avfilter
LOCAL_SRC_FILES := ffmpeg/lib/libavfilter.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := swscale
LOCAL_SRC_FILES := ffmpeg/lib/libswscale.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := swresample
LOCAL_SRC_FILES := ffmpeg/lib/libswresample.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := x264
LOCAL_SRC_FILES := ffmpeg/lib/libx264.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY)
#编译共享库
include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg
LOCAL_SRC_FILES := test.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/ffmpeg/include
#LOCAL_LDLIBS := -L$(LOCAL_PATH) -lm -lz -landroid
LOCAL_LDLIBS := -llog -lm -lc -ldl -lz -lstdc++
LOCAL_STATIC_LIBRARIES := avformat avcodec swresample swscale avutil avfilter x264
include $(BUILD_SHARED_LIBRARY)
根据自己情况修改andorid.mk 编号的动态库就可以在qtcreator上使用了。