2011-08-29 31 views
7

Tôi đã làm việc hàng giờ để phát triển trình phát video trực tuyến thích hợp trong Android và khá thành công trong việc tạo trình phát có thể phát các nội dung nhỏ như bài hát, Đoạn giới thiệu v.v. Nhưng người chơi cho thấy một số hành vi bất thường đối với nội dung lớn như Phim và chương trình truyền hình vì nó yêu cầu nhiều luồng, trình phát bắt đầu tụt hậu cho dữ liệu đó. Bất kỳ ai có thể giúp tôi ra để crack các giải pháp cho một vấn đề như vậy.Làm cách nào để tạo trình phát video trực tuyến cho nội dung lớn?

Cảm ơn trước ...

Dưới đây là nguồn:

public class player extends Activity implements OnErrorListener, 
    OnPreparedListener { 



/** Called when the activity is first created. */ 
private static final int UPDATE_FREQUENCY = 500; 

private static final int STEP_VALUE = 4000; 

private static final int DIALOG_KEY = 0; 

private TextView currentTime, duration; 

private VideoView videoView; 

private SeekBar seekbar = null; 

private View mediacontroller; 

private ProgressDialog progressDialog = null; 

private ImageButton playButton = null; 

private ImageButton prevButton = null; 

private ImageButton nextButton = null; 

private boolean isMoveingSeekBar = false; 

private boolean isMediaCtrlShown = false; 

private final Handler handler = new Handler(); 

private boolean isStarted = true; 

private String currentFile = "singham_320b"; 

private boolean isCustomSeekButtonClick = false; 

private boolean isPauseButtonClick = false; 

private static boolean isMyDialogShowing = false; 

private static int percentageBuffer = 0; 

private int mpCurrentPosition; 

int hh = 00, mm = 00, ss = 00, ms = 00; 

int i = 0; 

int previouPosition = 0; 

private Runnable onEverySecond=new Runnable() { 
     public void run() { 
       if (videoView!=null) { 
         seekbar.setProgress(videoView.getCurrentPosition()); 
       } 

       if (!isPauseButtonClick) { 
         mediacontroller.postDelayed(onEverySecond, 1000); 
       } 
     } 
}; 

private final Runnable updatePositionRunnable = new Runnable() 
{ 
    public void run() 
    { 
     updatePosition(); 
    } 
}; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.main); 

    setUpMyDialog(); 
    showMyDialog(); 

    videoView = (VideoView) findViewById(R.id.videoview); 

    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    seekbar = (SeekBar) findViewById(R.id.seekbar); 

    currentTime = (TextView) findViewById(R.id.currentTime); 

    playButton = (ImageButton) findViewById(R.id.play); 

    prevButton = (ImageButton) findViewById(R.id.prev); 

    nextButton = (ImageButton) findViewById(R.id.next); 

    duration = (TextView) findViewById(R.id.duration); 

    mediacontroller = findViewById(R.id.mediacontroller); 


    videoView.setOnErrorListener(this); 

    videoView.setOnPreparedListener(this); 

    videoView.setOnTouchListener(new View.OnTouchListener() 
    { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) 
     { 

      if (!isMediaCtrlShown) 
      { 
       mediacontroller.setVisibility(View.GONE); 

       isMediaCtrlShown = true; 

      } 
      else 
      { 
       mediacontroller.setVisibility(View.VISIBLE); 

       isMediaCtrlShown = false; 
      } 
      return false; 
     } 
    }); 

    Uri video = Uri.parse("http://wpc.1B42.edgecastcdn.net/001B42/mobile/songs/pyaar_ka_punchnama/life_sahi_hai_320b.mp4"); 

    videoView.setVideoURI(video); 

    seekbar.setOnSeekBarChangeListener(seekBarChanged); 

    playButton.setOnClickListener(onButtonClick); 

    nextButton.setOnClickListener(onButtonClick); 

    prevButton.setOnClickListener(onButtonClick); 

} 

@Override 
public boolean onError(MediaPlayer mp, int what, int extra) { 
    // TODO Auto-generated method stub 
    return false; 
} 

public void calculateTime(int ms) { 

    ss = ms/1000; 

    mm = ss/60; 

    ss %= 60; 

    hh = mm/60; 

    mm %= 60; 

    hh %= 24; 

} 

@Override 
public void onPrepared(MediaPlayer mp) 
{ 
    dismissMyDialog(); 

    videoView.start(); 

    mediacontroller.setVisibility(View.VISIBLE); 

    isMediaCtrlShown = false; 

    seekbar.setProgress(0); 

    seekbar.setMax(videoView.getDuration()); 


    ms = videoView.getDuration(); 

    calculateTime(ms); 

    duration.setText("" + hh + ":" + mm + ":" + ss); 

    ms = videoView.getCurrentPosition(); 

    calculateTime(ms); 

    currentTime.setText("" + hh + ":" + mm + ":" + ss); 

    playButton.setImageResource(android.R.drawable.ic_media_pause); 

    updatePosition(); 

    isStarted = true; 

    mp.setOnBufferingUpdateListener(new OnBufferingUpdateListener() 
    { 
     // show updated information about the buffering progress 
     @Override 
     public void onBufferingUpdate(MediaPlayer mp, int percent) 
     { 
      Log.d(this.getClass().getName(), "percent: " + percent); 
      percentageBuffer = percent; 
      secondarySeekBarProgressUpdater(percent); 
      // progress.setSecondaryProgress(percent); 
      if (i == 0) 
      { 
       i = i + 1; 

       previouPosition = mp.getCurrentPosition(); 
      } 
      else if (i == 1) 
      { 
       if (mp.getCurrentPosition() == previouPosition) 
       { 
        if (!isPauseButtonClick) 
        { 

         showMyDialog(); 
         if (percent == 100) 
         { 
          dismissMyDialog(); 
         } 
        } 
       } 
       else 
       { 
        i = 0; 

        previouPosition = 0; 

        dismissMyDialog(); 
       } 
      } 
      else if (isCustomSeekButtonClick) 
      { 
       isCustomSeekButtonClick = false; 

       if (mpCurrentPosition == mp.getCurrentPosition()) 
       { 

        showMyDialog(); 
        if (percent == 100) 
        { 
         dismissMyDialog(); 
        } 
       } 
       else 
       { 
        dismissMyDialog(); 
       } 
      } 
     } 
    }); 

    mp.setOnSeekCompleteListener(new OnSeekCompleteListener() 
    { 
     public void onSeekComplete(MediaPlayer mp) 
     { 
      if (mp.isPlaying()) 
      { 

      } 
      else 
      { 
       onStart(); 

       onPause(); 

       onStart(); 

      } 

     } 
    }); 
} 


private SeekBar.OnSeekBarChangeListener seekBarChanged = new SeekBar.OnSeekBarChangeListener() 
{ 
    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) 
    { 
     isMoveingSeekBar = false; 
    } 

    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) 
    { 
     isMoveingSeekBar = true; 
    } 

    @Override 
    public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) 
    { 
     Log.e("",""+progress+""+percentageBuffer); 

     if (fromUser) 
     { 
      isCustomSeekButtonClick = fromUser; 

      videoView.seekTo(progress); 

      mpCurrentPosition = progress; 

      Log.e("OnSeekBarChangeListener", "onProgressChanged"); 
     } 
     if (isMoveingSeekBar) 
     { 
      videoView.seekTo(progress); 

      Log.i("OnSeekBarChangeListener", "onProgressChanged"); 
     } 
    } 
}; 
private View.OnClickListener onButtonClick = new View.OnClickListener() { 

    @Override 
    public void onClick(View v) 
    { 
     switch (v.getId()) 
     { 
     case R.id.play: 
     { 
      if (videoView.isPlaying()) 
      { 
       handler.removeCallbacks(updatePositionRunnable); 

       isPauseButtonClick = true; 

       videoView.pause(); 

       playButton.setImageResource(android.R.drawable.ic_media_play); 

      } 
      else 
      { 
       if (isStarted) 
       { 
        videoView.start(); 
        isPauseButtonClick = false; 
        playButton.setImageResource(android.R.drawable.ic_media_pause); 

        updatePosition(); 
       } 
       else 
       { 
        startPlay(currentFile); 
        isPauseButtonClick = false; 
        videoView.start(); 
       } 
      } 

      break; 
     } 
     case R.id.next: 
     { 
      int seekto = videoView.getCurrentPosition() + STEP_VALUE; 

      if (seekto > videoView.getDuration()) 

       seekto = videoView.getDuration(); 

      videoView.pause(); 

      videoView.seekTo(seekto); 
      /* 
      * try { Thread.sleep(15000); } catch (InterruptedException e) { 
      * // TODO Auto-generated catch block e.printStackTrace(); } 
      */ 
      // player.pause(); 
      videoView.start(); 

      break; 
     } 
     case R.id.prev: { 
      int seekto = videoView.getCurrentPosition() - STEP_VALUE; 

      if (seekto < 0) 
       seekto = 0; 

      videoView.pause(); 

      videoView.seekTo(seekto); 

      // player.pause(); 
      videoView.start(); 

      break; 
     } 
     } 
    } 
}; 

private void updatePosition() 
{ 
    handler.removeCallbacks(updatePositionRunnable); 

    seekbar.setProgress(videoView.getCurrentPosition()); 

    ms = videoView.getCurrentPosition(); 

    calculateTime(ms); 

    currentTime.setText("" + hh + ":" + mm + ":" + ss); 

    handler.postDelayed(updatePositionRunnable, UPDATE_FREQUENCY); 
} 

private void startPlay(String file) 
{ 
    Log.i("Selected: ", file); 

    // selelctedFile.setText(file); 
    seekbar.setProgress(0); 

    videoView.stopPlayback(); 

    videoView.start(); 

    seekbar.setMax(videoView.getDuration()); 

    playButton.setImageResource(android.R.drawable.ic_media_pause); 

    updatePosition(); 

    isStarted = true; 
} 
void setUpMyDialog() 
{ 
    if (progressDialog == null) 
    { 
     progressDialog = (ProgressDialog) onCreateDialog(DIALOG_KEY); 

     progressDialog = new ProgressDialog(player.this); 
     progressDialog.setMessage("Loading..."); 
     progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
    } 
} 

void showMyDialog() 
{ 
    Log.e("showMyDialog***", "****" + isMyDialogShowing); 

    if (!isMyDialogShowing) 
    { 
     isMyDialogShowing = true; 

     Log.e("showMyDialog: true***", "****" + isMyDialogShowing); 

     if (progressDialog != null && !progressDialog.isShowing()) 
     { 
      Log.e("showMyDialog: true***", "****progressDialog" + progressDialog.isShowing()); 

      progressDialog.show(); 
     } 
     else if(progressDialog == null) 
     { 
      setUpMyDialog(); 
      progressDialog.show(); 
     } 
    } 
} 

void dismissMyDialog() 
{ 
    Log.e("dismissMyDialog***", "****"); 

    if (progressDialog != null && progressDialog.isShowing()) 
    { 
     progressDialog.dismiss(); 
     progressDialog = null; 

     isMyDialogShowing = false; 
    } 
} 

void killMyDialog() 
{ 
    isMyDialogShowing = false; 
} 
private void secondarySeekBarProgressUpdater(int percent){ 
    seekbar.setSecondaryProgress(percent); 
} 
+0

Nếu không nói cho chúng tôi biết bạn đã làm gì cho đến giờ và đăng mã bạn hiện đang sử dụng thì rất hiếm khi có ai ở đây có thể giải quyết vấn đề đó. – FoamyGuy

+0

SO là một trang web để đặt câu hỏi lập trình cụ thể. –

+1

Tôi biết rằng SO là đặc biệt cho câu hỏi lập trình, tôi không yêu cầu mã cụ thể nhưng logic cốt lõi để tạo trình phát trực tuyến như vậy, tôi cũng đang thêm mã của mình được sử dụng để tạo trình phát của mình – Jitu

Trả lời

2

trực giác của tôi về vấn đề này cho biết bạn có thể nhìn ra một cái gì đó bằng cách tập trung vào các cầu thủ, đặc biệt là kể từ khi nó hoạt động tốt cho nội dung nhỏ hơn . Bạn có nghĩ về việc kiểm tra máy chủ trực tuyến không? Nếu máy chủ không phải là nhiệm vụ của streaming các tập tin lớn hơn thì có rất ít người chơi có thể làm gì về nó. Hơn nữa, bạn có thể điều chỉnh kích thước gói tin từ máy chủ để giúp người chơi quản lý phát lại bằng cách sử dụng các 'bites' nhỏ hơn (tha thứ cho trò chơi) của phương tiện tại một thời điểm. Hãy thử sử dụng máy chủ phát trực tuyến miễn phí của Apple Darwin. Có một phiên bản cho Apache, Windows và các phiên bản khác, và nó rất có thể cấu hình được. Có được cho mình một tập hợp các tệp có kích thước khác nhau và cố gắng thiết lập ở mức phát lại kích thước nào bắt đầu thất bại. Con số đó sẽ cung cấp cho bạn một đầu mối lớn về vấn đề nằm ở đâu, có thể là kích thước gói máy chủ được truyền đi, bộ nhớ khả dụng trong môi trường Android hoặc ở nơi khác. Dù con số này, hãy thử thiết lập một kích thước gói nhỏ hơn từ máy chủ. Điều này sẽ cung cấp cho người chơi của bạn ít việc phải làm và hy vọng cải thiện khả năng phát lại.

Bạn có thể lấy máy chủ Darwin từ nhiều nơi trực tuyến. Here is one such link. Wikipedia cũng có một số thông tin hữu ích và một số liên kết cho máy chủ này, find them here. Chúc may mắn với nghiên cứu của bạn về điều này.

Frank.

+0

Chúng tôi quản lý phát video độc đáo bằng cách mã hóa video đúng cách. Cảm ơn vì đã trả lời.. :-) – Jitu

Các vấn đề liên quan