Mediaplayer schneidet den Sound zu bald ab

Ich habe zwei Geräte, die ich mein Spiel testen kann: Ein US Celluar Telefon (SCH-R880) und ein Kindle Fire, das Kindle Fire ist viel mächtiger als das Telefon.

Ich habe mehrere kurze (weniger als oder etwa 1 Sekunde) Soundeffekte. Um auf Speicher zu speichern, lade ich, spiele und löse einige dieser Soundeffekte. Am Telefon spielen sie (meist) wie erwartet. Auf dem zünden Feuer aber sind sie kurz geschnitten. Die wirklich kurzen Töne sind so schnell abgeschnitten, ich höre nichts. Die, die beim Setup geladen werden und bleiben, spielen aber gut.

  • Streaming Audio-Datei und Caching es
  • Wie man Medieninhalte (Video, Audio) auf Android schützt, um gespeichert / neu verteilt zu werden?
  • Android - Prozess ist gestorben Problem
  • Android - Play-Sound auf Knopf-Klick - Null-Pointer-Ausnahme
  • Streaming Audio von einer URL in Android mit MediaPlayer?
  • Media Player Looping: Android
  • Wer hat eine Ahnung, was hier los ist? Bin ich irgendwie meine Medien zu früh los? Unten ist ein Beispiel dafür. Am Telefon höre ich "Level zwei!" Aber auf dem Kindle höre ich so etwas wie "Lev tw."

    mpNum = null; try { switch (level) { case 2: mpNum = MediaPlayer.create(contxt, R.raw.l2); break; case 3: mpNum = MediaPlayer.create(contxt, R.raw.l3); break; case 4: mpNum = MediaPlayer.create(contxt, R.raw.l4); break; case 5: mpNum = MediaPlayer.create(contxt, R.raw.l5); break; case 6: mpNum = MediaPlayer.create(contxt, R.raw.l6); break; case 7: mpNum = MediaPlayer.create(contxt, R.raw.l7); break; case 8: mpNum = MediaPlayer.create(contxt, R.raw.l8); break; default: return; } MediaPlayer vLevel = MediaPlayer.create(contxt, R.raw.level); vLevel.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { public void onPrepared(MediaPlayer mp) { mp.start(); } }); vLevel.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { public void onCompletion(MediaPlayer mpl) { mpNum.start(); mpl.release(); } }); mpNum.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { public void onCompletion(MediaPlayer mp) { mp.release(); } }); } catch (Exception e) {} 

    In einem Versuch zu versuchen, dies zu beheben, habe ich SoundPool versucht, aber es funktioniert nicht; Ich höre nichts. Unten ist was ich getan habe, um zu versuchen, die Musik mit SoundPool zu spielen:

     SoundPool soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 100); soundPool.load(contxt, R.raw.song2, 1); AudioManager mgr = (AudioManager)contxt.getSystemService(Context.AUDIO_SERVICE); float streamVolumeCurrent = mgr.getStreamVolume(AudioManager.STREAM_MUSIC); float streamVolumeMax = mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC); float volume = streamVolumeMax; soundPool.play(1, volume, volume, 1, 5, 2); 

    AKTUALISIEREN

    Ich habe bemerkt, wenn ein Ton, der spielen sollte (aber nicht) hat diesen Fehler, der kommt:

     AudioPolicyManager: stopOutput() oldDevice 2 AudioPolicyManager: [getDeviceForStrategy] strategy : 0,forceUse(0) 

  • Was in TtsService könnte das Fehlen von onUtteranceCompleted () für playEarcon () erklären?
  • Java.lang.IllegalStateException in MediaPlayer.isplaying () -Methode
  • SurfaceView, SurfaceTexture und MediaPlayer kann nicht mein Video in Android spielen
  • Kann nicht android MediaPlayer onCompletion zum Feuer bekommen
  • Spielen von YouTube-Video in Android-App
  • Streaming Audio-Datei und Caching es
  • 5 Solutions collect form web for “Mediaplayer schneidet den Sound zu bald ab”

    Ich hatte das gleiche Problem und es war tatsächlich ein Müllsammler Problem! Wenn Sie die Instanz des Mediaplayers einer lokalen Variablen innerhalb einer Methode zuordnen, existiert die Instanz nach dem Verlassen dieser Methode nicht mehr, so dass GC jederzeit zufällig gelöscht werden kann.

    Um dies zu vermeiden, musst du mindestens einen Zeiger auf die Instanz woanders halten. Ich habe einen statischen Satz erstellt, um alle Zeiger zu halten, es sieht so aus:

     private static Set<MediaPlayer> activePlayers = new HashSet<MediaPlayer>(); 

    Dann folgt die Schaffung des Mediaplayers:

     MediaPlayer player = MediaPlayer.create(context, context.getResources().getIdentifier(id, "raw", pkg)); activePlayers.add(player); player.setOnCompletionListener(releaseOnFinishListener); player.start(); 

    Wo ReleaseOnFinishListener ist ein Zuhörer, der den Mediaplayer wie folgt komplett beendet, aber auch den Zeiger aus dem activePlayers-Set entfernt:

     MediaPlayer.OnCompletionListener releaseOnFinishListener = new MediaPlayer.OnCompletionListener() { public void onCompletion(MediaPlayer mp) { mp.release(); activePlayers.remove(mp); } }; 

    Ich hoffe das hilft dir.

    Ich habe gelesen, dass die SoundPool-Klasse eher für kurze Sounds wie MediaPlayer geeignet ist, aber das ist wohl nicht das Problem. ( Hier ist ein Link zu einem SoundPool-Beispiel).

    Können Sie auch den Code für Ihre Klick-Handler?

    Außerdem würde ich eher empfehlen, MedienPlayer-Instanzen zu veröffentlichen und wiederzuerlangen, eine MediaPlayer-Instanz zu verwenden und einfach die typische reset (), setDataSource (), prepare (), start () -Sequenz zu verfolgen, wann immer du sie wiederverwenden musst. Es wird effizienter sein, als jedes Mal eine neue Instanz zu konstruieren. Dh:

     MediaPlayer mp = new MediaPlayer(); AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.sound1); mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength(); mp.prepare(); mp.start(); //to reuse mp.reset(); afd = getResources().openRawResourceFd(R.raw.sound2); mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength(); mp.prepare(); mp.start(); 

    Nun, ich hatte die gleichen Probleme in einem Projekt und ist, weil in KindleFire die Klänge schneiden vor Ende so zu beheben, dass (mit der Freigabe) Ich habe eine Verzögerung in der Freigabe:

      mpNum.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { public void onCompletion(MediaPlayer mp) { // Add a handler delay new Timer().schedule(new TimerTask() { @Override public void run() { mp.release(); } }, DELAY_TIME); } }); 

    Es ist nicht die beste Lösung, aber ich denke, das wird dir vielleicht helfen.

    Das ist seltsam, und nicht eine gute Verlegenheit, aber die einzige Fix, die ich bisher gefunden habe. Wenn ich mp.setOnPreparedListener und mp.setOnCompletionListener entfernen und nur mp.start() , funktioniert es.

    Ich hatte dieses Problem und löste es, dass mein MediaPlayer-Objekt privat, so dass der Garbage Collector die Instanz nicht reinigt. Hoffe, es hilft jemandem!

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.