【问题标题】:Audio file streaming on mobile移动设备上的音频文件流式传输
【发布时间】:2015-10-16 05:47:12
【问题描述】:

如何通过我们自己的服务器通过安卓应用在移动设备上播放和流式传输音频文件。它们都位于同一个wifi网络中。但是音频文件只存在于服务器上。有没有办法像(soundcloud)一样在客户端android上流式传输这些文件

【问题讨论】:

  • 表示您需要在位于服务器中的android应用中流式传输音频?
  • 是的。这就是想法。有可能吗?
  • 在下面查看我的答案。通过使用该代码,您可以流式传输音频。

标签: android server client


【解决方案1】:

Videoview 也可以播放音频文件。试试这样。

String urlAudio=""  // your server audio url path
 videoView = (VideoView) viewRoot.findViewById(R.id.VideoView);
  mediaController = new MediaController(getActivity());
    mediaController.setAnchorView(videoView);
    videoView.setMediaController(mediaController);

videoView.setVideoURI(Uri.parse(urlAudio));
    videoView.requestFocus();
    videoView.start();

【讨论】:

    【解决方案2】:

    我过去曾streamed music to my phone with ES File Explorer and a SAMBA share。然而,该帖子中的其他选项听起来像是更好的选择。

    【讨论】:

    • 我想知道自己开发应用程序的代码。
    【解决方案3】:

    通过使用 AsyncTask,您可以流式传输音频文件。

    public class MainActivity extends Activity {
    private Button btn;
    /**
     * help to toggle between play and pause.
     */
    private boolean playPause;
    private MediaPlayer mediaPlayer;
    /**
     * remain false till media is not completed, inside        OnCompletionListener     make it true.
     */
    private boolean intialStage = true;
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button) findViewById(R.id.button1);
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        btn.setOnClickListener(pausePlay);
    
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is   present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    
    private OnClickListener pausePlay = new OnClickListener() {
    
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        // TODO Auto-generated method stub
    
        if (!playPause) {
            btn.setBackgroundResource(R.drawable.button_pause);
            if (intialStage)
                new Player()
                        .execute("http://www.virginmegastore.me/Library/Music/CD_001214/Tracks/Track1.mp3");
            else {
                if (!mediaPlayer.isPlaying())
                    mediaPlayer.start();
            }
            playPause = true;
        } else {
            btn.setBackgroundResource(R.drawable.button_play);
            if (mediaPlayer.isPlaying())
                mediaPlayer.pause();
            playPause = false;
        }
    }
    };
    /**
     * preparing mediaplayer will take sometime to buffer the content so  prepare it inside the background thread and starting it on UI thread.
     * @author piyush
     *
     */
    
    class Player extends AsyncTask<String, Void, Boolean> {
        private ProgressDialog progress;
    
        @Override
        protected Boolean doInBackground(String... params) {
            // TODO Auto-generated method stub
            Boolean prepared;
            try {
    
                mediaPlayer.setDataSource(params[0]);
    
                mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
    
                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        // TODO Auto-generated method stub
                        intialStage = true;
                        playPause=false;
                        btn.setBackgroundResource(R.drawable.button_play);
                        mediaPlayer.stop();
                        mediaPlayer.reset();
                    }
                });
                mediaPlayer.prepare();
                prepared = true;
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                Log.d("IllegarArgument", e.getMessage());
                prepared = false;
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                prepared = false;
                e.printStackTrace();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                prepared = false;
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                prepared = false;
                e.printStackTrace();
            }
            return prepared;
        }
    
        @Override
        protected void onPostExecute(Boolean result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            if (progress.isShowing()) {
                progress.cancel();
            }
            Log.d("Prepared", "//" + result);
            mediaPlayer.start();
    
            intialStage = false;
        }
    
        public Player() {
            progress = new ProgressDialog(MainActivity.this);
        }
    
        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            this.progress.setMessage("Buffering...");
            this.progress.show();
    
        }
    }
    
    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        if (mediaPlayer != null) {
            mediaPlayer.reset();
            mediaPlayer.release();
            mediaPlayer = null;
        }
    }
    

    【讨论】:

    • 但是如何从服务器控制它
    • 表示你需要从服务器播放、暂停、停止等控件?
    • 是的。 Thr 数据也在服务器上
    • 我认为这不是最好的方法,但可能正在使用 GCM 服务。您可以向设备发送消息并处理播放、暂停、停止等控件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    相关资源
    最近更新 更多