我怎样才能让 shoutcast 流几乎立即开始播放

how can i get a shoucast stream to start playing almost instantly

我仍在修复我的广播应用程序,它进展顺利,你们作为资源提供了很好的帮助!

我(和我的最终客户)一直担心的一件事是流需要 30 秒到 45 秒(wifi vs 蜂窝网络 vs 移动用户所在的位置)才能开始播放流。

他们正在使用 Shoutcast 作为一项服务,我从他们的 Shoutcast 帐户中提取流。流是 MP3。

有没有办法让它在按下播放按钮几秒钟后开始播放???

这是我的代码:

import android.annotation.TargetApi;
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.SeekBar;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import java.io.IOException;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;

import static com.javacodegeeks.androidmediaplayerexample.R.string.app_name;

public class AndroidMediaPlayerExample extends Activity  implements AdapterView.OnItemSelectedListener, MediaPlayer.OnPreparedListener {

    private MediaPlayer mediaPlayer;
    public TextView songName, duration;
    private double timeElapsed = 0, finalTime = 0;
    private int forwardTime = 2000, backwardTime = 2000;
    private Handler durationHandler = new Handler();
    private SeekBar seekbar;
    //String url = "http://radio.miraath.net:7000";
    //String url = new String[]{"http://radio.miraath.net:7000", "http://radio.miraath.net:7010", "http://radio.miraath.net:7020", "http://radio.miraath.net:7030","http://radio.miraath.net:7040", };
    String url;
    TextView radioInfo;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //set the layout of the Activity
        setContentView(R.layout.activity_main);
        Spinner dropdown = (Spinner)findViewById(R.id.spinner1);
        String[] items = new String[]{"الإذاعة الرئيسية", "الاذاعة الثانية", "إذاعة القرآن الكريم", "Miraath's English Radio", "إذاعة المجالس التأصيلية", "إذاعة دورة حفر الباطن"};
        String [] radioDescription = new String[]{" الإذاعة الرئيسية: لموقع ميراث الأنبياء ،تسهر على بث الدروس العلمية لكبار العلماء وطلبة العلم، والتلاوات القرآنية على مدار الساعة. " , "الاذاعة الثانية تنقل الدروس المتعارضة مع الاذاعة الرئيسية و تعمل وقت الدروس فقط. " , "إذاعة ميراث الأنبياء للقرآن الكريم: بث لتلاوات مختارة من القرآن الكريم لمختلف القراء " , "Ensures the broadcast of Islamic lessons from the leading Scholars and proficient students, and recitations of Quran around the Clock" , "إذاعة خاصة ببث دروس مجالس ميراث الأنبياء التأصيلية، تعمل فقط وقت الدروس المباشرة حسب ما هو مبين بالجدول في الموقع " , "إذاعة خاصة ببث دروس دورة حفر الباطن، تعمل فقط وقت الدروس المباشرة حسب ما هو مبين بالجدول في الموقع " };
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, items);
        dropdown.setAdapter(adapter);
        dropdown.setOnItemSelectedListener(this);
        int channel = Arrays.asList((getResources().getStringArray(R.array.radios_array))).indexOf(getString(app_name));

        //initialize views
        initializeViews();
    }

    public void initializeViews(){
        songName = (TextView) findViewById(R.id.songName);
        radioInfo = (TextView) findViewById(R.id.radioInfo);
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        finalTime = mediaPlayer.getDuration();
        //duration = (TextView) findViewById(R.id.songDuration);
        seekbar = (SeekBar) findViewById(R.id.seekBar);
        songName.setText("Miraath.net Radio");

        seekbar.setMax((int) finalTime);
        seekbar.setClickable(false);
    }

    public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
        //mediaPlayer.release();

        switch (position) {

            case 0:
                // Whatever you want to happen when the first item gets selected
                //mediaPlayer.release();
                url = "http://radio.miraath.net:7000";
                radioInfo.setText("الإذاعة الرئيسية: لموقع ميراث الأنبياء ،تسهر على بث الدروس العلمية لكبار العلماء وطلبة العلم، والتلاوات القرآنية على مدار الساعة");
                Toast.makeText(getApplicationContext(), url, Toast.LENGTH_LONG).show();
                break;
            case 1:
                // Whatever you want to happen when the second item gets selected
                //mediaPlayer.release();
                url = "http://radio.miraath.net:7010";
                radioInfo.setText("الاذاعة الثانية تنقل الدروس المتعارضة مع الاذاعة الرئيسية و تعمل وقت الدروس فقط");
                Toast.makeText(getApplicationContext(), url, Toast.LENGTH_LONG).show();
                break;
            case 2:
                // Whatever you want to happen when the thrid item gets selected
                //mediaPlayer.release();
                url = "http://radio.miraath.net:7020";
                radioInfo.setText("إذاعة ميراث الأنبياء للقرآن الكريم: بث لتلاوات مختارة من القرآن الكريم لمختلف القراء");
                Toast.makeText(getApplicationContext(), url, Toast.LENGTH_LONG).show();
                break;
            case 3:
                // Whatever you want to happen when the thrid item gets selected
                //mediaPlayer.release();
                url = "http://radio.miraath.net:7040";
                radioInfo.setText("Ensures the broadcast of Islamic lessons from the leading Scholars and proficient students, and recitations of Quran around the Clock");
                Toast.makeText(getApplicationContext(), url, Toast.LENGTH_LONG).show();
                break;
            case 4:
                // Whatever you want to happen when the thrid item gets selected
                //mediaPlayer.release();
                url = "http://radio.miraath.net:7030";
                radioInfo.setText("إذاعة خاصة ببث دروس مجالس ميراث الأنبياء التأصيلية، تعمل فقط وقت الدروس المباشرة حسب ما هو مبين بالجدول في الموقع");
                Toast.makeText(getApplicationContext(), url, Toast.LENGTH_LONG).show();
                break;
            case 5:
                // Whatever you want to happen when the thrid item gets selected
                //mediaPlayer.release();
                url = "http://radio.miraath.net:8010";
                radioInfo.setText("إذاعة خاصة ببث دروس دورة حفر الباطن، تعمل فقط وقت الدروس المباشرة حسب ما هو مبين بالجدول في الموقع");
                Toast.makeText(getApplicationContext(), url, Toast.LENGTH_LONG).show();
                break;
        }

    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }

    // play mp3 song
    public void play(View view)
    {
        if (!mediaPlayer.isPlaying())
        {
            Toast.makeText(getApplicationContext(), "Radio selected. Buffering Now...", Toast.LENGTH_LONG).show();
            Toast.makeText(getApplicationContext(), "This may take a few moments. Please wait ...", Toast.LENGTH_LONG).show();
        }

        duration = (TextView) findViewById(R.id.songDuration);
        try
            {
                if (mediaPlayer.isPlaying())
                {
                    mediaPlayer.stop();
                    mediaPlayer.reset();
                    //mediaPlayer.release();
                    mediaPlayer.setDataSource(url);
                    mediaPlayer.setOnPreparedListener(this);
                    mediaPlayer.prepareAsync();
                }

                else if (!mediaPlayer.isPlaying()) {
                    mediaPlayer.setDataSource(url);
                    mediaPlayer.setOnPreparedListener(this);
                    mediaPlayer.prepareAsync();
                }
            }

            catch (IllegalArgumentException e)
            {
                Toast.makeText(getApplicationContext(), "Radio not Available. Please try again Later.", Toast.LENGTH_LONG).show();

            } catch (SecurityException e) {
                Toast.makeText(getApplicationContext(), "Radio not Available. Please try again Later.", Toast.LENGTH_LONG).show();

            } catch (IllegalStateException e) {
                Toast.makeText(getApplicationContext(), "Radio not Available. Please try again Later.", Toast.LENGTH_LONG).show();

            } catch (IOException e) {
                e.printStackTrace();
            }

    }

    //handler to change seekBarTime
    private Runnable updateSeekBarTime = new Runnable() {
        @TargetApi(Build.VERSION_CODES.GINGERBREAD)
        public void run() {
            //get current position
            timeElapsed = mediaPlayer.getCurrentPosition();
            //set seekbar progress
            seekbar.setProgress((int) timeElapsed);
            //set time remaing
            double timeRemaining = finalTime - timeElapsed;
            duration.setText(String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes((long) timeRemaining), TimeUnit.MILLISECONDS.toSeconds((long) timeRemaining) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) timeRemaining))));
            //repeat yourself that again in 100 miliseconds
            durationHandler.postDelayed(this, 100);
        }
    };

    // pause mp3 song
    public void pause(View view) {

        Toast.makeText(getApplicationContext(), "Audio Paused ...", Toast.LENGTH_LONG).show();
        mediaPlayer.reset();
    }

    // go forward at forwardTime seconds
    public void forward(View view) {
        //check if we can go forward at forwardTime seconds before song endes
        if ((timeElapsed + forwardTime) <= finalTime) {
            timeElapsed = timeElapsed + forwardTime;

            //seek to the exact second of the track
            mediaPlayer.seekTo((int) timeElapsed);
        }
    }

    // go backwards at backwardTime seconds
    public void rewind(View view) {
        //check if we can go back at backwardTime seconds after song starts
        if ((timeElapsed - backwardTime) > 0) {
            timeElapsed = timeElapsed - backwardTime;

            //seek to the exact second of the track
            mediaPlayer.seekTo((int) timeElapsed);
        }
    }

    @Override
    public void onPrepared(MediaPlayer mp) {
        mediaPlayer.start();
        timeElapsed = mediaPlayer.getCurrentPosition();
        seekbar.setProgress((int) timeElapsed);
        durationHandler.postDelayed(updateSeekBarTime, 100);

    }
}

谢谢!!! 铁螳螂7x

Outcast 不擅长直播;但是制作一个缓冲区 class 然后控制播放器开始部分作为缓冲的百分比工作。