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.h,config.mak,config.log。
我們需要修改config.h檔案,將其中的
#define av_restrict restrict
修改成
#define av_restrict
修改ffmpeg程式碼,以便在NDK中編譯通過
在libavfilter目錄中的Makefile的末尾處多了 Clean 這個玩意兒 將其註釋掉或者刪掉。
修改~/ayer/jni/ffmpeg/libavutil/libm.h檔案,將其中的所有static方法都註釋掉
修改ffmpeg原始碼目錄中的libavcodev,libavfilter,libavformat,libavutil,libpostproc,libswscale中的Makefile,將Makefile中的開頭:include $(SUBDIR)../config.mak都註釋掉。
進入目錄:~/ayer
(2)、執行命令:ndk-build,找到該命令的前提是你已經把NDK目錄加到了PATH系統環境變數中。
假如你沒有錯誤,恭喜你,在目錄~/ayer/libs/armeabi下會有libffmpeg.so檔案。
使用JNI連結Java與C。
將上面配置好的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的程式為:- #include <string.h>
- #include <jni.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <android/log.h>
- #include <ffmpeg/libavcodec/avcodec.h>
- struct AVFormatContext *pFormatCtx;
- int i, videoStream;
- struct AVCodecContext *pAVCodecCtx;
- struct AVCodec *pAVCodec;
- struct AVPacket mAVPacket;
- struct AVFrame *pAVFrame;
- struct AVFrame *pAVFrameYUV;
- struct SwsContext *pImageConvertCtx ;
- int iWidth=0;
- int iHeight=0;
- int *colortab=NULL;
- int *u_b_tab=NULL;
- int *u_g_tab=NULL;
- int *v_g_tab=NULL;
- int *v_r_tab=NULL;
- //short *tmp_pic=NULL;
- unsigned int *rgb_2_pix=NULL;
- unsigned int *r_2_pix=NULL;
- unsigned int *g_2_pix=NULL;
- unsigned int *b_2_pix=NULL;
- #define LOG_TAG "VideoTiqu.c"
- #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
- void DeleteYUVTab()
- {
- // av_free(tmp_pic);
- av_free(colortab);
- av_free(rgb_2_pix);
- }
- void CreateYUVTab_16()
- {
- int i;
- int u, v;
- // tmp_pic = (short*)av_malloc(iWidth*iHeight*2);
- colortab = (int *)av_malloc(4*256*sizeof(int));
- u_b_tab = &colortab[0*256];
- u_g_tab = &colortab[1*256];
- v_g_tab = &colortab[2*256];
- v_r_tab = &colortab[3*256];
- for (i=0; i<256; i++)
- {
- u = v = (i-128);
- u_b_tab[i] = (int) ( 1.772 * u);
- u_g_tab[i] = (int) ( 0.34414 * u);
- v_g_tab[i] = (int) ( 0.71414 * v);
- v_r_tab[i] = (int) ( 1.402 * v);
- }
- rgb_2_pix = (unsigned int *)av_malloc(3*768*sizeof(unsigned int));
- r_2_pix = &rgb_2_pix[0*768];
- g_2_pix = &rgb_2_pix[1*768];
- b_2_pix = &rgb_2_pix[2*768];
- for(i=0; i<256; i++)
- {
-
相關推薦
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下編譯Yolov3(CUDA9.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分鐘,也許這個數字是有點誇張了,不過粗想想,把檔案放
ubuntu下dlib編譯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: