+++++++++++++++++++++++++++++++++++聲明+++++++++++++++++++++++++++++++++++++++++
下列文章引用了我的内容,卻未公布轉載我的部落格位址!!!
1. http://www.ajavn.com.sixxs.org/anzhuotuandui/4351.html
來自安卓手機論壇的一篇文章http://www.ajavn.com.sixxs.org/
2. http://hi.baidu.com/eefolks/blog/item/e0329e4682859129cefca351.html
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
全格式!!!
重點文章(包括文章後的評論):
http://blog.csdn.net/moruite/archive/2011/04/06/6305944.aspx
解決Android平台移植ffmpeg的一攬子問題![]()
移植havlenapetr的ffmpeg-->Android播放器 解決Android平台移植ffmpeg的一攬子問題 補充1:android R.java 檔案出錯怎麼辦
”
havlenapetr 最新的ffmpeg可以直接編譯通過,不過有個bug,就是播放完畢後,video_decoder線程不能退出,主要原因是阻塞在packet隊列的Queue->get函數裡,這裡處理邏輯需要考慮兩種情況:
1. AVPacket隊列裡沒有音視訊幀資料時,解碼線程挂起進入等待狀态,有新的AVPacket加入隊列時激活解碼線程
2. 如果檔案讀取到末尾,Queue->get直接傳回-1,解碼線程發現隊列空時直接退出
“
havlenapetr/FFMpeg 下載下傳位址
https://github.com/havlenapetr/FFMpeg
注意察看issues和文檔更新說明!! 目前更新日期2011/5/25
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
步驟一.
http://www.tlightsky.com/?p=55001
首先從git裡面拖出debug分支的代碼,時間是【2010年 11月 26日 星期五 22:48:41 CST】,注意目前的代碼裡面是
有bug的(在Vector裡面),是以我們復原兩個周期
git reset –hard HEAD~2(就是在他加入Vector之前,這個可以看git log)
ok,現在我們嘗試編譯,1. 在 ( "repair bulding process for everyone - you must build in ndkr5")ndkr5根目錄執行ndk-build。 具體指令為/usr/local/...ndk../ndk-bulid NDK_PROJECT_PATH=/.../havlenapetr-FFMpeg (下面的目錄為jni !!!會在同一級内生成lib,obj檔案夾) 注意:此時欲生成libffmpeg_jni.so 但需要如下的兩個so檔案:
報錯,發現沒有obj/local/armeabi/libjniaudio.so
git checkout libs/armeabi/*
cp libs/armeabi/* obj/local/armeabi/
拷貝havlenapetr同學為我們編譯好的兩個so檔案(這個是區分版本的!下面會說明)。
完整指令(針對 Android NDK r5 &Android 2.2 ,整個編譯時間大概10多分鐘):
/usr/local/android-ndk-r5/ndk-build NDK_PROJECT_PATH=/.../havlenapetr-FFMpeg NDK_TOOLCHAIN=arm-eabi-4.4.0 NDK_PLATFORM
=android-8
先别急着編譯
現在,我們在再修改
jni/jni/Android.mk
ifeq ($(IN_NDK),true)
LOCAL_LDLIBS := -llog
else
LOCAL_PRELINK_MODULE := false
LOCAL_SHARED_LIBRARIES := liblog
endif
改為
LOCAL_LDLIBS := -llog
—————————————————————- 好了現在你可以編譯了~~
步驟二:
2.寫一個(或者從其他項目拷貝)default.properties.( 裡面其實沒多少内容,隻是定義預設版本貌似 :# Project target. target=android-9)
重新開機eclipse ,即可看到build path-自動添加了system library Android2.3。(之前不要手動添加android包,否則此時會彈出“Dx1 error; abortingConversion to Dalvik format failed with error 1錯誤”即有重複包)
步驟三:
接上,然後 3.自 動 會生成gen檔案夾, 裡面有R.java
補充1:android R.java 檔案出錯怎麼辦
1.先檢查你的代碼,代碼有誤,R.java檔案是生成不了的
2. 把Project ----> Build Automatically那個選項勾上,讓工程每次修改完後都會自動編譯,這樣R.java會是最新的(這時候程式有誤,不會生成)
3. Project ---> Clean,點開後,選中你的工程,然後OK,會Reset你的工程設定,然後重新Build一下,這樣三步下來,就能搞定你的問題了。
補充2: Android R.java問題彙總
1. The type R is already defined. (很多時候我們在導入其他人的程式的時候,會遇到這個錯誤)
通常在project裡有兩個R.java,一個在src,一個在gen,通常删除src裡那個保留gen裡的就OK
2.R.java無法修改
R.java是ATD自行産生的,ID号都是唯一的,如果不熟悉,最好是不要動這個裡面的東西,這個類裡面通常定義的都是project的一些resource資訊,attr、drawable、id、raw、layout、string以及xml等
如果發現R.java沒法修改,要去看你的配置檔案,比如xml等是否有錯誤。例如一個圖檔資源檔案,如果我沒有放在res/drawtable下時,R.java是沒法修改的,當你把這個資源拷到res/drawtable下後,R.java就可打開了。
2.R.java不能自動更新
1)是你的project配置有問題
XML格式錯誤等等
2) 設定的問題
i. 打開ECLIPSE的Poject-->Build Automaticaly ,把它勾起來,以後就會自動給你維護R.java
ii. 或者右擊你的project,Android tools-->Fix project properties
ii. 再不行,同樣打開eclipse的project-->clean,點下會reset你的project的配置的,然後再rebuild下你的project
以上是本人之前學習時遇到的,如有表達不好的,望斧正,後續繼續更新
步驟四: 此時,仍會報錯:
- The type new MediaController.MediaPlayerControl(){} must implement the inherited abstract method
MediaController.MediaPlayerControl.canSeekForward()
- The type new MediaController.MediaPlayerControl(){} must implement the inherited abstract method
MediaController.MediaPlayerControl.canSeekBackward()
- The type new MediaController.MediaPlayerControl(){} must implement the inherited abstract method MediaController.MediaPlayerControl.canPause()
fixed as: add unimplemented methods
4.實作相應的接口(内容無所謂) 添加如下代碼:
public boolean canSeekForward() {
return false;
}
public boolean canSeekBackward() {
return false;
}
public boolean canPause() {
return false;
}
參考官網說明 公有方法: http://www.zuiniuwang.com/doc/reference/android/widget/MediaController.MediaPlayerControl.html
5. 重新編譯使用的 libjnjvideo.so,libjniaudio.so的版本!!!(轉向步驟1) 自帶libjnjvideo.so,libjniaudio.so 是Froyo(2.2) 版的。如果是其他版本,需要自己編譯Echair(2.1)or Gingerbread(2.3 對應api-9).
用eclipse build(即第一步)之前 ,要把libjnjvidoe.so libjniaudio.so copy 到 libs/armeabi/ 和 obj/local/armeabi/(兩個目錄下)
如何得到呢?如果是2.2 用自帶的即可。這對2.3,
問題:libjniaudio.so、libjnivideo.so 怎麼編譯的?
回答: these two libs are wrappers to android native AudioTrack and surface flinger so they couldn't be build in ndk. So I have build them in android build system and copy them into my ffmpeg project
通過nm指令,可以看到,libjniaudio.so主要提供了AudioTrack相關接口,libjnivideo.so主要提供surface相關接口。這些東西包含在android源碼下,必須在android build 環境中編譯。
如何編譯?哥終于搞出來了! 兩篇極其重要參考文章: 1. 經典文章,尤其留意後面的一系列留言及留言人的部落格 http://blog.csdn.net/moruite/archive/2011/04/06/6305944.aspx 2. 上面某一留言人的部落格,講解如何編譯兩個so檔案 http://blog.csdn.net/piaozhiye/archive/2011/04/26/6363512.aspx 其實,歸根結底還是havlenapetr的網站上的issues 2,3等等 下面開始講我的成功經曆:
首先:
是要編譯libjnivideo.so和libjniaudio.so 這兩個so因為不同的版本或者修改過的framework是不一樣的,是以需要在android源碼中編譯出自己的so。主要關注 framework/base目錄 具體參考havlenapetr給出的Android2.2的目錄結構
https://github.com/havlenapetr/android_frameworks_base
去上面網址base/native下的内容補充到android2.3的對應目錄下。所做改變為增加了surface.cpp&h,audiotrack.cpp &h 及相應的mk檔案。
(如果是想在2.1下 還要修改相應的頭檔案等(android的系統檔案改變的原因)詳見:https://github.com/havlenapetr/FFMpeg/issues/3)
添加 libjniaudio.so and libjnivideo.so to the end of myandroid/build/core/prelink-linux-arm.map
然後重新編譯整個android系統...漫長的 一個小時20分鐘(80分鐘)。。。(以後開發調試可腫麽辦)
then I get the libjniaudio.so and libjnivideo.so in out/target/product/generic/obj/lib for Gingerbread.
同時也要把剛才兩個編譯出來的so放到obj/local/armeabi目錄下,之後就可以了編譯出libffmpeg_jni.so.
最後也要把剛才兩個so放到libs/armeabi目錄下。要不然運作的時候找不到。
播放的時候太卡了,聲音也沒有同步。
/
此編譯過程參考文獻為: 1. 編譯havlenapetr的ffmpeg工程播放視訊 http://wingjang.blog.163.com/blog/static/47913442201112161310334/ 2. Compile havlenapetr / FFMpeg for android http://hi.baidu.com/eefolks/blog/item/e0329e4682859129cefca351.html
3. Compile android source code on Fedora 13 http://hi.baidu.com/eefolks/blog/item/9b195fc5f722dc149c163db1.html
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
思考?
1. 隻用sdk 如何編譯: 不用eclipse的話
2.下面列出幾個非常不錯值得關注的網站!(跟本次内容不一定相關)
1. http://www.tlightsky.com/ eg.