2016-09-06 16 views
0

我有一個場景,我有一些從MIDI文件中獲得的計時數據。當需要播放MIDI音符時,我需要通過UDP發送命令。基本上,我有指示說:「播放音符A,等待125ms,播放音符B,等待300ms,播放音符C ...」,每次我「播放音符X」時,我需要通過UDP發送數據。我嘗試過使用TimerTask和一個簡單的線程,用一個循環來檢查系統時間並計算已經過了多少時間,然後決定是否基於此來播放音符,但這兩種方法似乎都有時間問題。 TimerTask不會按照指定的時間間隔運行(這在文檔中有說明),所以我得到不穩定的消息。該線程運行得更好,但它有時候仍然打嗝,我認爲是因爲其他線程優先於它。如何在Android應用中以準確的時間發送數據?

有更好的方式發送更準確的時間這個數據?有什麼我可以使用像用於播放音頻Java中的剪輯接口?

任何援助非常感謝。

回答

0

這是一種註定要失敗的方法。讓我來問這裏的問題:

1)Android不是一個實時操作系統。 Linux(它的基礎)也不是。準確地發生毫秒級時序永遠不會奏效。即使時鐘足夠準確,以1ms的速率中斷,也無法保證Linux會將您的線程調度爲喚醒。

2)TimerTasks不答應是準確的,甚至由1

3)你然後通過UDP發送的地方它限制的程度?一個協議不能保證交付或時間安排,接收方會對此做些什麼 - 而接收方可能會有其他的時間問題。

扔掉這整個方法,重新開始將是我的建議。這一切的每一個步驟都說不好主意。

+0

那麼播放音頻的應用程序如何保持適當的時間呢?當Android應用程序播放來自文件的歌曲時,它沒有這些類型的問題。我不是說你上面不正確,我只是想知道如何完成音頻播放,儘管你提到的問題 – jteezy14

+0

不是通過計時數據。它將文件數據寫入內存。然後它告訴聲卡數據在哪裏,聲卡讀取內存並處理輸出。這當然是一種簡化(完整的答案涉及DMA和緩衝區回收等事情),但要播放實際的音樂,請將其交給一個單獨的硬件。 –

相關問題