2016-07-25 2 views
2

У меня очень простое приложение, которое ищет при позиционировании определенную позицию mp3 и запускает MediaPlayer с этой позиции. Я вижу, однако, что при воспроизведении позиция поиска всегда сдвигается примерно на 2-3 секунды вперед или назад. Я пробовал mp3 с 16, 32 и переменными битрейтами. Только файлы wav работают нормально, но они непрактичны из-за их размера для моей цели. Интересно, если я вычислил поиск вручную (16 * 24000 в случае 16-битного mp3, например) и передал его как смещение к mp.setDataSource, он работает нормально. Я не могу использовать это, потому что мне также нужен TimedText в моем приложении, который не работает со смещением. Было бы очень полезно помочь.Android MediaPlayer seekTo не ищет нужную позицию

Вот полный код:

package com.example.mediaplayertest; 

import java.io.FileDescriptor; 
import java.io.IOException; 

import android.app.Activity; 
import android.content.res.AssetFileDescriptor; 
import android.media.AudioManager; 
import android.media.MediaPlayer; 
import android.os.Bundle; 

public class MainActivity extends Activity implements MediaPlayer.OnSeekCompleteListener{ 
    static MediaPlayer mp = new MediaPlayer(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     try { 
      AssetFileDescriptor afd = getAssets().openFd("English text only.mp3"); 
      long length = afd.getLength(); 
      FileDescriptor fd = afd.getFileDescriptor(); 
      mp.reset(); 
      mp.setDataSource(fd, 0, length); 

      afd.close(); 
      mp.setOnSeekCompleteListener(this); 
      mp.setAudioStreamType(AudioManager.STREAM_MUSIC); 
      mp.prepare(); 

      mp.seekTo(24000); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onSeekComplete(MediaPlayer mp) { 
     int pos = mp.getCurrentPosition(); 
     //debug shows the pos value correctly as 24000 
     mp.start(); 
    } 
} 
+0

Вы взглянули на мой ответ? –

ответ

0

Ваше ручное вычисление для смещения в байтах, который 16x24 = 384 КБ. Если mp3 составляет 16 кбит/с, тогда вы примерно ищете 192 секунды! Принимая во внимание, что вы даете 24 секунды при вызове seekTo(). Какую позицию вы хотите?

+0

Спасибо за ваш ответ. На самом деле, я не задал свой вопрос должным образом. Битрейт mp3, который я пробовал, был 128 и 256 кбит/с, а не 16 и 32, как я упоминал по ошибке в моем вопросе. В результате проб и ошибок я обнаружил, что для 128 кбит/с mp3, чтобы вычислить смещение, мне нужно умножить на 16 и на 256 кбит/с на 32. Таким образом, я установил смещение 24000X16 для 128 Кбит/с mp3 для поиска 24-й секунды , Если я дам аргумент 24000 seekTo, ожидается, что он должен переместить начальную точку воспроизведения на 24 секунды независимо от битрейта, что не происходит, как видно из вывода кода. – vierzig

Смежные вопросы