Tenho tentado transmitir mp3 em http usando a classe MediaPlayer do Android. A documentação sugere que isso deve ser tão fácil quanto:
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(URL_OF_FILE);
mp.prepare();
mp.start();
No entanto, estou recebendo o seguinte repetidamente. Também tentei URLs diferentes. Por favor, não me diga que o streaming não funciona em mp3.
E/PlayerDriver( 31): Command PLAYER_SET_DATA_SOURCE completed with an error or info PVMFErrNotSupported
W/PlayerDriver( 31): PVMFInfoErrorHandlingComplete
E/MediaPlayer( 198): error (1, -4)
E/MediaPlayer( 198): start called in state 0
E/MediaPlayer( 198): error (-38, 0)
E/MediaPlayer( 198): Error (1,-4)
E/MediaPlayer( 198): Error (-38,0)
Qualquer ajuda muito apreciada, obrigado S
android
mp3
android-mediaplayer
audio-streaming
Pandalover
fonte
fonte
Respostas:
Media Player simples com exemplo de streaming. Para a parte xml, você precisa de um botão com id button1 e duas imagens em sua pasta drawable com o nome button_pause e button_play e não se esqueça de adicionar a permissão de internet em seu manifesto.
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; } }
fonte
O Android MediaPlayer não suporta streaming de MP3 nativamente até a versão 2.2. Em versões mais antigas do sistema operacional, ele parece apenas transmitir 3GP nativamente. Você pode tentar o código pocketjourney, embora seja antigo (há uma nova versão aqui ) e eu tive problemas para torná-lo pegajoso - ele gaguejava sempre que recarregava o buffer.
O aplicativo NPR News para Android é de código aberto e usa um servidor proxy local para lidar com streaming de MP3 em versões do sistema operacional anteriores a 2.2. Você pode ver o código relevante nas linhas 199-216 (r94) aqui: http://code.google.com/p/npr-android-app/source/browse/Npr/src/org/npr/android/news/ PlaybackService.java?r=7cf2352b5c3c0fbcdc18a5a8c67d836577e7e8e3
E esta é a classe StreamProxy: http://code.google.com/p/npr-android-app/source/browse/Npr/src/org/npr/android/news/StreamProxy.java?r=e4984187f45c39a54ea6c88f71197762dbe10e72
O aplicativo NPR também ainda está recebendo o "erro (-38, 0)" às vezes durante a transmissão. Isso pode ser um problema de threading ou de mudança de rede. Verifique o rastreador de problemas para atualizações .
fonte
Acho que você está tentando reproduzir um .pls diretamente ou algo semelhante.
experimente isto:
1: o código
mediaPlayer = MediaPlayer.create(this, Uri.parse("http://vprbbc.streamguys.net:80/vprbbc24.mp3")); mediaPlayer.start();
2: o arquivo .pls
Este URL é da BBC apenas como exemplo. Era um arquivo .pls que baixei no linux com
wget http://foo.bar/file.pls
e então abri com o vim (use seu editor favorito;) e vi os URLs reais dentro deste arquivo. Infelizmente, nem todos os .pls são texto simples como esse.
Eu li que 1.6 não suportaria streaming de mp3 em http, mas acabei de testar o código obove com android 1.6 e 2.2 e não tive nenhum problema.
boa sorte!
fonte
Usar
mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaplayer.prepareAsync(); mediaplayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mediaplayer.start(); } });
fonte
Eu tive o mesmo erro que você e descobri que não havia nada de errado com o código. O problema era que o servidor da web estava enviando o cabeçalho Content-Type errado.
Tente WireShark ou algo semelhante para ver que tipo de conteúdo o servidor está enviando.
fonte
Olhando meus projetos:
fonte
Não chame mp.start com um OnPreparedListener para evitar o estado zero no log.
fonte