Я пытался передавать mp3 через http, используя Android, встроенный в класс MediaPlayer. Документация подсказывает мне, что это должно быть так же просто, как:
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(URL_OF_FILE);
mp.prepare();
mp.start();
Однако я постоянно получаю следующее. Я также пробовал разные URL-адреса. Пожалуйста, не говорите мне, что потоковая передача не работает с 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)
Любая помощь очень ценится, спасибо S
android
mp3
android-mediaplayer
audio-streaming
Пандаловер
источник
источник
Ответы:
простой медиаплеер с примером потоковой передачи. Для части xml вам понадобится одна кнопка с идентификатором button1 и два изображения в вашей папке с возможностью рисования с именами button_pause и button_play, и, пожалуйста, не забудьте добавить разрешение в Интернете в свой манифест.
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; } }
источник
Android MediaPlayer не поддерживает потоковую передачу MP3 до версии 2.2. В более старых версиях ОС он, по-видимому, поддерживает только потоковую передачу 3GP. Вы можете попробовать код pocketjourney, хотя он старый (здесь есть новая версия ), и у меня возникли проблемы с его закреплением - он заикался всякий раз, когда пополнял буфер.
Приложение NPR News для Android имеет открытый исходный код и использует локальный прокси-сервер для обработки потоковой передачи MP3 в версиях ОС до 2.2. Вы можете увидеть соответствующий код в строках 199-216 (r94) здесь: http://code.google.com/p/npr-android-app/source/browse/Npr/src/org/npr/android/news/ PlaybackService.java?r=7cf2352b5c3c0fbcdc18a5a8c67d836577e7e8e3
А это класс StreamProxy: http://code.google.com/p/npr-android-app/source/browse/Npr/src/org/npr/android/news/StreamProxy.java?r=e4984187f45c39a54ea6c88f71197762dbe10e72
Приложение NPR также иногда выдает «ошибку (-38, 0)» во время потоковой передачи. Это может быть проблема потоковой передачи или проблема изменения сети. Следите за обновлениями в системе отслеживания проблем .
источник
Я предполагаю, что вы пытаетесь воспроизвести .pls напрямую или что-то подобное.
попробуйте это:
1: код
mediaPlayer = MediaPlayer.create(this, Uri.parse("http://vprbbc.streamguys.net:80/vprbbc24.mp3")); mediaPlayer.start();
2: файл .pls
Этот URL-адрес взят из BBC в качестве примера. Это был файл .pls, который в Linux я скачал с
wget http://foo.bar/file.pls
а затем я открыл с помощью vim (используйте ваш любимый редактор;), и я увидел настоящие URL-адреса внутри этого файла. К сожалению, не все .pls представляют собой такой обычный текст.
Я читал, что 1.6 не поддерживает потоковую передачу mp3 через http, но я только что протестировал код obove с Android 1.6 и 2.2 и не имел никаких проблем.
удачи!
источник
Использовать
mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaplayer.prepareAsync(); mediaplayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mediaplayer.start(); } });
источник
У меня была такая же ошибка, как и у вас, и оказалось, что с кодом все в порядке. Проблема заключалась в том, что веб-сервер отправлял неправильный заголовок Content-Type.
Попробуйте wirehark или что-то подобное, чтобы узнать, какой тип контента отправляет веб-сервер.
источник
Смотрю мои проекты:
источник
Нет вызова mp.start с OnPreparedListener, чтобы избежать нулевого состояния в журнале.
источник