2011-02-03 1 views
0

Я разрабатываю приложение, в котором я использовал VideoView для воспроизведения видео. Я хочу, чтобы мне нужно было отобразить текст под воспроизводимым видео, и текст должен быть изменен по мере того, как воспроизводится видео в зависимости от прошедшего времени. Как SRT. Итак, как получить прошедшее время видео в Android? И когда мы приостанавливаем видео в соответствии с текстом, вы также должны быть приостановлены, и после этого, когда мы возобновляем видео, текст и следующий текст должны отображаться.Как отображать текст под видеороликом в android?

Любая помощь будет оценена по достоинству.


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    setContentView(R.layout.playing); 

    mVideoView = (VideoView)findViewById(R.id.VideoView); 
    uri = Uri.parse("android.resource://com.abhan.video/" + R.raw.abhan); 

    Date dt = new Date(); 
    mHours = dt.getHours(); 
    mMinutes = dt.getMinutes(); 
    mSeconds = dt.getSeconds(); 
    String curTime = mHours + ":"+ mMinutes + ":" + mSeconds; 

    mVideoView.setVideoURI(uri); 
    mVideoView.start(); 

    Runnable runnable = new CountDownRunner(); 
    myThread= new Thread(runnable); 
    myThread.start(); 

    mVideoView.setOnPreparedListener(new OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mp) { 
      Log.i("TAG", "On Prepared"); 
     } 
    }); 

    mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mp) { 
     Log.v("TAG", "On Completion"); 
     myThread.stop(); 
     Intent i = new Intent(Playing.this, VideoPlay.class); 
     startActivity(i); 
     finish(); 
     } 
    }); 
} 

class CountDownRunner implements Runnable { 
    public void run() { 
     while(!Thread.currentThread().isInterrupted()) { 
      try { 
       doWork(); 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       Thread.currentThread().interrupt(); 
       e.printStackTrace(); 
      } catch(Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

public void doWork() { 
    runOnUiThread(new Runnable() { 
     public void run() { 
      try { 
       mText = (TextView)findViewById(R.id.SetText); 
       Date dt = new Date(); 
       int hours = dt.getHours(); 
       int minutes = dt.getMinutes(); 
       int seconds = dt.getSeconds(); 
       String curTime = hours + ":"+ minutes + ":" + seconds; 
       if(minutes == mMinutes && seconds == mSeconds) { 
        mText.setText(getString(R.string.one)); 
       } else if(minutes == mMinutes && seconds == mSeconds+20) { 
        mText.setText(getString(R.string.two)); 
       } else if(minutes == mMinutes && seconds == mSeconds+38) { 
        mText.setText(getString(R.string.three)); 
       } else if(minutes == mMinutes && seconds == mSeconds+47) { 
        mText.setText(getString(R.string.four)); 
       } else if(minutes == mMinutes+1 && seconds == mSeconds2+2) { 
        mText.setText(getString(R.string.five)); 
       } else if(minutes == mMinutes+1 && seconds == mSeconds2+22) { 
        mText.setText(getString(R.string.six)); 
       } else if(minutes == mMinutes+2) { 
        mText.setText(getString(R.string.seven)); 
       } else if(minutes == mMinutes+2 && seconds == mSeconds2+2) { 
        mText.setText(""); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if ((!(android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.DONUT) 
      &&keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0)) 
    { 
     onBackPressed(); 
    } 
    return super.onKeyDown(keyCode, event); 
} 

public void onBackPressed() { 
    Intent intent = new Intent(Playing.this, VideoPlay.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 
    startActivity(intent); 
    finish(); 
    return; 
} 

Спасибо.

ответ

3

Разве это не VideoView's getCurrentPosition() Что вы ищете?

Чтобы изменить содержимое вашего TextView (или что бы вы ни хотели использовать), я бы установил Timer с достаточной частотой, чтобы обновить ваш «субтитр». Его TimerTask может получить время воспроизведения с помощью getCurrentPosition() и использовать карту для хранения значений сообщений и времени в качестве ключа.

Вот это и пример того, что я имею в виду:

00 - «начинается видео!»
05 - «что-то смешное»
12 - «Видео заканчивается!»

class MySubtitlePoster extends TimerTask{ 
    private VideoView video; 
    private TreeMap <Integer, String> messages; // populate it somewhere 

    public MySubtitlePoster(VideoView v) { 
     video = v; 
    } 

    public void run() { 
     int videoPos = video.getCurrentPosition(); 
     String messageToDisplay = messages.floorKey(new Integer(videoPos)); 
     // If all this is right, now you can get the message and post it, probably using a Handler 
    } 
} 

==========================================

Осмотрев свой полный код, который я могу дать вам более подробные советы, но кодирование вещь вашей работы, так что ...

Чтобы создать карту:

messages = new TreeMap(); 
messages.put(new Integer(0), getString(R.string.one)); 
messages.put(new Integer(20), getString(R.string.two)); 
... 
messages.put(new Integer(62), getString(R.string.four)); 

Чтобы сделать работу:

public void doWork(){ 
    runOnUiThread(new Runnable() { 
     public void run() { 
      try{ 
       mText = (TextView)findViewById(R.id.SetText); 
       //If it returns milliseconds, divide by 1000 
       int playTime = mVideoView.getCurrentPosition(); 
       String textValue = messages.ceilingEntry(new Integer(playtime)).getValue(); 
       mText.setText(textValue); 
      }catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

И, наконец, использовать Timer вместо этого (There is an article here about Timers and UI):

public void run() 
{ 
    while(!Thread.currentThread().isInterrupted()) 
    { 
     try 
     { 
      doWork(); 
      Thread.sleep(1000); 
     }catch (InterruptedException e) 
     { 
      Thread.currentThread().interrupt(); 
      e.printStackTrace(); 
     }catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

Это действительно уродливые и неэффективно.

Итак, счастливое кодирование, и, если вы обнаружите, что какое-то вмешательство пытается решить его самостоятельно, не потому, что я не любезно помогаю, но это ваш лучший шанс улучшить свои навыки.

С уважением, Мануэль.

+0

@ Ketan, лучший способ поблагодарить - ПРИНИМАЙТЕ ответ и проголосуйте за те ответы, которые были вам полезны. Так работает сайт. – mdelolmo

+0

Привет, mdelolmo, я принял ответ. Благодарю. –