2016-08-30 35 views
6

Başlangıcı ve Zaman Damgası işaretçileri nasıl belirlenir ve bu iki ses dosyasının arasında medya oynatılır? Android'de MediaPlayer için dinleyici API görmüyorum. Bunu başarmak için nasıl gidebileceğimi merak ediyor musun?A ve B noktaları arasında ses çalma

Durumum şunun gibi: Ses dosyalarını bu tür birçok parçaya ayırın ve kullanıcının etkileşimli olarak istediği bölümleri seçmesine/yeniden oynatmasına izin verin. Örneğin, küçük bir ses dosyasının 3 parçaya (A --- B --- C --- D), yani AB, BC ve CD'ye ayrıldığını varsayalım. Kullanıcı BC'yi seçer ve oynamayı seçer. Ses daha sonra B noktasından başlayarak oynatır ve C noktasına ulaştığında durur. Kullanıcı tekrar BC parçasını çalabilir veya bir sonraki kısma geçmeyi seçebilir.

Başlangıç ​​noktasını bulmaya ve mediaPlayer.seekTo(int) API'sini kullanmaya karar vermek daha kolay olsa da, ses bitiş noktasını nasıl durdurabilirim? Bunun için en iyi yol nedir?

Yardımınız çok takdir edilmektedir.

+0

Bunu gerçekleştirmenin bir yolunun, hedef noktaya ulaşıp ulaşmadığını görmek için 'Handler' ve mediaPlayer.getCurrentPosition() izleme işlevlerini kullanarak her saniye olduğunu biliyorum. Bundan daha iyi bir yolu var mı? – karthiks

cevap

1

Bu uygulama hakkında gitti yolu aşağıdaki gibidir:

private MediaPlayer mediaPlayer; 
private Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
     mediaPlayer.pause(); 
     playPauseButton.setText(R.string.play); 
    } 
}; 

private void play(int start, int duration) { 
    mediaPlayer.seekTo(start); 
    handler.postDelayed(runnable, duration); 
} 

bu bağlam için ilgili kodun anahtar kısmını kopyaladık. Bunu yaparken de özellikle bu uygulamadan memnun değilim çünkü bu hala doğru değil.

Bunun için doğruluk elde etmek için alternatif bir API kullanan birinin olup olmadığını görmek istedim, Android'in AudioTrack API'sini veya bunun gibi bir şeyi kullanarak olabilir.

Bu, şu ana kadar mevcut en iyi alternatif olan bilgimdir. Bu mesajı güncelleyeceğim, daha iyi bir yol bulmalıyım ve o zamana kadar, bu bana hizmet ettiği kadar iyi hizmet vereceğini umuyorum. Şerefe!

4

Sana mediaPlayer.seekTo kullanabilirsiniz düşünüyorum (int msn) Benzer bir şey yapmak için bir zamanlayıcı kullandım

mediaPlayer.setLooping(true); 
mediaPlayer.seekTo(0); 
mediaPlayer.start(); 
+1

@ user8430 'un yanıtına ek olarak, 'from' kullanmak,' seekTo' kullanmak ve' '' player 'ınProgress' dinleyicisini kullanmak ve gerekli ana geldiğinde oynatmayı durdurmak. –

+0

@VladMatvienko, mediaPlayer üzerinde bir onProgress dinleyicisi yok maalesef :( – karthiks

+0

@karthiks: Bu http://android-er.blogspot.kr/2012/06/seek-to-specified-time-position-with ile görüyor musunuz. html? Ben sizin için yararlı olacağını düşünüyorum – Jame

4

. Aşağıdaki kod, bir düğmeyle ('button' id ile) bir düzeniniz olduğunu ve mp3 dosyanızın 'myMp.mp3' olduğunu ve raw klasöründe olduğunu varsayar.
play yöntemi, hem milisaniye cinsinden, hem başlangıç ​​noktası hem de süre olmak üzere iki parametre alır, ancak noktaları başlatmak ve durdurmak için kolayca değiştirebilirsiniz.

private MediaPlayer mediaPlayer; 
private Timer timer; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Button btnStart = (Button) findViewById(R.id.button); 
    mediaPlayer = MediaPlayer.create(this, R.raw.myMp); 

    btnStart.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      preparePlayer(); 
      play(20000, 3000); 
     } 
    });   
} 

private void preparePlayer() { 
    try { 
     mediaPlayer.prepareAsync(); 
    } catch (Exception e) { 
     //Handle exception 
    } 
} 

private void play(int start, int duration) { 
    mediaPlayer.seekTo(start); 
    mediaPlayer.start(); 
    timer = new Timer(); 
    timer.schedule(new PlayerTask(), duration); 
} 

class PlayerTask extends TimerTask { 

    @Override 
    public void run() { 
     mediaPlayer.stop(); 
    } 
}  
+0

Bunu denedim. Bir UI'yi bir TimerTask iş parçacığından güncelleyemediğinizde kodu – karthiks

+0

Sorunuzdaki UI'yi güncellemeyle ilgili hiçbir şeyden bahsetmediğinizi görmüyorum, sadece iki nokta arasında ses dosyası yürütmek istediğiniz. SO: http://stackoverflow.com/questions/4369537/update-ui-from-thread, http://stackoverflow.com/questions/5185015/updating-android-ui-using-threads hakkında UI güncelleme hakkında birçok soru var ve daha bir çok – TDG

+0

fuar noktası, bu benim gerçekten kötü :( – karthiks

1

Handler'u kullanabilirsiniz. sendMessageDelayed. MediaPlayer uygulamasında bu işlevi start çağırın. X saniye için oynamak istediğinizi söyleyin, argüman olarak X - 1'i (buffer olarak -1) geçirebilirsiniz. Bunun nedeni, farklı faktörleri göz önünde bulundurmamız gerektiğidir, mesaj planlaması, mediaPlayer başlangıç ​​gecikmesi, vb. Mesaj geldiğinde getCurrentPosition'u kontrol edin. Zaman kalsa, her milisaniyede bir kaç pozisyonu kontrol edersiniz.

Kesin olması gerekmiyorsa, X'i doğrudan iletebilir ve mesaj geldikten sonra durdurabilirsiniz.