# andorid_ffmpeg_so_play **Repository Path**: young16a/andorid_ffmpeg_so_play ## Basic Information - **Project Name**: andorid_ffmpeg_so_play - **Description**: 编译ffmpeg动态库so文件,然后安卓中调用播放视频 - **Primary Language**: Java - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-07-17 - **Last Updated**: 2024-09-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 1、首先编译出ffmpeg的动态库so文件 > 1)先修改configure文件中so文件命名格式,如下 > > ``` > # SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)' > # LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"' > # SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)' > # SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)' > # 替换成如下 > SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)' > LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"' > SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)' > SLIB_INSTALL_LINKS='$(SLIBNAME)' > ``` > > 2)编写build.sh,文件来生成动态库,文件内容如下 > > ```shell > NDK=/home/ubuntu2204/Android/Sdk/ndk/21.3.6528147 > ARCH=x64 > CPU=x64 > PREFIX=$(pwd)/android/$ARCH/$CPU > ADDI_CFLAGS="-marm -mno-stackrealign" > TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9 > ANDROID_TOOLCHAINS_PATH=$NDK/toolchains/llvm/prebuilt/linux-x86_64 > CROSS_PREFIX=$ANDROID_TOOLCHAINS_PATH/bin/x86_64-linux-android- > SYSROOT=$ANDROID_TOOLCHAINS_PATH/sysroot > #用CC变量和CXX变量指定Cmake使用的编译器 > #没有export,就相当于脚本的临时变量 > #加了export,就变成了当前会话的环境变量 > export CC=$ANDROID_TOOLCHAINS_PATH/bin/x86_64-linux-android21-clang > export CXX=$ANDROID_TOOLCHAINS_PATH/bin/x86_64-linux-android21-clang++ > #执行 .configure文件 > ./configure --prefix=$PREFIX \ > --enable-gpl \ > --disable-static \ > --enable-shared \ > --enable-small \ > --disable-programs \ > --disable-ffmpeg \ > --disable-ffplay \ > --disable-ffprobe \ > --disable-doc \ > --arch=$ARCH \ > --cpu=$CPU \ > --cross-prefix=$CROSS_PREFIX \ > --enable-cross-compile \ > --sysroot=$SYSROOT \ > --target-os=linux \ > --extra-cflags="-Os -fpic $ADDI_CFLAGS" \ > --extra-ldflags="$ADDI_LDFLAGS" \ > --cc=$CC \ > --cxx=$CXX \ > --disable-x86asm \ > #运行 Makefile > make clean > make > make install > ``` > > 3)将生成的so库文件和头文件都拿出来,拿到android中使用; 2、在AS中新建一个项目,然后在main文件夹下新建一个“myLibs”目录放动态库和头文件,如下图所示: ![image](https://partner-gitlab.mioffice.cn/nj-trainingcollege/miclassroom240706/cppgroup1/yugang/day11/-/raw/master/images/day11_03_01.png?inline=false) 3、修改CMakeLists.txt将动态链接库链接起来,这样就能调用ffmpeg的方法了,CMakeLists.txt内容如下: ```shell cmake_minimum_required(VERSION 3.22.1) project("ffmpegcpp") #yg 引入库的头文件 INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/myLibs/include) #yg 引入so库 add_library( avcodec-58 SHARED IMPORTED) #TODO 设置编译的库文件存放的目录 set_target_properties( avcodec-58 PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/myLibs/${ANDROID_ABI}/libavcodec-58.so) add_library( avdevice-58 SHARED IMPORTED) set_target_properties( avdevice-58 PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/myLibs/${ANDROID_ABI}/libavdevice-58.so) add_library( avfilter-7 SHARED IMPORTED) set_target_properties( avfilter-7 PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/myLibs/${ANDROID_ABI}/libavfilter-7.so) add_library( avformat-58 SHARED IMPORTED) set_target_properties( avformat-58 PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/myLibs/${ANDROID_ABI}/libavformat-58.so) add_library( avutil-56 SHARED IMPORTED) set_target_properties( avutil-56 PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/myLibs/${ANDROID_ABI}/libavutil-56.so) add_library( postproc-55 SHARED IMPORTED) set_target_properties( postproc-55 PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/myLibs/${ANDROID_ABI}/libpostproc-55.so) add_library( swresample-3 SHARED IMPORTED) set_target_properties( swresample-3 PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/myLibs/${ANDROID_ABI}/libswresample-3.so) add_library( swscale-5 SHARED IMPORTED) set_target_properties( swscale-5 PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/myLibs/${ANDROID_ABI}/libswscale-5.so) add_library(${CMAKE_PROJECT_NAME} SHARED # List C/C++ source files with relative paths to this CMakeLists.txt. cpp/native-lib.cpp) target_link_libraries(${CMAKE_PROJECT_NAME} # List libraries link to the target library avcodec-58 avdevice-58 avfilter-7 avformat-58 avutil-56 postproc-55 swresample-3 swscale-5 android log) ``` 4、修改build.gradle文件,让其能够定位到这个库,在`defaultConfig`下加入以下内容(名字与so所在文件夹对应): ```cmake ndk{ abiFilters "x86_64" } ``` 我这里还修改了CMakeLists.txt文件的位置,所以在build.gradle中也要修改一下; 5、在cpp下的native-lib.cpp中调用库函数,首先导入所用头文件: ```C++ extern "C" { #include #include #include #include #include #include #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" }; ``` 6、然后先调用avcodec_configuration()这个方法测试库有没有成功链接,成功打印在控制台,表明通了,接下来编写主要代码播放视频; 7、首先编写布局文件,如下: ```xml