Можно ли отображать видеоинформацию из потока RTSP в пользовательском интерфейсе приложения Android - PullRequest
0 голосов
/ 23 марта 2010

Мне удалось получить работающий видеоплеер, который может передавать ссылки по протоколу RTSP, однако я не уверен, как отображать текущее положение видео в пользовательском интерфейсе, я использовал вызовы getDuration и getCurrentPosition, сохранил эту информацию в строке ипытался отобразить его в пользовательском интерфейсе, но, похоже, он не работает

**in main.xml:**
    TextView android:id="@+id/player"
           android:layout_width="wrap_content" 
           android:layout_height="wrap_content"
           android:layout_margin="1px"
           android:text="@string/cpos"
          />

**in strings.xml:** 

string name="cpos">"" /string>


**in Player.java**

private void playVideo(String url) {
  try {
   media.setEnabled(false);

   if (player == null) {
    player = new MediaPlayer();
    player.setScreenOnWhilePlaying(true);
   } else {
    player.stop();  
    player.reset();
   }

   player.setDataSource(url);
   player.getCurrentPosition();
   player.setDisplay(holder);
   player.setAudioStreamType(AudioManager.STREAM_MUSIC);
   player.setOnPreparedListener(this);
   player.prepareAsync();
   player.setOnBufferingUpdateListener(this);
   player.setOnCompletionListener(this);

  } catch (Throwable t) {
   Log.e(TAG, "Exception in media prep", t);
   goBlooey(t);
   try {
    try {
     player.prepare();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    Log.v(TAG, "Duration: ===> " + player.getDuration());
   } catch (IllegalStateException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();

   }
  }
 }


private Runnable onEverySecond = new Runnable() {
  public void run() {
   if (lastActionTime > 0
    && SystemClock.elapsedRealtime() - lastActionTime > 3000) {
    clearPanels(false);
   }

   if (player != null) {
    timeline.setProgress(player.getCurrentPosition());
    //stores getCurrentPosition as a string
    cpos = String.valueOf(player.getCurrentPosition());
    System.out.print(cpos);

   }

   if (player != null) {
    timeline.setProgress(player.getDuration());
    //stores getDuration as a string
    cdur = String.valueOf(player.getDuration());
    System.out.print(cdur);
   }

   if (!isPaused) {
    surface.postDelayed(onEverySecond, 1000);
   }
  }
 };

Ответы [ 3 ]

0 голосов
/ 23 марта 2010

Проверьте ответ SDP от сервера, чтобы убедиться, что он отправляет длительность в ответе (живые потоки не имеют распознаваемого времени, и это может привести к тому, что клиент не предоставит эту информацию.)

Например, прямая трансляция будет выглядеть так:

a=range:npt=0-

В то время как клип VoD должен выглядеть следующим образом:

a=range:npt=0-399.1680

Если getCurrentPosition() не работает, но вы знаете длительность (либоgetDuration() работает, или у вас есть альтернативный способ получения этой информации, вы можете рассчитать ее, наблюдая за событиями буферизации и отслеживая это сами. Ваш подход является более желательным, чем этот.

0 голосов
/ 20 июля 2010

Если я правильно понял, вы хотите показать в прошедшем времени TextView, например, чч: мм: сс

Если так, я расскажу вам, как это сделать.

private TextView mElapsedTimeText;
private VideoView mVideoView;
private Thread mThread;


@Override
public void onCreate(Bundle savedInstanceState) {
    /* here goes your code */

    // let's assume that your IDs are elapsedId and videoId
    mElapsedTimeText = (TextView) findViewById(R.id.elapsedId);
    mVideoView = (VideoView) findViewById(R.id.videoId);


    mThread = new Thread() {
        @Override
        public void run() {
            mElapsedTime.setText(getNiceString());
            mVideoView.postDelayed(mThread, 1000);
        }
    }

    /* here goes your code */
}

public String getNiceString() {
    String result = "";
    int position = mVideoView.getCurrentPosition();

    /* here goes your code */

    //result is hh:mm:ss formatted string
    return result;
}

@Override
public void onPrepared(MediaPlayer mp) {
    /* here goes your code */

    // you have to trigger the process somewhere
    mVideoView.postDelayed(mThread, 1000);

    /* here goes your code */
}       

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

Я надеюсь, что вы или кто-то еще сочтете этот пост полезным.

С уважением,

Игорь

0 голосов
/ 23 марта 2010

Ваш фрагмент кода выглядит очень похоже на мой vidtry образец.getCurrentPosition() и getDuration() работают для потоковой передачи HTTP, например, для использования при обновлении индикатора выполнения.

Я не пробовал vidtry с видеопотоком RTSP, в основном потому, что не знаю ни одного.

...