2012-01-23 8 views
9

विवरण किसी भी बिंदु से ऑडियो स्ट्रीमिंग जारी रखने के लिए: एक ऑडियो प्लेयर के लिएकैसे ऑडियो स्ट्रीम की अवधि हो और

मैं निम्नलिखित है कोड। मैं प्रोग्रेस बार (0-से-mediaplayer.getDuration() के बीच) पर क्लिक करके किसी भी अवधि से ऑडियो प्लेबैक जारी रख सकता हूं। यह ऑडियो प्लेबैक के लिए पूरी तरह से काम कर रहा है। ऑडियो स्ट्रीमिंग में

समस्या:

  • जब मैं इसे सही ढंग से स्ट्रीमिंग शुरू होता है एक इंटरनेट सर्वर से एक ऑडियो फ़ाइल (जैसे कि S3-बाल्टी) स्ट्रीम।
  • लेकिन मीडियाप्लेयर.getDuration() और mediaPlayer.getCurrentPosition() गलत मान लौटें। स्ट्रीमिंग की शुरुआत में MediaPlayer.getCurrentPosition() 5 घंटे देता है।
  • इसके कारण मैं स्ट्रीम (0-टू-स्ट्रीम अवधि) की निर्दिष्ट अवधि से ऑडियो स्ट्रीमिंग जारी रखने में सक्षम नहीं हूं।

सवाल:

  1. मैं कैसे एक ऑडियो स्ट्रीम की अवधि प्राप्त कर सकते हैं
  2. मैं कैसे एक निर्दिष्ट अवधि से ऑडियो स्ट्रीमिंग जारी रख सकते हैं। 1012 मिनट की अवधि के लिए उदाहरण के लिए, मैं 6 वें मिनट से स्ट्रीमिंग शुरू करना चाहता हूं।

कोड:

public class MyAudioPlayer extends Activity 
implements OnClickListener{ 


    MediaPlayer mediaPlayer = null; 
    private boolean isPaused=false; 
    private boolean isStop = true; 

    String filePath = null; 
    String productName = null; 

    ImageButton btnPlay = null; 
    ImageButton btnPause = null; 
    ImageButton btnReset = null; 
    ImageButton btnStop = null; 

    AudioManager audioManager = null; 
    SeekBar volControl = null; 
    SeekBar progressControl = null; 
    TextView progressText = null; 
    long durationInMillis = -1; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.ltd_audio_player); 

     volControl = (SeekBar)findViewById(R.id.player_volume); 
     progressControl = (SeekBar)findViewById(R.id.player_seekbar); 
     progressText = (TextView) findViewById(R.id.player_progress_text); 

     btnPlay = (ImageButton) findViewById(R.id.ic_player_play); 

     btnPause = (ImageButton) findViewById(R.id.ic_player_pause); 

     btnReset = (ImageButton) findViewById(R.id.ic_player_reset); 

     btnStop = (ImageButton) findViewById(R.id.ic_player_stop); 

     btnPlay.setOnClickListener(this); 
     btnPause.setOnClickListener(this); 
     btnReset.setOnClickListener(this); 
     btnStop.setOnClickListener(this); 

     filePath = getIntent().getExtras().getString("localPath"); 

     this.setPlayer(); 
     this.resetAndStartPlayer(); 


    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     isPaused=false; 
     progressText.postDelayed(onEverySecond, 1000); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 

     isPaused=true; 
    } 
    private void setProgressControl() { 
     int maxVolume = mediaPlayer.getDuration(); 
     int curVolume = mediaPlayer.getCurrentPosition(); 

     progressControl.setMax(maxVolume); 
     progressControl.setProgress(curVolume); 
     progressControl.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 

      @Override 
      public void onProgressChanged(SeekBar seekbar, int progress, boolean fromUser) { 
       mediaPlayer.seekTo(progress); 
      } 

      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 
       // TODO Auto-generated method stub 

      } 
     });  
    } 
    @Override 
    public void onClick(View v) { 
     switch(v.getId()){ 
     case R.id.ic_player_play: 
      if(isStop==true){ 
       try { 
        mediaPlayer.prepareAsync(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      }else{ 
       mediaPlayer.start(); 
       isStop = true; 
      } 
      break; 
     case R.id.ic_player_pause: 
      mediaPlayer.pause(); 
      break; 
     case R.id.ic_player_reset: 
      mediaPlayer.seekTo(0); 
      break; 
     case R.id.ic_player_stop: 
      isStop = true; 
      progressControl.setProgress(0); 
      mediaPlayer.stop(); 
      break; 
     } 

    } 
    private void resetAndStartPlayer(){ 
     try { 
      if(filePath!=null){ 
       mediaPlayer.setDataSource(filePath); 
       mediaPlayer.prepareAsync(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    private void setPlayer(){ 

     getWindow().setFormat(PixelFormat.UNKNOWN); 
     mediaPlayer = new MediaPlayer();  

     mediaPlayer.setOnBufferingUpdateListener(new OnBufferingUpdateListener() { 

      @Override 
      public void onBufferingUpdate(MediaPlayer mp, int percent) { 
       progressControl.setSecondaryProgress((progressControl.getMax()/100)*percent); 

      } 
     }); 
     mediaPlayer.setOnPreparedListener(new OnPreparedListener() { 

      @Override 
      public void onPrepared(MediaPlayer mp) { 
       mediaPlayer.start(); 
       isStop=false; 
       durationInMillis = mediaPlayer.getDuration(); 
       MyAudioPlayer.this.setProgressControl(); 
      } 
     }); 
     mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
    } 
    @Override 
    protected void onDestroy() { 
     // TODO Auto-generated method stub 
     mediaPlayer.release(); 
     super.onDestroy(); 
    } 
    protected void setProgressText() { 
     durationInMillis = mediaPlayer.getDuration(); 
     int curVolume = mediaPlayer.getCurrentPosition(); 
     long HOUR = 60*60*1000; 
     if(progressText!=null){ 
      if(durationInMillis>HOUR){ 
       progressText.setText(String.format("%1$tH:%1$tM:%1$tS", new Date(curVolume)) 
         +"/"+String.format("%1$tH:%1$tM:%1$tS", new Date(durationInMillis))); 
      }else{ 
       progressText.setText(String.format("%1$tM:%1$tS", new Date(curVolume)) 
         +"/"+String.format("%1$tM:%1$tS", new Date(durationInMillis))); 
      } 
     }  
    } 
    private Runnable onEverySecond=new Runnable() { 
     public void run() { 

      if (mediaPlayer!=null) { 
       progressControl.setProgress(mediaPlayer.getCurrentPosition()); 

       MyAudioPlayer.this.setProgressText(); 
      } 

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

समय प्रगति पट्टी के ऊपर प्रदर्शित होता है।

समय: 'वर्तमान अवधि'/'कुल अवधि'

enter image description here

+0

@ अरिफ: मैं एक मेडियाप्लेयर बनाने पर काम कर रहा हूं और यदि आपने इस मुद्दे को हल किया है तो क्या आप मुझे कोड ईमेल करेंगे? gmail dot com –

+0

पर abuhamzah09 'LTDAudioPlayer' क्या नियंत्रण है? –

+0

@AbuHamzah यह LTDAudioPlayer –

उत्तर

3

सबसे पहले बड़ी समस्या आरंभीकरण के अपने आदेश है: आप getDuration फोन से पहले आप वास्तव में resetAndStartPlayer में setDataSource कहते हैं। मीडियाप्लेयर को डेटा स्रोत के बिना अवधि कैसे जाननी चाहिए?

यहाँ है जो ठीक से कैसे करना है: Activity.onCreate में

  1. कॉल MediaPlayer.setDataSource()

  2. निष्पादित AsyncTask, एक में अपनी doInBackground फोन MediaPlayer.prepare(), यह ले जाएगा जबकि यह http से स्ट्रीमिंग हो रहा है, लेकिन इसके बाद, खिलाड़ी को मीडिया की लंबाई पता होना चाहिए

  3. AsyncTask.onPostExecute कॉल MediaPlayer.getDuration() में, जिसे स्ट्रीम सफलतापूर्वक खोला गया था, सफल होना चाहिए; बाद में आप MediaPlayer को कॉल कर सकते हैं।शुरू()

महत्वपूर्ण बातें:

  • getDuration के बाद तैयार काम करता है बुलाया गया था
  • लंबा समय लग सकता है तैयार है, और अन्य सूत्र में बुलाया जाना चाहिए
  • आप भी prepareAsync का उपयोग करें और से बचने के सकता AsyncTask, तो आप GetDnPreparedListener कॉलबैक का उपयोग GetDuration
+1

की बजाय MyAudioPlayer था, मैं समस्या को हल करने में आपकी रूचि की सराहना करता हूं। मैंने MediaPlayer MediaPlayer.onPrepared() ... में बताया गया है कि समस्या ऑडियो स्ट्रीमिंग में थी, यह अभी भी वहां है। जब मैं ऑडियो को भी छोटा करता हूं। GetDuration मुझे 6 घंटे और कुछ देता है। लेकिन जब मैं एसडीकार्ड से ऑडियो चलाता हूं तो वही कोड सही अवधि देता है। –

+0

अपनी रिमोट स्ट्रीम का यूआरएल उदाहरण उदाहरण पोस्ट करें। –

13

आशा करते हैं कि यह आपकी समस्या का समाधान कर सकता है।

1) अवधि और ऑडियो स्ट्रीम की प्रगति

मैं अपने कोड में देखा है, तो आप समय की गणना करने के लिए अपने कोड में एक बड़ी त्रुटि है। आप नई तिथि (अवधि InMillis) बनाते हैं। तिथि आपके लोकैलिटी i.e जीएमटी + एक्सएक्स घंटे जोड़ती है, यही कारण है कि आपको स्ट्रीमिंग की शुरुआत में 5 घंटे का समय मिल रहा है। वर्तमान प्रगति/अवधि की गणना करने के लिए आपको निम्न विधि का उपयोग करना चाहिए।

protected void setProgressText() { 

    final int HOUR = 60*60*1000; 
    final int MINUTE = 60*1000; 
    final int SECOND = 1000; 

    int durationInMillis = mediaPlayer.getDuration(); 
    int curVolume = mediaPlayer.getCurrentPosition(); 

    int durationHour = durationInMillis/HOUR; 
    int durationMint = (durationInMillis%HOUR)/MINUTE; 
    int durationSec = (durationInMillis%MINUTE)/SECOND; 

    int currentHour = curVolume/HOUR; 
    int currentMint = (curVolume%HOUR)/MINUTE; 
    int currentSec = (curVolume%MINUTE)/SECOND; 

    if(durationHour>0){ 
     System.out.println(" 1 = "+String.format("%02d:%02d:%02d/%02d:%02d:%02d", 
       currentHour,currentMint,currentSec, durationHour,durationMint,durationSec));    
    }else{ 
     System.out.println(" 1 = "+String.format("%02d:%02d/%02d:%02d", 
       currentMint,currentSec, durationMint,durationSec)); 
    } 
} 

2) स्ट्रीम के लिए स्क्रबिंग।

मीडियाप्लेयर ऑडियो स्ट्रीम की स्क्रबिंग की अनुमति देता है। मैंने इसे अपनी परियोजनाओं में से एक में लागू किया है, लेकिन इसमें कुछ समय लगता है। किसी अन्य स्थान से ऑडियो स्ट्रीमिंग फिर से शुरू करने में कुछ समय लगता है।

+1

धन्यवाद talha। मैंने इस छोटे से बिंदु को नहीं देखा। – Arslan