Ubuntu下使用as搭建最新ffmpeg3.2.2

前端之家收集整理的这篇文章主要介绍了Ubuntu下使用as搭建最新ffmpeg3.2.2前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Ubuntu下使用as搭建最新ffmpeg3.2.2

编译ffmpeg踩了不少坑,写下来记录一下,以后用。使用到的环境和工具如下:

  1. Android Studio 2.2.2
  2. Ubuntu 16.04环境下
  3. ffmpeg3.2.2

1,下载ffmpeg3.2.2

直接去http://ffmpeg.org/下载,然后解压后进入ffmpeg根目录,修改configure文件,将:

  1. SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
  2. LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
  3. SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
  4. SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'

改成:
  1. SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
  2. LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
  3. SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
  4. SLIB_INSTALL_LINKS='$(SLIBNAME)'

然后编写一个build.sh脚本,网上很多,我这里一个抄的:

  1. #!/bin/bash
  2. NDK=/home/huimingli/Downloads/android-sdk-linux/ndk-bundle
  3. SYSROOT=$NDK/platforms/android-24/arch-arm
  4. TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
  5. function build_one
  6. {
  7. ./configure \
  8. --prefix=$PREFIX \
  9. --enable-shared \
  10. --disable-static \
  11. --disable-doc \
  12. --disable-ffmpeg \
  13. --disable-ffplay \
  14. --disable-ffprobe \
  15. --disable-ffserver \
  16. --disable-avdevice \
  17. --disable-doc \
  18. --disable-symver \
  19. --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
  20. --target-os=linux \
  21. --arch=arm \
  22. --enable-cross-compile \
  23. --sysroot=$SYSROOT \
  24. --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
  25. --extra-ldflags="$ADDI_LDFLAGS" \
  26. $ADDITIONAL_CONFIGURE_FLAG
  27. make clean
  28. make
  29. make install
  30. }
  31. cpu=arm
  32. PREFIX=/home/huimingli/Desktop/f
  33. ADDI_CFLAGS="-marm"
  34. build_one

前面的一些内容根据自己的机器修改一下即可:然后ctrl+alt+t,弹出terminal,输入sudo ./build.sh,跑起来,一会后在脚本中的PREFIX,你输入的目录中出现include,和lib文件夹。等会用。

2,新建工程

1,在as下file->new->new project,输入工程名FFmpegTest,不要勾选include C++support,然后一路next,最后finish即可。

2,在gradle.properties中添加android.useDeprecatedNdk= true,否则会因为没有ndk支持导致报错。local.properties中配置sdk.dir,ndk.dir

3,在main目录下新建jni文件

4,在app下的build.gradle中的android中添加代码如下:

sourceSets {
main {
jni.srcDirs = [] //防止as重build c/C++文件,非常重要
jniLibs.srcDir 'src/main/libs' //找到so文件
}
}

android中的defaultconfig中添加

  1. ndk {
  2. moduleName "helloworld"
  3. ldLibs "log","z","m"
  4. abiFilters "armeabi","armeabi-v7a"
  5. }


然后新工程建立完毕。然后将前面生成的include中的所有文件,以及lib中所有的so文件复制粘贴到jni目录。然后在jni目录下创建两个文件,Android.mk,和Application.mk.

Android.mk代码如下:

  1. LOCAL_PATH := $(call my-dir)
  2.  
  3. # FFmpeg library
  4. include $(CLEAR_VARS)
  5. LOCAL_MODULE := avcodec
  6. LOCAL_SRC_FILES := libavcodec.so
  7. include $(PREBUILT_SHARED_LIBRARY)
  8.  
  9. include $(CLEAR_VARS)
  10. LOCAL_MODULE := avfilter
  11. LOCAL_SRC_FILES := libavfilter.so
  12. include $(PREBUILT_SHARED_LIBRARY)
  13.  
  14. include $(CLEAR_VARS)
  15. LOCAL_MODULE := avformat
  16. LOCAL_SRC_FILES := libavformat.so
  17. include $(PREBUILT_SHARED_LIBRARY)
  18.  
  19. include $(CLEAR_VARS)
  20. LOCAL_MODULE := avutil
  21. LOCAL_SRC_FILES := libavutil.so
  22. include $(PREBUILT_SHARED_LIBRARY)
  23.  
  24. include $(CLEAR_VARS)
  25. LOCAL_MODULE := swresample
  26. LOCAL_SRC_FILES := libswresample.so
  27. include $(PREBUILT_SHARED_LIBRARY)
  28.  
  29. include $(CLEAR_VARS)
  30. LOCAL_MODULE := swscale
  31. LOCAL_SRC_FILES := libswscale.so
  32. include $(PREBUILT_SHARED_LIBRARY)
  33.  
  34. # Program
  35. include $(CLEAR_VARS)
  36. LOCAL_MODULE := helloworld
  37. LOCAL_SRC_FILES := helloworld.c
  38. LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
  39. LOCAL_LDLIBS := -llog -lz
  40. LOCAL_SHARED_LIBRARIES := avcodec avdevice avfilter avformat avutil postproc swresample swscale
  41. include $(BUILD_SHARED_LIBRARY)
Application.mk代码如下:
  1. #APP_ABI := all
  2. #APP_ABI := armeabi armeabi-v7a x86
  3.  
  4. APP_ABI :=armeabi-v7a

然后开始修改MainActivity了,编写布局文件代码如下:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:id="@+id/activity_main"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:paddingBottom="@dimen/activity_vertical_margin"
  8. android:paddingLeft="@dimen/activity_horizontal_margin"
  9. android:paddingRight="@dimen/activity_horizontal_margin"
  10. android:paddingTop="@dimen/activity_vertical_margin"
  11. tools:context="com.android.camera.myapplication.MainActivity">
  12. <ScrollView
  13. android:layout_width="match_parent"
  14. android:layout_height="match_parent">
  15. <TextView
  16. android:id="@+id/txt"
  17. android:scrollbarStyle="insideInset"
  18. android:layout_width="match_parent"
  19. android:layout_height="match_parent"
  20. android:text="Hello World!" />
  21. </ScrollView>
  22.  
  23. </RelativeLayout>

MainActivity代码如下:
  1. public class MainActivity extends Activity {
  2.  
  3. static {
  4. System.loadLibrary("helloworld");
  5. System.loadLibrary("avcodec");
  6. System.loadLibrary("avfilter");
  7. System.loadLibrary("avformat");
  8. System.loadLibrary("avutil");
  9. System.loadLibrary("swresample");
  10. System.loadLibrary("swscale");
  11. }
  12.  
  13. public native String avcodecinfo();
  14.  
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_main);
  19. ((TextView)findViewById(R.id.txt)).setText(avcodecinfo());
  20. }
  21. }

然后就build->make project,构建工程,生成class,接着要生成文件了,在工程目录下打开terminal,输入javah -classpath /home/huimingli/Downloads/android-sdk-linux/platforms/android-24/android.jar:./app/build/intermediates/classes/debug com.xxx.xxx.MainActivity,这里有个坑,linux环境下中间是:而不是;

生成的头文件放到jni目录下,再创建helloworld.c文件代码如下

  1. #include <stdio.h>
  2. #include <jni.h>
  3. #include "com_android_camera_ffmpegtest_MainActivity"
  4. #include "libavcodec/avcodec.h"
  5. #include "libavformat/avformat.h"
  6. #include "libavfilter/avfilter.h"
  7. #include "libavutil/avutil.h"
  8.  
  9. //Log
  10. #ifdef ANDROID
  11. #include <jni.h>
  12. #include <android/log.h>
  13. #define LOGE(format,...) __android_log_print(ANDROID_LOG_ERROR,"(>_<)",format,##__VA_ARGS__)
  14. #else
  15. #define LOGE(format,...) printf("(>_<) " format "\n",##__VA_ARGS__)
  16. #endif
  17.  
  18. JNIEXPORT jstring JNICALL Java_com_android_camera_ffmpegtest_MainActivity_avcodecinfo
  19. (JNIEnv *env,jobject obj){
  20. char info[10000] = { 0 };
  21.  
  22. sprintf(info,"%s\n",avcodec_configuration(),avcodec_license());
  23. return (*env)->NewStringUTF(env,info);
  24. }
打开terminal,跳转到app/src/main目录下,执行ndk-build,不报错就成功了,会发现多出两个文件夹libs和obj。然后就完成了,run一个。


显示上面的内容说明成功搭建成功了,欢迎进入ffmpeg的世界!另外每次修改代码都要ndk-build一下很麻烦,可以在app下的build.gradle中添加任务:

  1. task ndkBuild(type: Exec) {
  2. commandLine 'ndk-build','-C',file('src/main/jni').absolutePath
  3. }
  4.  
  5. tasks.withType(JavaCompile) {
  6. compileTask -> compileTask.dependsOn ndkBuild
  7. }
它就会run之前自己跑一个ndk-build了,修改代码直接run一个。

猜你在找的Ubuntu相关文章