有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java E/MediaPlayer:使用emulator时出错(12147483648)

我正在为一个朋友制作一个在线广播流应用程序。当我在物理设备上运行它时,流播放没有问题。但是,如果我在Android Studio的内置模拟器上运行它,会出现以下错误:

E/MediaPlayer: Error (1,-2147483648) 

从我做的研究来看,这只是一个普遍的错误?我尝试添加:

if (安卓.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        player.setAudioAttributes(new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_MEDIA)
                .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                .build());
    } else {
        player.setAudioStreamType(AudioManager.STREAM_MUSIC);
    }

我还在清单中添加了访问internet的正确权限。我确信这个问题已经得到了回答,但我找不到任何解决问题的答案。下面是我用来播放流的完整代码:

 private void initializeUIElements(View root) {

    playSeekBar = root.findViewById(R.id.progressBar1);
    playSeekBar.setMax(100);
    playSeekBar.setVisibility(View.INVISIBLE);

    buttonPlay =  root.findViewById(R.id.buttonPlay);
    buttonPlay.setOnClickListener(this);

    buttonStopPlay = root.findViewById(R.id.buttonStopPlay);
    buttonStopPlay.setEnabled(false);
    buttonStopPlay.setOnClickListener(this);

}
public void onClick(View v) {
    if (v == buttonPlay) {
        startPlaying();
    } else if (v == buttonStopPlay) {
        stopPlaying();
    }
}

private void startPlaying() {
    buttonStopPlay.setEnabled(true);
    buttonPlay.setEnabled(false);

    playSeekBar.setVisibility(View.VISIBLE);



    player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

        public void onPrepared(MediaPlayer mp) {
            player.start();
        }
    });
    player.prepareAsync();
}

private void stopPlaying() {
    if (player.isPlaying()) {
        player.stop();
        player.release();
        initializeMediaPlayer();
    }

    buttonPlay.setEnabled(true);
    buttonStopPlay.setEnabled(false);
    playSeekBar.setVisibility(View.INVISIBLE);
}

private void initializeMediaPlayer() {
    player = new MediaPlayer();
    if (安卓.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        player.setAudioAttributes(new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_MEDIA)
                .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                .build());
    } else {
        player.setAudioStreamType(AudioManager.STREAM_MUSIC);
    }
    try {
        player.setDataSource("http://s5.citrus3.com:8162/stream");
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    player.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {

        public void onBufferingUpdate(MediaPlayer mp, int percent) {
            playSeekBar.setSecondaryProgress(percent);
            Log.i("Buffering", "" + percent);
        }
    });
}

@Override
public void onPause() {
    super.onPause();
    if (player.isPlaying()) {
        player.stop();
    }
}   

共 (2) 个答案

  1. # 1 楼答案

    我用了一种不同的方法来使用exo播放器。加载速度更快,错误也会消失,哈哈

    private void initializeUIElements(View root) {
    
        playSeekBar = root.findViewById(R.id.progressBar1);
        playSeekBar.setMax(100);
        playSeekBar.setVisibility(View.INVISIBLE);
    
    
    
    
    
    }
    
    
    @Override
    public void onStop() {
        super.onStop();
        if (Util.SDK_INT >= 24) {
            initializeMediaPlayer(root);
        }
    }
    
    
    private void initializeMediaPlayer(View root) {
    
        playerView = root.findViewById(R.id.video_view);
        player = new SimpleExoPlayer.Builder(getContext()).build();
        playerView.setPlayer(player);
    
        MediaItem media = MediaItem.fromUri(revurl);
        player.setMediaItem(media);
    
        player.setPlayWhenReady(playWhenReady);
        player.seekTo(currentWindow, playbackPosition);
        player.prepare();
    }
    
    @Override
    public void onPause() {
        super.onPause();
        if (Util.SDK_INT < 24) {
            releasePlayer();
        }
    }
    
    @Override
    public void onStart() {
        super.onStart();
        if (Util.SDK_INT >= 24) {
            initializeMediaPlayer(root);
        }
    }
    
    @Override
    public void onResume() {
        super.onResume();
    
        if ((Util.SDK_INT < 24 || player == null)) {
            initializeMediaPlayer(root);
        }
    }
    
    @SuppressLint("InlinedApi")
    private void hideUi() {
        playerView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
    }
    private boolean playWhenReady = true;
    private int currentWindow = 0;
    private long playbackPosition = 0;
    
    
    private void releasePlayer() {
        if (player != null) {
            playWhenReady = player.getPlayWhenReady();
            playbackPosition = player.getCurrentPosition();
            currentWindow = player.getCurrentWindowIndex();
            player.release();
            player = null;
        }
    }
    
  2. # 2 楼答案

    使用URLEncoder是一个很好的选择,但是可能有点笨拙(您只需要转义结尾部分)

    String url = "http://s5.citrus3.com:8162/stream"; 
    String fixedUrl = url.replaceAll(" ", "%20");
    

    然后

    player.setDataSource(fixedUrl);
    

    从这里查找您的问题您的链接正在使用此代码

    playme = (Button)findViewById(R.id.playme);
        playme.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
    
                Toast.makeText(MainActivity.this, " " + pl,Toast.LENGTH_SHORT).show();
    
                URL = "http://s5.citrus3.com:8162/stream";
    
                mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
                stopme.setEnabled(true);
                playme.setEnabled(false);
    
                // get data from internet ...
    
                try
                {
                    mp.setDataSource(URL);
                }catch(Exception e){
                    e.printStackTrace();
                }
    
                // buffer...
    
                try
                {
                    mp.prepare();
                }catch(Exception e){
                    e.printStackTrace();
                }
                mp.start();
    
            }
    
        });