2019独角兽企业重金招聘Python工程师标准>>>

这里记录一下ffmpeg的编译过程并且在Andorid中使用的过程。

编译ffmpeg

这里拿的当前日期最新的release版本ffmpeg4.0.2,编译环境mac,下载mac版本的ffmepg后进行编译,编译脚本build.sh如下:


#!/bin/bash
export NDK=/Users/linchen/Library/Android/sdk/ndk-bundle
export SYSROOT=$NDK/platforms/android-19/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
export CPU=arm
export PREFIX=/Users/linchen/Desktop/arm #最终编译后的头文件以及so包的位置
export ADDI_CFLAGS="-marm"
function build_one
{
./configure \--prefix=$PREFIX \--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \--arch=arm \--sysroot=$SYSROOT \--extra-cflags="-Os -fpic $ADDI_CFLAGS" \--extra-ldflags="$ADDI_LDFLAGS" \--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \--enable-shared \--enable-runtime-cpudetect \--enable-gpl \--enable-small \--target-os=android \--enable-cross-compile \--disable-debug \--disable-static \--disable-doc \--disable-asm \--disable-ffmpeg \--disable-ffplay \--disable-ffprobe \--enable-postproc \--enable-avdevice \--disable-symver \--disable-stripping \
$ADDITIONAL_CONFIGURE_FLAG
sed -i '' 's/HAVE_LRINT 0/HAVE_LRINT 1/g' config.h
sed -i '' 's/HAVE_LRINTF 0/HAVE_LRINTF 1/g' config.h
sed -i '' 's/HAVE_ROUND 0/HAVE_ROUND 1/g' config.h
sed -i '' 's/HAVE_ROUNDF 0/HAVE_ROUNDF 1/g' config.h
sed -i '' 's/HAVE_TRUNC 0/HAVE_TRUNC 1/g' config.h
sed -i '' 's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g' config.h
sed -i '' 's/HAVE_CBRT 0/HAVE_CBRT 1/g' config.h
sed -i '' 's/HAVE_RINT 0/HAVE_RINT 1/g' config.h
make clean
# 这里是定义用几个CPU编译
make -j4
make install
}
build_one

build.sh在ffmpeg4.0.2的根目录下,首先需要安装一些需要的编译环境如gcc等,由于我的机子中以前已经安装了,所以直接运行bash build.sh命令就可以了,编译后在我的桌面上会出现arm文件夹:

其中include文件夹是导出的头文件文件夹,lib中的so包是需要使用的,接下来新建一个支持c++的Android项目,在新建的时候选择support c++,Android Studio会自动帮我们配置好,接下添加编译好的文件到Android Studio中:

由于我的手机是arm64-v8a的cpu架构,又由于编译ffmpeg选择的架构,所以这里使用armeabi通用架构支持,因此文件夹就创建了armeabi,如果手机cpu架构不同,可以再编译ffmpeg的时候指定对应的架构,具体参考这篇文章。

接下来编写一下Cmake代码:

cmake_minimum_required(VERSION 3.4.1)add_library( # Sets the name of the library.native-lib# Sets the library as a shared library.SHARED# Provides a relative path to your source file(s).src/main/cpp/native-lib.cpp)find_library( # Sets the name of the path variable.log-lib# Specifies the name of the NDK library that# you want CMake to locate.log)set(distribution_DIR ${CMAKE_SOURCE_DIR}/src/main/jni/armeabi)
add_library( avutilSHAREDIMPORTED )
set_target_properties( avutilPROPERTIES IMPORTED_LOCATION${distribution_DIR}/libavutil.so)
add_library( swresampleSHAREDIMPORTED )
set_target_properties( swresamplePROPERTIES IMPORTED_LOCATION${distribution_DIR}/libswresample.so)
add_library( avcodecSHAREDIMPORTED )
set_target_properties( avcodecPROPERTIES IMPORTED_LOCATION${distribution_DIR}/libavcodec.so)
add_library( avfilterSHAREDIMPORTED )
set_target_properties( avfilterPROPERTIES IMPORTED_LOCATION${distribution_DIR}/libavfilter.so)
add_library( swscaleSHAREDIMPORTED )
set_target_properties( swscalePROPERTIES IMPORTED_LOCATION${distribution_DIR}/libswscale.so)
add_library( avdeviceSHAREDIMPORTED )
set_target_properties( avdevicePROPERTIES IMPORTED_LOCATION${distribution_DIR}/libavdevice.so)
add_library( avformatSHAREDIMPORTED )
set_target_properties( avformatPROPERTIES IMPORTED_LOCATION${distribution_DIR}/libavformat.so)
add_library( postprocSHAREDIMPORTED )
set_target_properties( postprocPROPERTIES IMPORTED_LOCATION${distribution_DIR}/libpostproc.so)
set(CMAKE_VERBOSE_MAKEFILE on)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
include_directories(src/main/cpp)
include_directories(src/main/jni/include)target_link_libraries( # Specifies the target library.native-libavutil       #工具库(大部分需要)swresample    #音频采样数据格式转换avcodec      #编解码(重要)avfilter      #滤镜特效处理swscale       #视频像素数据格式转换avdevice     #各种设备的输入输出avformat     #封装格式处理postproc     #后加工# Links the target library to the log library# included in the NDK.${log-lib})

然后再MainActivity中使用so库:

public class MainActivity extends AppCompatActivity {// Used to load the 'native-lib' library on application startup.static {//加载so包是有序的一定要那么写,不过这里我是复制过来的,所以没出现问题System.loadLibrary("avutil");System.loadLibrary("swresample");System.loadLibrary("avcodec");System.loadLibrary("avfilter");System.loadLibrary("swscale");System.loadLibrary("avdevice");System.loadLibrary("avformat");System.loadLibrary("postproc");System.loadLibrary("native-lib");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// Example of a call to a native methodTextView tv = (TextView) findViewById(R.id.sample_text);tv.setText(stringFromJNI());}/*** A native method that is implemented by the 'native-lib' native library,* which is packaged with this application.*/public native String stringFromJNI();
}

这里编译过程中遇到一个问题:

Build command failed. Error while executing process /Users/linchen/Library/Android/sdk/cmake/3.6.4111459/bin/cmake with arguments {--

...

../../../../src/main/jni/armeabi/libavutil.so: error adding symbols: File in wrong format clang++: error: linker command failed with exit code 1 (use -v to see invocation) ninja: build stopped: subcommand failed.

问题是jni文件夹下的架构包缺失,使用ndk abi过滤器过滤即可:


ndk {abiFilters 'armeabi'}

编译完成后运行项目发现直接奔溃了,说ffmpeg的so包找不到,解压apk一看还真是,最终发现设置sourceSets的路径不对,修改如下:

sourceSets{main{jniLibs.srcDirs = ['src/main/jni']}}

最终编译成功,项目正常启动,不过还没写代码验证,这里主要先记录一下配置的过程。

项目地址如下:

https://github.com/JerryChan123/FFmpegDemo

参考资料

https://www.jianshu.com/p/da64059799d5

https://www.jianshu.com/p/3b58174e89f1

转载于:https://my.oschina.net/u/3863980/blog/2253455

android ffmpeg4.0.2编译过程记录相关推荐

  1. win10--vs2015--libjpeg--64位库的编译过程记录

    win10--vs2015--libjpeg--64位库的编译过程记录 1. 下载源代码:   http://libjpeg.sourceforge.net/    或者  http://www.ij ...

  2. Android 笔记 android 7.0 单独编译framwork不生效的解决

    android 7.0 单独编译framwork不生效 以前android 5.0系统单独编译时,只需要将out/target/product/sim6737t_66_m_n/system/frame ...

  3. ubuntu 12.04 NDK + android 4.0.3_r1 编译libffmpeg.so

    环境:ubuntu 12.04 .android-ndk-r8d . android 4.0.3_r1 编译libffmpeg.so .找了很多开源项目,,终于有一个可以编译通过了,RockPlaye ...

  4. Android 8.0 系统编译解决卡在Ensuring Jack server is installed and started

    参考: https://www.cnblogs.com/zzb-Dream-90Time/p/9273844.html 这个解决方法是比较全的,但是我所有操作都做了,依然无法正常编译 解决这个问题花了 ...

  5. Nuttx编译过程记录

    Nuttx开发 1开发环境 该系统需要在linux环境下开发, 本人在VMware Workstation虚拟机中安装centos 6.6作为开发环境: 一下开发均在centos6中开发.编译. 2安 ...

  6. Ubuntu 10.04 内核2.6.34编译过程记录

    1.安装编译环境 $sudo  apt-get install build-essential kernel-package   libncurses5-dev 2.下载内核源代码 访问 http:/ ...

  7. android 8.0如何编译,ubuntu16.0编译Android 8.0 Android O记录

    一.必要的系统环境 硬盘200G,内存4G+,交换分区(swap)4G+(可装完系统后添加,见后面错误处理部分) 二.下载源码,国内可以在清华镜像站下载 网上有很多教程,这里就不再累述了 三.然后安装 ...

  8. Android 6.0 源代码编译实践

    前阵子去上海参加 Android 开发面试,被问及了 Android 的基本原理.常用组件背后的实现机制.设计模式等问题,我都回答地不好.面试时,老司机们常常问我对知识点"背后的实现代码有没 ...

  9. 高通android 7.0彩信发送过程中使用到的google pdu

    对于彩信与数据库的交互操作,google并没有将这部分代码放在Mms中,而是放在framework中的pdu部分. 具体代码路径是在:opt\telephony\src\java\com\google ...

  10. android 5.0 下载编译

    CM的CM-12.0版本(对应Android5.0.2): $ repo init -u https://github.com/CyanogenMod/android.git -b cm-12.0 注 ...

最新文章

  1. 这25张图,彻底看懂25个复杂的数学公式!
  2. ORACLE-osi分层模型.md
  3. mysql 读写分离中间层
  4. 俄罗斯方块游戏笔记(一)——砖块样式配置窗体
  5. Apache+php+tomcat+mysqlon linxu
  6. shell文本处理工具grep
  7. Linux常用最基础命令总结
  8. HDU1878 欧拉回路【并查集】
  9. python网络通信基础-udp+NetAssist(网络调试助手)
  10. 自然语言处理(NLP)语义分析:“词汇级”语义分析【词义消歧、词义表示和学习】、“句子级”语义分析【浅层语义分析(语义角色标注)、深层语义分析】
  11. 单片机跑马灯程序c语言,用单片机编写几种跑马灯程序
  12. 初识Ozone和Segger J-Link Trace Pro
  13. crmeb重新安装_CRMEB
  14. day 26 学习Linux-01天
  15. 64位计算机很慢,Win7旗舰版64位系统电脑关机慢怎么办?
  16. logout 注销登录
  17. 【每日随笔】操控人性 ① ( 圣人的治理原则 | 控制人性的三大手段 - 引导 / 转移注意力 / 打击异己 | 作出正确的引导 | 不尚贤,使民不争 | 不追求权利 / 财富 )
  18. MNIST是什么鬼?
  19. 2020就业形势报告:计算机相关行业仍是最热,人工智能聚集北上广深
  20. 英荷两国政府向微软付费以延伸XP撑持协议

热门文章

  1. 常见排序算法整理2(C++实现)
  2. pandas填充缺失值
  3. pwm 正弦波_增强型PWM抑制功能对于直列式电机控制的五大优势
  4. html显示实时时间_珠海体育场LED显示屏实时播放比赛时间
  5. 2019年 AI 顶会速递
  6. 架构高并发方案_架构 - 抖音微博等短视频千万级高可用、高并发架构设计
  7. .php对收录有影响吗,你知道吗?网站收录其实对网站排名影响并不大
  8. MemCached存储原理
  9. 批处理计算n天前\后的日期
  10. 斐波那契数列基本性质