簡體   English   中英

使用現有MediaPlayer更改音頻播放的數據源?

[英]Changing data source for audio playback using existing MediaPlayer?

我正在嘗試使用相同的媒體播放器,但更改數據源。 這是我正在嘗試做的事情:

    private MediaPlayer mMediaPlayer;

    public void pickFile1() {
       initMediaPlayer("myfile1.mp3");
    }

    public void pickFile2() {
       initMediaPlayer("myfile2.mp3");
    }

    private void initMediaPlayer(String mediafile) {
    // Setup media player, but don't start until user clicks button!
    try {
        if (mMediaPlayer == null) {
            mMediaPlayer = new MediaPlayer();
        } else {
            mMediaPlayer.reset();   // so can change data source etc.
        }
        mMediaPlayer.setOnErrorListener(this);
        AssetFileDescriptor afd = getAssets().openFd(mediafile); 
        mMediaPlayer.setDataSource(afd.getFileDescriptor());
    }
    catch (IllegalStateException e) {
        Log.d(TAG, "IllegalStateException: " + e.getMessage());
    }
    catch (IOException e) {
        Log.d(TAG, "IOException: " + e.getMessage());
    }
    catch (IllegalArgumentException e) {
        Log.d(TAG, "IllegalArgumentException: " + e.getMessage());
    }
    catch (SecurityException e) {
        Log.d(TAG, "SecurityException: " + e.getMessage());
    }

    mMediaPlayer.setOnPreparedListener(this);
    mMediaPlayer.prepareAsync(); // prepare async to not block main thread
    mMediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);  // Keep playing when screen goes off!
}

當我想要更改為新的媒體文件時,我只是調用它。 但它似乎沒有成功更改數據源。 第一個問題:是否可以這樣做,或者我是否必須釋放媒體播放器並為每個新文件創建一個新媒體播放器? 如果有可能,為什么我的代碼不正常?

編輯:好吧,發布和重新創建媒體播放器也不是這樣做的! 它只是在播放同一首歌!?!? 這怎么可能呢? 新想法 - 為每個軌道創建一個不同的媒體播放器,這真的是我在這里要做的嗎? 這可能是Android中的一個錯誤嗎?

確保在更改數據源之前停止並重置mediaplayer。 更重要的是當你停止它的時候

在完成的時候

..那么請檢查一下你在這個方法中做了什么。 然后打電話

mplayer.setDataSource(audioPath);
mplayer.setOnPreparedListener(this);
mplayer.prepareAsync();

我今天的資產實際上遇到了同樣的問題,我知道修復。

問題是資產存儲為一大塊數據,而不是實際存儲在某個真實文件系統上的一堆單獨文件中。 因此,當您獲得assetfiledescriptor ,它既指向文件,又指向偏移量和長度。 如果您只是將mediaplayer指向assetfiledescriptor本身,它始終會播放您資源文件夾中的第一個媒體文件(或其他內容)。

如果你這樣做: mMediaPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());

然后它播放正確的文件。

你聲明private String mediafile="my.mp3"; 然后你使用AssetFileDescriptor afd = getAssets().openFd(mediafile); 但是在任何時候(從你發布的代碼中)你都改變了mediafile的值。
我建議把mediafile = theNextFile; afd = getAssets().openFd(mediafile);之前的行afd = getAssets().openFd(mediafile); 其中theNextFile可能會引用用戶在單擊所述按鈕之前選擇的SD卡上的文件。
我不知道如何管理從SD卡獲取文件名,但我認為使用startActivityForResult將是一種方法。

好吧,我從來沒有得到一個非常好的答案。 我認為在模擬器中可能會發生一些有趣的事情。 我所做的對我來說非常有用,就是將文件下載到外部SD卡並從那里播放。 這會稍微改變代碼:

String path = getExternalFilesDir(null).toString() + "/";
mMediaPlayer.setDataSource(path + mediafile);

其余的保持不變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM