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);
}
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
SO là một trang web để đặt câu hỏi lập trình cụ thể. –
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