1. 程式人生 > >Android下編譯FFmpeg(新增Androidmk)

Android下編譯FFmpeg(新增Androidmk)

下面介紹如何將ffmpeg編譯成動態庫libffmpegjni.so。

在主目錄下新建資料夾ayer/jni,將ffmpeg拷貝到jni目錄中。在ayer目錄下新建Android.mk檔案,程式為:

~/ayer/jni/Android.mk

include $(all-subdir-makefiles)

~/ayer/jni/ffmpeg/Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_WHOLE_STATIC_LIBRARIES := libavformat libavcodec libavutil libpostproc libswscale

LOCAL_MODULE := ffmpeg

include $(BUILD_SHARED_LIBRARY)

include $(call all-makefiles-under,$(LOCAL_PATH))

~/ayer/jni/ffmpeg/av.mk

# LOCAL_PATH is one of libavutil, libavcodec, libavformat, or libswscale

#include $(LOCAL_PATH)/../config-$(TARGET_ARCH).mak

include $(LOCAL_PATH)/../config.mak

OBJS :=

OBJS-yes :=

MMX-OBJS-yes :=

include $(LOCAL_PATH)/Makefile

# collect objects

OBJS-$(HAVE_MMX) += $(MMX-OBJS-yes)

OBJS += $(OBJS-yes)

FFNAME := lib$(NAME)

FFLIBS := $(foreach,NAME,$(FFLIBS),lib$(NAME))

FFCFLAGS  = -DHAVE_AV_CONFIG_H -Wno-sign-compare -Wno-switch -Wno-pointer-sign

FFCFLAGS += -DTARGET_CONFIG=\"config-$(TARGET_ARCH).h\"

ALL_S_FILES := $(wildcard $(LOCAL_PATH)/$(TARGET_ARCH)/*.S)

ALL_S_FILES := $(addprefix $(TARGET_ARCH)/, $(notdir $(ALL_S_FILES)))

ifneq ($(ALL_S_FILES),)

ALL_S_OBJS := $(patsubst %.S,%.o,$(ALL_S_FILES))

C_OBJS := $(filter-out $(ALL_S_OBJS),$(OBJS))

S_OBJS := $(filter $(ALL_S_OBJS),$(OBJS))

else

C_OBJS := $(OBJS)

S_OBJS :=

endif

C_FILES := $(patsubst %.o,%.c,$(C_OBJS))

S_FILES := $(patsubst %.o,%.S,$(S_OBJS))

FFFILES := $(sort $(S_FILES)) $(sort $(C_FILES))

~/ayer/jni/ffmpeg/libavcodec/Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

include $(LOCAL_PATH)/../av.mk

LOCAL_SRC_FILES:= $(FFFILES)

LOCAL_C_INCLUDES:= \

$(LOCAL_PATH) \

$(LOCAL_PATH)/..

LOCAL_CFLAGS += $(FFCFLAGS)

LOCAL_LDLIBS := -lz

LOCAL_STATIC_LIBRARIES := $(FFLIBS)

LOCAL_MODULE := $(FFNAME)

include $(BUILD_STATIC_LIBRARY)

~/ayer/jni/ffmpeg/libavformat/Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

include $(LOCAL_PATH)/../av.mk

LOCAL_SRC_FILES:= $(FFFILES)

LOCAL_C_INCLUDES:= \

$(LOCAL_PATH) \

$(LOCAL_PATH)/..

LOCAL_CFLAGS += $(FFCFLAGS)

LOCAL_CFLAGS += -include "string.h" -Dipv6mr_interface=ipv6mr_ifindex

LOCAL_LDLIBS := -lz

LOCAL_STATIC_LIBRARIES := $(FFLIBS)

LOCAL_MODULE := $(FFNAME)

include $(BUILD_STATIC_LIBRARY)

~/ayer/jni/ffmpeg/libavfilter/Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

include $(LOCAL_PATH)/../av.mk

LOCAL_SRC_FILES:= $(FFFILES)

LOCAL_C_INCLUDES:= \

$(LOCAL_PATH) \

$(LOCAL_PATH)/..

LOCAL_CFLAGS += $(FFCFLAGS)

LOCAL_LDLIBS := -lz

LOCAL_STATIC_LIBRARIES := $(FFLIBS)

LOCAL_MODULE := $(FFNAME)

include $(BUILD_STATIC_LIBRARY)

~/ayer/jni/ffmpeg/libavutil/Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

include $(LOCAL_PATH)/../av.mk

LOCAL_SRC_FILES:= $(FFFILES)

LOCAL_C_INCLUDES:= \

$(LOCAL_PATH) \

$(LOCAL_PATH)/..

LOCAL_CFLAGS += $(FFCFLAGS)

LOCAL_LDLIBS := -lz

LOCAL_STATIC_LIBRARIES := $(FFLIBS)

LOCAL_MODULE := $(FFNAME)

include $(BUILD_STATIC_LIBRARY)

~/ayer/jni/ffmpeg/libpostproc/Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

include $(LOCAL_PATH)/../av.mk

LOCAL_SRC_FILES:= $(FFFILES)

LOCAL_C_INCLUDES:= \

$(LOCAL_PATH) \

$(LOCAL_PATH)/..

LOCAL_CFLAGS += $(FFCFLAGS)

LOCAL_LDLIBS := -lz

LOCAL_STATIC_LIBRARIES := $(FFLIBS)

LOCAL_MODULE := $(FFNAME)

include $(BUILD_STATIC_LIBRARY)

~/ayer/jni/ffmpeg/libswscale/Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

include $(LOCAL_PATH)/../av.mk

LOCAL_SRC_FILES:= $(FFFILES)

LOCAL_C_INCLUDES:= \

$(LOCAL_PATH) \

$(LOCAL_PATH)/..

LOCAL_CFLAGS += $(FFCFLAGS)

LOCAL_LDLIBS := -lz

LOCAL_STATIC_LIBRARIES := $(FFLIBS)

LOCAL_MODULE := $(FFNAME)

include $(BUILD_STATIC_LIBRARY)

編寫配置指令碼:~/ayer/jni/ffmpeg/config.sh

意其中的NDK路徑,請修改成你係統中對應的安裝路徑

#!/bin/bash

source config_common.sh

PREBUILT=/home/huaguanglu/bysj/android-ndk-r8b/toolchains/arm-Linux-androideabi-4.4.3/prebuilt/linux-x86 

PLATFORM=/home/huaguanglu/bysj/android-ndk-r8b/platforms/android-9/arch-arm 

NDK_ROOT=/home/huaguanglu/bysj/android-ndk-r8b

./configure --target-os=linux \

--arch=arm \

--extra-cflags="-I${NDK_ROOT}/platforms/android-9/arch-arm/usr/include -fPIC -DANDROID -std=c99" \

--disable-everything \

--enable-version3 \

--enable-gpl \

--enable-nonfree \

--disable-stripping \

--disable-ffmpeg \

--disable-ffplay \

--disable-ffserver \

--disable-ffprobe \

--disable-encoders \

--disable-muxers \

--disable-devices \

--disable-protocols \

--disable-network \

--disable-avdevice \

--disable-asm \

--enable-decoder=h264 \

--enable-swscale \

--enable-cross-compile \

--cc=$PREBUILT/bin/arm-linux-androideabi-gcc \

--cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \

--strip=$PREBUILT/bin/arm-linux-androideabi-strip \

--extra-cflags="-fPIC -DANDROID" \

--extra-ldflags="-Wl,-T,$PREBUILT/arm-linux-androideabi/lib/ldscripts/armelf_linux_eabi.x -Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/crtbegin.o $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/crtend.o -lc -lm -ldl"

終端輸入命令:

chmod 755 config.sh

./config.sh

這時會在~/ayer/jni/ffmpeg目錄下生成三個檔案: config.hconfig.makconfig.log

我們需要修改config.h檔案,將其中的

#define av_restrict restrict

修改成

#define av_restrict

修改ffmpeg程式碼,以便在NDK中編譯通過

libavfilter目錄中的Makefile的末尾處多了 Clean 這個玩意兒 將其註釋掉或者刪掉。

修改~/ayer/jni/ffmpeg/libavutil/libm.h檔案,將其中的所有static方法都註釋掉

修改ffmpeg原始碼目錄中的libavcodevlibavfilterlibavformatlibavutillibpostproclibswscale中的Makefile,將Makefile中的開頭:include $(SUBDIR)../config.mak都註釋掉。

進入目錄:~/ayer

2)、執行命令:ndk-build,找到該命令的前提是你已經把NDK目錄加到了PATH系統環境變數中。

假如你沒有錯誤,恭喜你,在目錄~/ayer/libs/armeabi下會有libffmpeg.so檔案。

使用JNI連結JavaC

將上面配置好的ffmpeg複製到目錄android-ndk-r8b下。將上面生成的libffmpeg.so複製到目錄...\android-ndk-r8b\platforms\android-8\arch-arm\usr\lib下,進入目錄android-ndk-r8b\samples,新建資料夾Tiquffmpeg,在Tiquffmpeg目錄下新建資料夾jni目錄,將上面配置好的ffmpeg複製到jni目錄下。在jni目錄下新建檔案Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

PATH_TO_FFMPEG:=$(LOCAL_PATH)/ffmpeg

LOCAL_C_INCLUDES+=$(PATH_TO_FFMPEG)

LOCAL_LDLIBS:=-lffmpeg -llog

LOCAL_SRC_FILES := VideoTiqu.c

LOCAL_MODULE := ffmpegjni

include $(BUILD_SHARED_LIBRARY)

include $(all-subdir-makefiles)

jni目錄下新建檔案Application.mk

APP_PLATFORM := android-8

#APP_ABI := armeabi

APP_ABI := armeabi-v7a

APP_CFLAGS:=-DDISABLE_NEON

jni目錄下新建檔案VideoTiqu.c,寫上jni程式,終端到jni目錄下,輸入ndk-build,就會在目錄android-ndk-r8b\samples\Tiquffmpeg\libs\armeabi-v7a下生成libffmpegjni.so動態庫檔案。

VideoTiqu.c的程式為:
  1. #include <string.h>
  2. #include <jni.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <android/log.h>
  6. #include <ffmpeg/libavcodec/avcodec.h>
  7. struct AVFormatContext *pFormatCtx;  
  8. int             i, videoStream;  
  9. struct AVCodecContext  *pAVCodecCtx;  
  10. struct AVCodec         *pAVCodec;  
  11. struct AVPacket        mAVPacket;  
  12. struct AVFrame         *pAVFrame;   
  13. struct AVFrame         *pAVFrameYUV;  
  14. struct SwsContext      *pImageConvertCtx ;  
  15. int iWidth=0;  
  16. int iHeight=0;  
  17. int *colortab=NULL;  
  18. int *u_b_tab=NULL;  
  19. int *u_g_tab=NULL;  
  20. int *v_g_tab=NULL;  
  21. int *v_r_tab=NULL;  
  22. //short *tmp_pic=NULL;
  23. unsigned int *rgb_2_pix=NULL;  
  24. unsigned int *r_2_pix=NULL;  
  25. unsigned int *g_2_pix=NULL;  
  26. unsigned int *b_2_pix=NULL;  
  27. #define LOG_TAG "VideoTiqu.c"
  28. #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
  29. void DeleteYUVTab()  
  30. {  
  31. //  av_free(tmp_pic);
  32.     av_free(colortab);  
  33.     av_free(rgb_2_pix);  
  34. }  
  35. void CreateYUVTab_16()  
  36. {  
  37.     int i;  
  38.     int u, v;  
  39. //  tmp_pic = (short*)av_malloc(iWidth*iHeight*2); 
  40.     colortab = (int *)av_malloc(4*256*sizeof(int));  
  41.     u_b_tab = &colortab[0*256];  
  42.     u_g_tab = &colortab[1*256];  
  43.     v_g_tab = &colortab[2*256];  
  44.     v_r_tab = &colortab[3*256];  
  45.     for (i=0; i<256; i++)  
  46.     {  
  47.         u = v = (i-128);  
  48.         u_b_tab[i] = (int) ( 1.772 * u);  
  49.         u_g_tab[i] = (int) ( 0.34414 * u);  
  50.         v_g_tab[i] = (int) ( 0.71414 * v);   
  51.         v_r_tab[i] = (int) ( 1.402 * v);  
  52.     }  
  53.     rgb_2_pix = (unsigned int *)av_malloc(3*768*sizeof(unsigned int));  
  54.     r_2_pix = &rgb_2_pix[0*768];  
  55.     g_2_pix = &rgb_2_pix[1*768];  
  56.     b_2_pix = &rgb_2_pix[2*768];  
  57.     for(i=0; i<256; i++)  
  58.     {  
  59. 相關推薦

    Android編譯FFmpeg新增Androidmk

    下面介紹如何將ffmpeg編譯成動態庫libffmpegjni.so。 在主目錄下新建資料夾ayer/jni,將ffmpeg拷貝到jni目錄中。在ayer目錄下新建Android.mk檔案,程式為: ~/ayer/jni/Android.mk include 

    android settings介面修改新增

    android版本:4.2.2 參考部落格:http://blog.csdn.net/way_ping_li/article/details/18076001 相比之下程式碼有些不同,記錄下來一是留給自己以後查閱,二是希望對想我這樣初學者有所幫助,僅此而已。 /* * C

    Android 用NDK編譯FFmpeg生成Android.mk可以放在原始碼框架內編譯

    mkdir jni && cd jni wget http://ffmpeg.org/releases/ffmpeg-0.6.tar.bz2 tar xf ffmpeg-0.6.tar.bz2 && mv ffmpeg-0.6 ffmpeg && cd

    android拉列表spinner

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_

    Windows編譯Yolov3CUDA9.1+cudnn7.0+OpenCV 3.1.0

    按照官網給出CUDA9.1+cudnn7.0+OpenCV 3.1.0的版本安裝 1 安裝CUDA 9.1 預設位置安裝後發現環境變數自動加入了path   2 安裝cudnn 7.0.5 for cuda 9.1 下載地址:https://dev

    如何加速Linux編譯速度加速make

    專案越來越大,每次需要重新編譯整個專案都是一件很浪費時間的事情。Research了一下,找到以下可以幫助提高速度的方法,總結一下。 tmpfs 有人說在Windows下用了RAMDisk把一個專案編譯時間從4.5小時減少到了5分鐘,也許這個數字是有點誇張了,不過粗想想,把檔案放

    ubuntudlib編譯C++共享庫及使用,即cmake編譯dlib開原始檔的步驟和檔案結構,

    一、cmake的工作機制         使用CMake很簡單。 構建過程是通過建立一個或多個CMakeLists檔案(實際上是CMakeLists.txt,但本指南將在大多數情況下脫離擴充套件)控制在專案的每個目錄中。

    android開發-Windows環境編譯FFMPEG原始碼

    1.簡介 之前有兩篇文章講到如何在windowsPC端使用FFMPEG命令列程式。 但是我想要在android開發時使用FFMPEG的功能又該怎麼辦?所以就需要編譯FFMPEG,然後才能使用。這才有了這篇文章。 1.先講思路,2.後講具體流程! 但是首先有個問題就是我

    windows10編譯ffmpeg for android

    本文記錄在windows10下編譯ffmpeg的過程: 環境:win10  ffmpeg-3.3 ndk-r14b 注意:一般來說低版本ndk編譯的能在高版本使用,但高版本ndk編譯的無法在低版本使用,因為NDK平臺不是後向相容的,而是前向相容的,因此請根據實際情況選擇

    linux【ubuntu 14.04】的【caffe】編譯安裝CPU 配置

    原文地址:https://www.zybuluo.com/hanxiaoyang/note/364737 特別鳴謝:七月線上 - 專注資料領域的線上教育:https://www.julyedu.com (有部分修正) caffe 是深度學習在影象領域廣泛使用的框架,其 mo

    Fedora DirectFB 開發手記 編譯 webkit 未完

    升級開發環境yum install xinetd telnet-server samba samba-common samba-client make gcc tftp-server patch gettext libtool gcc-c++ nfs-utils autoco

    音視訊入門iOS編譯ffmpeg的configure配置

    本篇文章接之前的x264編譯configure選項,寫一下ffmpeg的configure選項。 ffmpeg的arm64架構configure選項 ./configure \ --disable-everything \ //首先關閉所有configure選項,保證編譯的時候不

    intellij 編譯單個沒有main函式的java檔案

    圖中這個按鈕可以實現對單個沒有main函式的java檔案進行編譯 這個問題真是大寫的草泥馬,之前google了無數文章,也許是覺悟太低,就是沒有找到問題解決方法,在今天偶的看到一篇叫 的文章後才無意間解決了這個問題,踏破鐵鞋無覓處,得來全不費功夫啊啊啊啊!!

    Android-拉重新整理-RefreshLayout

    時間推移,記得以前寫過關於下拉重新整理的部落格文章 現在回看程式碼,發現這種構建方式存在很大問題,當我專案中期突然需要一個ListView的帶有下拉重新整理功能,這時候,如果用以前的方式,就是用自定義的的RefreshListView去代替原生的ListV

    Android-->反編譯初探mac環境配置

    2.將csdn.apk的字尾名改為zip,然後解壓,將目錄中classes.dex拷貝前面已下載的反編譯工具中的dex2jar資料夾中。在terminal中切換到dex2jar目錄下,輸入:./d2j-dex2jar.sh classes.dex。完成後會在當前目錄生成classes-dex2jar.jar檔

    android apk編譯過程1

    aapt:andorid 資源打包工具(android asset packaging tool),工具在目錄${ANDROID_SDK_HOME}/platform-tools/appt下; aidl:android介面描述語言轉換為.java檔案的工具(android Interface definit

    Android編譯工具apktool ,dex2jar,jd-gui.exe使用詳解

    Apktool 用法 1.下載Apktool 工具(包含aapt.exe & apktool.bat & apktool.jar)。如下圖 2.將準備進行反編譯的apk 放到 apktool.bat 檔案所在路勁。 3.在cm

    win7_32編譯FFmpeg

    報錯 位置 沒有 mda 不同 path ret 知識庫 oca 運行環境: VC2010軟件; [附:本文所用軟件安裝包:http://download.csdn.NET/detail/sinat_36666600/9705438]

    搭建JEESZ分布式架構3--CentOs安裝MySQL環境準備

    spring mvc+my batis dubbo+zookeerper kafka restful redis分布式緩存 聲明:因為運行環境是基於Linux系統的,在做此框架之前需要做一些前期的環境準備工作CentOs下安裝MySQL網上很多實例,因為博客後期作為框架的原生教程,故這邊做詳細

    Mac安裝MySQL含配置

    .tar.gz 界面 take 8.4 通過 -1 pass 查看 pack 首先需要下載 MySQL Community Server 下載地址:https://dev.mysql.com/downloads/mysql/ 進入MySQL的下載界面(https: