【问题标题】:Audio Playing But Video not Showing in VideoView Android (Black Screen in Low Internet)音频播放但视频不显示在 VideoView Android 中(低互联网黑屏)
【发布时间】:2017-05-16 05:59:35
【问题描述】:

我正在研究 Android 中的视频流。当我想以低互联网速度播放视频时,VideoView 中不会出现视频显示黑屏但音频播放正常。我看到了这些链接 link1link2 。但是这些链接对我没有帮助。这是我的代码快照:-

private void playvideo(String url){
    final MediaController mediacontroller;
    try {
        mediacontroller = new MediaController(MainActivity.this);
        mediacontroller.setAnchorView(videoView);
        final Uri video = Uri.parse(url);
        videoView.setMediaController(mediacontroller);
        videoView.setVideoURI(video);
        videoView.requestFocus();
        videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            // Close the progress bar and play the video
            public void onPrepared(MediaPlayer mp) {
                mp.start();
                mp.setOnErrorListener(new MediaPlayer.OnErrorListener() {
                    @Override
                    public boolean onError(MediaPlayer mediaPlayer, int what, int extra) {
                        if (extra == MediaPlayer.MEDIA_ERROR_SERVER_DIED
                                || extra == MediaPlayer.MEDIA_ERROR_MALFORMED) {
                            Log.e(TAG , "MEDIA_ERROR_SERVER_DIED && MEDIA_ERROR_MALFORMED");
                            Toast.makeText(MainActivity.this , "Server Died or Malformed" , Toast.LENGTH_LONG).show();
                            return true;
                        } else if (extra == MediaPlayer.MEDIA_ERROR_IO) {
                            Log.e(TAG , "MediaPlayer.MEDIA_ERROR_IO");
                            Toast.makeText(MainActivity.this , "Media Error IO" , Toast.LENGTH_LONG).show();
                            return true;
                        }else if (extra == MediaPlayer.MEDIA_ERROR_UNKNOWN){
                            Log.e(TAG , ".MEDIA_ERROR_UNKNOWN");
                            Toast.makeText(MainActivity.this , "MEDIA ERROR UNKNOWN" , Toast.LENGTH_LONG).show();
                            return true;
                        }
                        return false;
                    }
                });
                mp.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
                    @Override
                    public void onBufferingUpdate(MediaPlayer mediaPlayer, int percentage) {
                        Log.e(TAG , "onBufferingUpdate :- " + percentage);
                    }
                });
                progressBar.setVisibility(View.GONE);
                videoView.start();
            }
        });
    } catch (Exception e) {
        Log.e("Error", e.getMessage());
        progressBar.setVisibility(View.GONE);
        Toast.makeText(getApplicationContext() ,"URL is Wrong Test with other URL" , Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }
}

因为音频和视频都是不同的流,所以在低互联网中,它能够以某种方式下载音频流但不能下载视频流,是吗?因此,在这种情况下,可以向用户显示一条消息,例如“您的网络速度低,再试一次”,而不是播放音频??

谢谢

【问题讨论】:

  • 可能是视频编解码器问题。你试试github.com/google/ExoPlayer
  • 抱歉我的回复晚了。我正在开发 Exoplayer,它在低互联网上运行良好。但是这个视频编解码器是什么问题??

标签: android video-streaming media-player android-videoview http-live-streaming


【解决方案1】:

尝试使用 Exoplayer,它是 Android 的 MediaPlayer API 的替代品,用于在本地和互联网上播放音频和视频。

https://github.com/google/ExoPlayer

【讨论】:

  • 谢谢。 Exoplayer 正在工作,但为什么在 Native Player 中会出现此错误??
【解决方案2】:

我推荐你使用 SurfaceView。

surfaceView = (SurfavceView) findView.....;
holder = surfaceView.getHolder();
holder.addCallback(this); // implement SurfaceHolder.Callback methods

然后在surfaceCreated方法中:

mediaPlayer.setDisplay(holder);
mediaPlayer.setDataSource(mVideoUrl);
mediaPlayer.prepareAsync();

您也可以使用https://github.com/anthorlop/EasyExoPlayer

它使用适用于 Android SDK >= 16 的 ExoPlayer 和适用于 Android

我希望它对你有用。

【讨论】:

  • 谢谢,Exoplayer 可以工作,但为什么这段代码不工作?原生播放器有什么问题??
猜你喜欢
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
相关资源
最近更新 更多