2016-11-06 15 views
2

我正在使用Codename One錄製麥克風輸入並將其播放回已連接的耳機。Codename One可以記錄麥克風輸入並同時播放嗎?

首先,如果我從麥克風將音頻錄製到文件,並在錄製結束時播放它,它會按預期工作。這就是爲什麼基於這個2014 question我實現了2個週期性任務(定時器和時間任務),只要2個文件:一個用於記錄,一個用於播放。我將週期性任務週期設置爲100 ms和幾秒之間的值,但在Android設備上的結果非常糟糕。確實存在着隨機差距,這根本不是光滑的,也是不可理解的。

我假設每個週期寫入文件的開銷太高,因此導致該行爲。所以using proper high-level Codename One methods似乎並不適合。

然後在2014年的相同問題中,請求者建議從錄製媒體創建輸入流,並將其用作播放媒體的輸入。但方法MediaManager.createMediaRecorderStream()似乎不再可用。我試圖通過fs.openInputStream(recFilepath)使用用於將播放媒體的音頻錄製爲InputStream的文件,但是它沒有在設備上輸出任何聲音或錯誤。

所以我的問題是我是否可以實現我的目標,只有Codename One或我必須使用本機接口?此外,Shai(在上面提到的2014年的問題中)寫道,MediaManager.createMediaRecorderStream()的第二種方法可能適用於某些平臺:其中的android平臺還是隻針對iOS平臺?

任何幫助表示讚賞和抱歉沒有發佈的代碼,因爲我儘快嘗試清除似乎無法工作。所以我真的搞砸了我的代碼,它現在沒有做我最初的目標。

乾杯,

回答

1

至於我記得安卓早在一天不支持媒體輸入流,後來只允許直接捕捉輸入作爲壓縮的WAV這使得全雙工的使用是不切實際的。自從我記得他們對媒體庫進行了一些改革以來,這可能已經發生了變化。

我不確定這是否暴露在我們的高級代碼中。除了使用本機界面外,您還可以通過分叉和破解等方式幫助我們改進Codename One。這是在Android項目的相關代碼:

https://github.com/codenameone/CodenameOne/blob/master/Ports/Android/src/com/codename1/impl/android/AndroidImplementation.java#L2804-L2858

這是一個貢獻指導代號一,它涵蓋了在模擬器中運行,但是這是一個良好的開端:https://www.codenameone.com/blog/how-to-use-the-codename-one-sources.html

您可以測試您的更改在這裏有說明的Android設備上:https://www.codenameone.com/blog/debug-a-codename-one-app-on-an-android-device.html

+0

謝謝@Shai的輸入。它確實可以通過本機界面(至少對Android來說)。如何做到這一點在[我的其他SO問題]中描述(http://stackoverflow.com/questions/40447441/how-to-test-an-android-native-code-snippet-with-codename-one/40454439# 40454439)。延遲是可感知的,但結果實際上很棒。關於貢獻,你的意思是(重新)創建一個'createMediaRecorderStream()'方法,返回一個可以被createMedia()使用的Stream,或者創建一個直接將麥克風輸入回放到揚聲器的方法。 – HelloWorld

+0

是的,如果您認爲我們可以改進我們的API實現中使用的Android本地方法,那麼您可以分叉項目並提供更好的本機Android'createMediaRecorderStream'實現 –