2016-04-21 110 views
3

基本問題:添加ffmpeg的OMX編解碼器Genymotion的是Android 4.4.2模擬器

有沒有辦法添加一個新的音頻編解碼器的Genymotion Android模擬器,短下載整個Android源碼,學習如何構建它,並創建我自己的Android版本?


語境:

我寫了一個Java Android應用程序,它作爲一個音頻渲染器,以及作爲一個DLNA/OpenHome服務器和客戶端。認爲沒有視頻的「BubbleUpnp」。我的主要開發平臺是Win8.1。該程序在Windows上作爲ActiveState「pure-perl」DLNA MediaServer啓動,然後移植到Ubuntu上,幾年前我在Android下開展工作。它非常時髦......所有的UI都是通過HTTP服務器/ jquery/jquery-ui呈現的,這些UI來自運行在Android下的Ubuntu shell(本身就是一個竅門),提供運行在相同(Android)設備。除了「怪異」之外,它還有一個主要缺點,就是它需要一個有效的IP地址才能工作......因爲我無法弄清楚如何讓Ubuntu有一個127.0.0.01本地主機的本地環回設備,我使用該應用作爲在我的船上(這是我的家)的「汽車音響」,這往往沒有連接到互聯網。

我很難從Android應用程序開發入手,因爲Eclipse中Android模擬器的速度非常糟糕,並且ADB驅動程序在Win8上的時間最長時間無法工作。然後有一天,大約一年前,我遇到了Genymotion(作者的榮譽),突然之間我有一個可行的Android開發環境,所以我添加了一個DLNA服務器的Java實現,然後也使用Android的MediaPlayer類,並增加了充當DLNA控制點的能力,最近也增加了OpenHome服務器和渲染器。在一個單獨的工作中,我在包括Win,Linux和Android x86,arm和arm7設備(bitbucket.org/phorton1)在內的各種平臺上爲這個程序創建了一個名爲fpCalc的基於ffMpeg的構建環境/)進行了廣泛的測試,以確定fpcalc指紋的有效性和壽命,發現fpCalc指紋基於ffmpeg的版本而改變,這是一個單獨的主題,但在此過程中,學習至少有一點關於如何構建ffmpeg以及Android共享庫,JNI接口等。

所以現在Android-Java版本的程序已經超越了舊的perl版本,我正在辯論我是否想要繼續嘗試構建perl版本(並添加wx Perl用戶界面)。

對我來說,出現的一個問題是,Genymotion仿真器不支持WMA解碼......由於許可問題等,Android放棄了對WMA的支持......但我的音樂庫在WMA文件中有大量的曲調,我不想「轉換」它們,但我認真思考的哲學是,我的程序不會修改原始媒體文件中的內容,標籤或任何內容已經積累起來,或者將來會接受,而不是將它們視爲「值得保留」的「文物」。任何轉換都不會使文件比原來「更好」,並且我希望保留所有原始音頻來源,以保證我所有音樂的前進。因此,我想,我可以在7個不同的平臺上構建FFMPEG,並且我在網上看到了所有這些對「Android的OMX FFMPEG編解碼器支持」的引用,所以我想,「所有我需要做的是創建OMX組件,並以某種方式將其加入Genymotion「。

我已經研究了OMX,OpenMaxIL,看過邁克爾·陳的帖子,看到堆棧溢出問題

如何讓ffmpeg的編解碼器及部件爲OMX組件

的Android:如何將解碼器集成到多媒體框架

和Cedric Fung的頁面https://vec.io/posts/use-android-hardware-decoder-with-omxcodec-in-ndk和Mi chael Chen的存儲庫https://github.com/omxcodec,以及網絡上的幾乎所有其他頁面都提到了libstagefright,OMX,Genymotion和FFMPEG的組合。

(此頁不會讓我把2頁以上的鏈接,我沒有一個「10」的美譽,否則我就列出了一些我所見過的來源)..

我的Linux開發環境是在我的贏機器上運行的Ubuntu12.04 vbox。我已經下載並運行Android-x86 iso作爲vbox,並且IT包含ffmpeg編解碼器,但不幸的是,它既不支持WiFi接口,也不支持vbox「guest添加」,因此它有一個非常時髦的鼠標。我嘗試了大約3天來解決這兩個問題,但最終並不覺得它可以用於我的傀儡,我真的很喜歡genymotion「感覺」的方式,尤其是支持mown,所以我想保持genymotion我的「窗機器人」這下我可以運行我的程序,棄用並停止使用我的舊的perl源虛擬設備,

除了genymotion不支持WMA文件...


幾個側面說明: (a)在Windows中本地運行的Java中編寫單一源代碼應用程序沒有好方法,並且作爲Android應用程序。 (b)我不想將我的Windows機器重新啓動爲「真正的」Android設備,只是爲了播放我的音樂文件。機器必須留在Windows中,因爲我也用它來做其他事情。 (c)我寫這篇文章是因爲我的機器在36小時內將整個ASOP源代碼庫下載到Ubuntu vbox中的一個分區,而我坐在一個不太好的互聯網上的酒店房間裏在巴拿馬巴拿馬城連線,然後我回到我的船上,在偏遠的博卡斯德爾託羅巴拿巴,那裏的互聯網連線更糟糕。 (d)通過從Java調用我的FFMPEG可執行文件(將其轉換爲WAV/PCM或AAC),我確實已通過我的應用程序獲得了WMA解碼,但由於Android MediaPlayer的限制,它並不能正常工作,尤其是對於遠程託管的WMA文件... MediaPlayer堅持在播放之前將整個文件存在,這可能需要幾秒鐘或更長時間,我希望通過在MediaPlayer下獲得「真正的」WMA編解碼器,該問題將只是消失....


所以,我想弄清楚這一切。有很多誘人的線索和建議,但是我發現的或者至少我開始相信的是,如果我想向Android(Genymotion)添加一個簡單的WMA音頻解碼編解碼器,不僅我必須下載基本上的ENTIRE ASOP Android源代碼樹,並學習一套新的工具(回購等),但是我必須(能夠)從頭開始重建整個Android系統,特別是, libstagefright。以便與GenyMotion中現有的完全兼容,同時添加ffmpeg編解碼器ala Michael Chen的頁面。

而我只是問,是不是,難道真的那麼難嗎?


無論如何,這讓我發瘋。有沒有辦法只是建立一個新的組件,或者最壞的情況下,一個新的OMX核心,並將其添加到Genymotion,沒有建立所有的Android,最好只基於OMX H文件?或者,難道我真的要取代現有的libstagefright.so,這意味着,基本上,重建所有的Android的...

附:我認爲能夠很好地解決這個問題,建立它,然後將可安裝的新FFMPEG編解碼器發佈到其他人使用的位置,以便它們不會在他們的耳朵上長出疣狀物,並從他們的眼球中噴出蒸汽,而他們年老試圖弄明白....

回答

0

喜光子和感謝的榮譽,這是大加讚賞:d

首先,我不知道什麼時候您下載的設備,但它的相當長的一段時間,我們不提供4.4.2,但4.4.4。

如果啓動4.4.4設備和開放/etc/media_codecs.xml文件,你可以看到這幾行上市,我們嵌入的ffmpeg解碼器:

<!-- ffmpeg audio codecs -->           
    <MediaCodec name="OMX.ffmpeg.aac.decoder" type="audio/mp4a-latm" /> 
    <MediaCodec name="OMX.ffmpeg.wma.decoder" type="audio/x-ms-wma" /> 
    <MediaCodec name="OMX.ffmpeg.ra.decoder"  type="audio/vnd.rn-realaudio" /> 
    <MediaCodec name="OMX.ffmpeg.flac.decoder" type="audio/flac" />    
    <MediaCodec name="OMX.ffmpeg.mp2.decoder" type="audio/mpeg-L2" />   
    <MediaCodec name="OMX.ffmpeg.ac3.decoder" type="audio/ac3" />    
    <MediaCodec name="OMX.ffmpeg.ape.decoder" type="audio/x-ape" />   
    <MediaCodec name="OMX.ffmpeg.dts.decoder" type="audio/vnd.dts" />   
    <MediaCodec name="OMX.ffmpeg.pcm.decoder" type="audio/x-pcm" />   
    <MediaCodec name="OMX.ffmpeg.atrial.decoder" type="audio/ffmpeg" />   

WMA是其中的一部分。你應該嘗試下載一個新的4.4.4設備,你的問題就解決了。

此外,我們的音頻支持已擴展到隨着時間的推移,如果一個奇巧設備沒有做的工作也許是較新的版本可以做到這一點(檢查5.0,5.1或6.0)。

然後,如果你最終不能做到這一點。我不建議你自己添加一個新的編解碼器,即使可能通過對系統文件進行黑客入侵併對AOSP進行部分編譯也是如此。這將是複雜的,可能根本不可能。

一個很好的解決辦法是使用替代的媒體播放器,其中包括所有你需要的編解碼器。然後,您將直接在本機應用程序中嵌入此媒體播放器和庫,並使用它代替Android MediaPlayer。我的第一個建議是使用VLC,它提出了一個standalone libVLC版本。我已經使用它,它真的很棒。還有其他第三方庫可以在網上找到。

我希望它幫你。

+0

謝謝eyal-lezmy ... duh .... – photon

+1

感謝您抽出寶貴的時間eyal-lezmy ... duh ....我只是假設Genymotion沒有在版本中包含WMA解碼器。根據您的建議,我已經下載並測試了我的應用程序和GM 4.4.4設備,並查看了media_codecs.xml,現在我的程序可以在通用WMA文件上正常工作。你的回答爲我節省了數不清的可疑工作時間。再次感謝您的辛勤工作以及我確定的優秀產品,使許多開發人員能夠開發Android應用程序。 – photon

+0

嗨photon再次感謝我*真的*很高興你喜歡它。我認爲你可以將你的問題設定爲現在的答案。乾杯 –