मैं ExoPlayer
पर प्रगति परिवर्तनों की निगरानी कैसे कर सकता हूं?
मैंने एक छिपा MediaController
लागू करने और setOnSeekBarChangeListener
विधियों को ओवरराइड करने का प्रयास किया, लेकिन अब सफलता के बिना। मैं सोच रहा हूं कि ExoPlayer
प्रगति को सुनने का कोई और तरीका है या नहीं।एंड्रॉइड एक्सपोप्लेयर ऑन प्रोग्रेस चेंज
उत्तर
सुनिश्चित नहीं है कि यह सबसे अच्छा तरीका है, लेकिन मैंने इसे TrackRenderer
ओवरलोड करके हासिल किया।
मैं videoPlayer.getBufferedPercentage()
उपयोग कर रहा हूँ, लेकिन आप केवल का उपयोग कर TrackRenderer
के द्वारा प्रतिशत खुद के रूप में अच्छी तरह की गणना करने, सक्षम हो सकता है getBufferedPositionUs()
और getDurationUs()
public interface ProgressListener {
public void onProgressChange(long progress);
}
public class CustomVideoRenderer extends MediaCodecVideoTrackRenderer {
long progress = 0;
private final CopyOnWriteArraySet<ProgressListener> progressListeners = new CopyOnWriteArraySet();
// [...]
// Skipped constructors
// [...]
public void doSomeWork(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException {
super.doSomeWork(positionUs, elapsedRealtimeUs);
long tmpProgress = videoPlayer.getBufferedPercentage();
if (tmpProgress != this.progress) {
this.progress = tmpProgress;
for (ProgressListener progressListener : this.progressListeners) {
progressListener.onProgressChange(progress);
}
}
}
public void addProgressListener(ProgressListener listener) {
this.progressListeners.add(listener);
}
}
मैं जानता हूँ कि इस सवाल का बहुत पुराना है। लेकिन, ExoPlayer
को लागू करते समय मैंने इस पर उतरा। यह उन लोगों की मदद करना है जो बाद में ऐसा करते हैं :)
इसलिए, मैंने प्लेबैक की प्रगति को ट्रैक करने के लिए निम्न विधियों का पालन किया है। यह ExoPlayer
Google डॉक्स में किया गया है। यह आवश्यकतानुसार काम करता है।
private void updateProgressBar() {
long duration = player == null ? 0 : player.getDuration();
long position = player == null ? 0 : player.getCurrentPosition();
if (!dragging) {
mSeekBar.setProgress(progressBarValue(position));
}
long bufferedPosition = player == null ? 0 : player.getBufferedPosition();
mSeekBar.setSecondaryProgress(progressBarValue(bufferedPosition));
// Remove scheduled updates.
handler.removeCallbacks(updateProgressAction);
// Schedule an update if necessary.
int playbackState = player == null ? Player.STATE_IDLE : player.getPlaybackState();
if (playbackState != Player.STATE_IDLE && playbackState != Player.STATE_ENDED) {
long delayMs;
if (player.getPlayWhenReady() && playbackState == Player.STATE_READY) {
delayMs = 1000 - (position % 1000);
if (delayMs < 200) {
delayMs += 1000;
}
} else {
delayMs = 1000;
}
handler.postDelayed(updateProgressAction, delayMs);
}
}
private final Runnable updateProgressAction = new Runnable() {
@Override
public void run() {
updateProgressBar();
}
};
हम updateProgressAction
भीतर updateProgressBar()
फोन बार-बार प्लेबैक बंद हो जाता है जब तक: Google ExoPlayer Docs
updateProgressBar()
में
चेकआउट PlaybackControlView.java
SeekBar
प्रगति को अद्यतन करने के कार्य है। जब भी कोई राज्य परिवर्तन होता है तो समारोह को पहली बार बुलाया जाता है। हम removeCallbacks(Runnable runnable)
का उपयोग करते हैं ताकि देखभाल के लिए हमेशा एक updateProgressAction
हो।
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
updateProgressBar();
}
आशा है कि इससे मदद मिलती है!
यह काम करता है कम से कम Exoplayer 2. साथ
चार प्लेबैक राज्यों है: STATE_IDLE, STATE_BUFFERING, STATE_READY और STATE_ENDED।
प्लेबैक स्थिति की जांच करना आसान है। कम से कम दो समाधान हैं: if-statement या switch-statement।
जो भी प्लेबैक स्थिति आप पर जा रही है, वह आपकी विधि निष्पादित कर सकती है या उदाहरण के लिए कुछ और सेट कर सकती है।
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
if (playbackState == ExoPlayer.STATE_ENDED) {
showControls();
Toast.makeText(getApplicationContext(), "Playback ended", Toast.LENGTH_LONG).show();
}
else if (playbackState == ExoPlayer.STATE_BUFFERING)
{
progressBar.setVisibility(View.VISIBLE);
Toast.makeText(getApplicationContext(), "Buffering..", Toast.LENGTH_SHORT).show();
}
else if (playbackState == ExoPlayer.STATE_READY)
{
progressBar.setVisibility(View.INVISIBLE);
}
}
क्या आप अपने समाधान के बारे में बेहतर विवरण प्रदान कर सकते हैं? –
मुझे उम्मीद थी कि मदद करता है। – user7459244
(पूर्व के लिए SimpleExoPlayer।) अपने मौजूदा खिलाड़ी वर्ग का विस्तार और
public interface PlayerEventsListener {
void onSeek(int from, int to);
void onProgressUpdate(long progress);
}
private PlayerEventsListener mListener;
private Handler mHandler;
private Runnable mProgressUpdater;
private boolean isUpdatingProgress = false;
public SomePlayersConstructor(Activity activity, /*...*/) {
//...
mListener = (PlayerEventsListener) activity;
mHandler = new Handler();
mProgressUpdater = new ProgressUpdater();
}
// Here u gain access to seek events
@Override
public void seekTo(long positionMs) {
mListener.onSeek(-1, (int)positionMs/1000);
super.seekTo(positionMs);
}
@Override
public void seekTo(int windowIndex, long positionMs) {
mListener.onSeek((int)getCurrentPosition()/1000, (int)positionMs/1000);
super.seekTo(windowIndex, positionMs);
}
// Here u gain access to progress
public void startProgressUpdater() {
if (!isUpdatingProgress) {
mProgressUpdater.run();
isUpdatingProgress = true;
}
}
private class ProgressUpdater implements Runnable {
private static final int TIME_UPDATE_MS = 500;
@Override
public void run() {
mListener.onProgressUpdate(getCurrentPosition());
mHandler.postDelayed(mProgressUpdater, TIME_UPDATE_MS);
}
}
फिर जोड़ने खिलाड़ी गतिविधि के अंदर बस इंटरफ़ेस को लागू और player.startProgressUpdater();
साथ अद्यतन शुरू यह स्पष्ट वहाँ isn बनाने के लिए, प्रगति कार्यक्रम के लिए EventListener में एक निर्माण नहीं है, लेकिन आप हैंडलर को कॉल कर सकते हैं।आप अंदर postDelayed UpdateProgress() फ़ंक्शन अधिक जानकारी के लिए वर्तमान प्रगति
private void updateProgress(){
//get current progress
long position = player == null ? 0 : player.getCurrentPosition();
//updateProgress() will be called repeatedly, you can check
//player state to end it
handler.postDelayed(updateProgressAction,1000)
}
private final Runnable updateProgressAction = new Runnable() {
@Override
public void run() {
updateProgress();
}
};
प्राप्त करने के लिए, Exoplayer अंदर PlaybackControlView.java का स्रोत देखने
बस, अपने मेरे लिए काम कर इस प्रयास करें:
handler = new Handler();
runnable = new Runnable() {
@Override
public void run() {
progressbar.setProgress((int) ((exoPlayer.getCurrentPosition()*100)/exoPlayer.getDuration()));
handler.postDelayed(runnable, 1000);
}
};
handler.postDelayed(runnable, 0);
यहां,
getCurrentPosition()
: वर्तमान प्लेबैक वापस करें मिलीसेकंड में के स्थिति।getDuration()
: मिलीसेकंड में ट्रैक की अवधि।
आपके उत्तर के लिए धन्यवाद –
केवल, MotionEvent.ACTION_UP
SeekBar exo_progress = (SeekBar) findViewById(R.id.exo_progress);
exo_progress.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
//put your code here!!
}
return false;
}
});
- 1. एंड्रॉइड रेट्रोफिट - ऑन प्रोग्रेस अपडेट प्रगति अधिसूचना
- 2. एंड्रॉइड ओरिएंटेशन चेंज ऑन कॉरेट
- 3. एंड्रॉइड मीडियाप्लेयर एक्सपोप्लेयर
- 4. एक्सपोप्लेयर
- 5. jQuery ट्रिगर ऑन चेंज
- 6. एंजाइम एक ऑन चेंज इवेंट
- 7. रिएक्ट-राउटर ऑन चेंज हुक
- 8. प्रतिक्रिया: बाहरी ऑन चेंज इवेंट
- 9. सामग्री पर्यवेक्षक ऑन चेंज विधि कर्सर
- 10. एक्सपोप्लेयर कैश
- 11. एंड्रॉइड बीएलई ऑन कैरेक्टरिस्टिक रीड एंड ऑन कैरेक्टरिस्टिक चेंज कभी नहीं
- 12. सेलेनियम ऑन चेंज काम नहीं कर रहा
- 13. पायथन और gtk3 क्लिपबोर्ड ऑन चेंज
- 14. "ऑन चेंज" ईवेंट बढ़ाएं जब पॉपअप विंडो
- 15. क्या कोई ऑन-डॉक्यूमेंट चेंज इवेंट है?
- 16. लोकेल: ऑन कॉन्फ़िगरेशन चेंज नहीं किया गया
- 17. प्रोग्रेस
- 18. "ऑन कॉन्फिगरेशन चेंज()" के बाद क्या कहा जाता है?
- 19. एंड्रॉइड ओरिएंटेशन चेंज
- 20. एंड्रॉइड अधिसूचनाडेटासेट चेंज
- 21. एंड्रॉइड ओरिएंटेशन चेंज
- 22. ऑन कॉन्फ़िगरेशन चेंज() कीबोर्ड के लिए फायरिंग नहीं है
- 23. एंड्रॉइड सीकबार सेट प्रोग्रेस मेरे मीडियाप्लेयर को
- 24. एंड्रॉइड ऑन टच ऑनक्लिक और ऑन लोंगक्लिक
- 25. ऑन होवर लिस्टनर एंड्रॉइड
- 26. एंड्रॉइड ऑनक्रेट ऑन रीज़्यूम
- 27. एंड्रॉइड ऑन न्यूइन्टेंट को
- 28. एंड्रॉइड - ऑन पॉज़
- 29. ऑन टच, ऑनलॉन्ग एंड्रॉइड
- 30. कॉम्बोबॉक्स ऑन चेंज घटना तब होती है जब आइटम
कौन वास्तव में मतलब है कि आप मतदान कर रहे हैं वास्तव में एक सही समाधान का एक प्रकार हो रहा है जो राज्य – Thomas
@Thomas साथ onTouchListener उपयोग करें, क्योंकि exoplayer ही प्रगति की घटनाओं भी उत्पन्न करता है अक्सर यूआई के लिए। – kot331107
@AnkitAggarwal मेरे पास कस्टम प्रगति पट्टी है, मैं वीडियो प्लज़ सहायता करते समय प्रगति कैसे अपडेट कर सकता हूं –