4

我有一個簡單的Android媒體播放器,可以在一個屏幕上同時播放多個視頻。所以基本上,單個媒體播放器屏幕被分成4個部分,其中4個mediaPlayer實例粘合在一起,並且每個部分播放給定的視頻。我的Android MediaPlayer同步問題

當我的視頻文件存儲在本地設備上時,它幾乎可以正常工作。有同步問題,但很小。但是,當我輸入HTTP流的URL時,會出現嚴重的同步問題。問題是什麼?一般來說,我如何消除同步問題?

我唯一能做的就是首先實例化媒體播放器,然後依次調用start(),這樣至少開始時間接近彼此。它雖然沒有太大的影響。

在這裏我有一個返回每個mediaplayer實例的方法:

MediaPlayer mediaPreparation(String filename, boolean setMute) { 
    String url = "myURL"; // your URL here 
    // create mediaplayer instance 
    MediaPlayer mediaPlayer = new MediaPlayer(); 
    if (setMute) { 
     mediaPlayer.setVolume(0, 0); 
    } 
    try { 

     mediaPlayer.setDataSource(url); 
     mediaPlayer.prepare(); 

    } catch (IOException e) { 
    } 

    mediaPlayer.setLooping(true); 
    // mediaPlayer.start(); 
    return mediaPlayer; 
} 

然後我開始逐一:

mp[0].start(); 
mp[1].start(); 
mp[2].start(); 
mp[3].start(); 

enter image description here

+0

Tina J,你是否設法解決這個問題?我有同樣的問題,我想知道是否有任何解決方案。 – Mohru

回答

1

我不知道如果任何Android媒體播放器提供此功能。

我懷疑也可能存在設備依賴關係,因爲不同的設備在硬件中可能具有不同的功能來解碼和播放多個視頻,並且如果您的一些視頻必須使用SW解碼等,它們將會慢得多。

它可能無法滿足您的需求,但在終端設備上提供此類視頻網格的常見方法是將視頻合併到服務器端,並將其作爲單個視頻流傳送到設備。其他

更新

有一點要注意,如果使用MediaCodec並充分利用硬件編解碼器 - 如果影片有不同的視頻配置文件這可能會導致不同的解碼延時也。

這是關於如何對視頻進行編碼 - 簡單地說,如果一個特定的幀涉及來自幀之後的信息(一種常見的壓縮方法),那麼解碼器需要緩衝幀直到它具有也參照框架。對於使用基線配置文件的更簡單的壓縮方法,不要使用這種技術,因此不必緩衝,因此可能具有更低的延遲。這似乎是針對不同的硬件廠商也不同 - 看到這注來自Intel,特別是低延遲節末:

我懷疑這方面的問題,最好的辦法是瞄準最低共同支配者 - 要麼只使用基線配置文件,要麼嘗試延遲所有視頻顯示的時間長於您可以從任何單個視頻預期的最大延遲時間。

+0

它已經實施。問題是改進同步的任何方法... –

+0

感謝您的有益更新。實際上,我的所有視頻都使用完全相同的配置文件,並且實際上具有相同的大小和分辨率。 –

1

在流媒體的情況下,數據總是存在無法持續使用的風險,所以玩家在開始播放之前會緩衝很多幀。在這種情況下,多個流可能需要不同的時間才能獲得足夠數量的緩衝。我看到了一種可以嘗試的方式,mediacodec。參考這個,https://developer.android.com/reference/android/media/MediaCodec.html

請特別注意releaseOutputBuffer()及其變體。您可以更好地控制渲染(如果需要,可以更改時間戳,但我不會建議,因爲回放不平穩)。您可以跟蹤所有4個實例是否獲得瞭解碼的特定時間戳幀,然後立即渲染它們。

+0

有趣的見解!基於URL的流如何工作?當調用'prepare()'時,它只下載前幾秒,而不是整個,對吧?我現在會問一個單獨的問題... –

+0

那麼,我如何跟蹤所有4個實例是否得到了解碼的特定時間戳幀?任何例子或什麼? –

+1

這只是解碼。當你得到解碼幀時,你會得到相應的時間戳。跟蹤所有4的時間戳,並且當他們全部解碼特定的時間戳時,全部渲染。基本的解碼和渲染是在Android文檔中,跟蹤邏輯,你必須寫。 –