【版本】
ffmpeg 1.2.6, android ndk r8b,cygwin
【windows下編譯】
這個比想象中的簡單,用MinGW編譯,然後在VS裡用產生的lib庫即可,參照下列網友的部落格:
windows下編譯ffmpeg
【配置編譯】
安裝好cygwin,把android ndk放到cygwin的home目錄下面,路徑是這樣:D:\cocos2dx\cygwin\home\Administrator\android-ndk-r8b
然後解壓ffmpeg到這個地方(jni裡就是內容):D:\cocos2dx\cygwin\home\Administrator\ffmpeg\jni\ffmpeg
然後編寫配置指令碼config.sh,這部分可參考下面的連結:
編寫ffmpeg的config.sh指令碼
內容如下(注意最後把configure的內容放一行,這是一個坑哦!而且如果ndk路徑不一樣的自己改下):
./configure --disable-asm --disable-static --enable-shared --enable-gpl --enable-version3 --enable-nonfree --disable-doc --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --disable-avdevice --disable-avfilter --disable-postproc --enable-small --cross-prefix=/home/Administrator/android-ndk-r8b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-linux-androideabi- --enable-cross-compile --target-os=linux --extra-cflags='-I/home/Administrator/android-ndk-r8b/platforms/android-9/arch-arm/usr/include' --extra-ldflags='-L/home/Administrator/android-ndk-r8b/platforms/android-9/arch-arm/usr/lib -nostdlib' --arch=arm --disable-symver --disable-debug --disable-strippingsed -i 's/HAVE_LRINT 0/HAVE_LRINT 1/g' config.hsed -i 's/HAVE_LRINTF 0/HAVE_LRINTF 1/g' config.hsed -i 's/HAVE_ROUND 0/HAVE_ROUND 1/g' config.hsed -i 's/HAVE_ROUNDF 0/HAVE_ROUNDF 1/g' config.hsed -i 's/HAVE_TRUNC 0/HAVE_TRUNC 1/g' config.hsed -i 's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g' config.h
然後把這個指令碼拷貝到上面的jni目錄下,運行cygwin到jni目錄去執行這個指令碼:
cd /home/Administrator/ffmpeg/jniexport TMPDIR=d:/temp./config.sh
第二句是設定臨時目錄,這也是一個坑,而且這個目錄要存在吧。然後第三句就開始執行配置指令碼,出現下面這樣就對了……
【編寫Android.mk】<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ztK+zbK719DPuMu1wcujrM7S0rLKx7LOv7zG5Mv7sqm/zbXEo6zO0tKyvs2yu8/qz7i9ssHLo6y63Lbgv9PSsrD8uqzU2sDvw+bBy6GjxOPWu9Kqz8LU2LKiv72xtLW9xOO41bLFZmZtcGVnxL/CvM/g06a1xM671sO+zdDQwcujqNei0uLA78PmtcRjb25maWcuc2jT0LXjuMS2r6Os0tTJz8Pmsqm/zbXEzqrXvKOstvjH0snPw+a9ssHLINXiwO+yu9PDudzEx7j2Y29uZmlnLnNoo6mhozwvcD4KPHA+QW5kcm9pZC5ta3M8L3A+CjxwPqG+wv6zpLHg0uvCty212tK7vL6hvzwvcD4KPHA+tO3O87rNv9O2vLHIvc+24KOstPO80tf2usPQxMDt17yxuKGjz8i4xNK70Km12Le9sMmjujwvcD4KPHA+MS7Q3rjEam5pL2ZmbXBlZ8/CtcRjb25maWcuaKOs0N64xNXiwb3Q0LPJ1eLR+aO6PC9wPgo8cD48L3A+CjxwcmUgY2xhc3M9"brush:java;">#define CC_IDENT "gcc 4.4.3(GCC)"#define av_restrict// restrict2.修改libavcode libavformat libavutil libswscale目錄下的Makefile,將其中的include XXXXconfig.mak去掉
3.修改libavutil/libm.h,將其中的static方法都刪除掉
然後就可以把ndk目錄設定到環境變數path裡去,就可在cygwin中cd到最外面的那個ffmpeg目錄開始第一波嘗試了,執行ndk-build
【漫長編譯路-第二季】
1.哦,對了ndk可能還會有些問題,你只要找到ndk裡對應檔案對應的行數,一般是注釋或刪除掉那行就行了。這個我就不去再弄一次了。
本來編譯的坑還是很多的,可能都在上面的設定檔中被我改掉了,所以現在看著很輕鬆的樣子。
2.libavutil下的time.h重名問題,將該目錄的time.h改名為avtime.h,然後將所有用到libavutil/time.h的c檔案都改為libavutil/avtime.h(去目錄設定搜尋條件搜尋檔案修改唄)。
3.連結的時候說ff_log2_tab重定義了,將libavformat和libavcodec下的makefile裡log2_tab.o刪除唄,然後刪除臨時檔案再編譯下。
見到就大功告成了:
如果我描述得不清楚的話,可以參考下這篇部落格,我也是寫這個的時候才發現,真是後悔沒早點找到:
http://blog.csdn.net/xms0xms/article/details/8964999
【在cocos2dx中使用】
這裡只說最簡單的方式啊,把ffmpeg整個拷貝到cocos2d-x-2.2.1\cocos2dx下,因為引擎預設build_native.sh裡配置了這個匯入目錄。然後修改Android.mk加上下面這些話:
LOCAL_WHOLE_STATIC_LIBRARIES += libavformat LOCAL_WHOLE_STATIC_LIBRARIES += libavcodecLOCAL_WHOLE_STATIC_LIBRARIES += libavutilLOCAL_WHOLE_STATIC_LIBRARIES += libswscaleinclude $(BUILD_SHARED_LIBRARY)$(call import-module,cocos2dx)$(call import-module,cocos2dx/platform/third_party/android/prebuilt/libcurl)$(call import-module,CocosDenshion/android)$(call import-module,extensions)$(call import-module,cocos2dx/ffmpeg/jni/ffmpeg/libavformat)$(call import-module,cocos2dx/ffmpeg/jni/ffmpeg/libavcodec)$(call import-module,cocos2dx/ffmpeg/jni/ffmpeg/libavutil)$(call import-module,cocos2dx/ffmpeg/jni/ffmpeg/libswscale)
應該就能用了,而怎麼用的話,可以參考下面這個大大寫的文文,也可用來移植ios:
http://blog.csdn.net/langresser_king/article/details/14516879
注意:在android下要將播放的視頻檔案拷貝到可寫目錄(且目錄必須存在)去,不然會開啟錯誤的,謹記……