Skip to content

Problem with android display

I'm trying to make a zapper with VLC for SD, HD and 4K streaming channels. It can play SD and HD without any problems, but I'm unable to get it to reproduce 4K. When I choose a 4K channel, after loading, the sound starts and I only get a black background. I found this #Issue 902, what its exactly the same problem as I have. But when I try that options, the android_display module is not found. Here is the code.

   `private void initPlayer() {
    ArrayList<String> options = new ArrayList<>();
    options.add("--audio-time-stretch");
    options.add("--avcodec-skiploopfilter");
    options.add("1");
    options.add("--avcodec-skip-frame");
    options.add("--avcodec-skip-idct");
    options.add("--stats");
    options.add("--audio-resampler");
    options.add("soxr");
    options.add("-vv");
    options.add("--vout=android_display,none");
    options.add("--subsdec-encoding");
    libVLC = new LibVLC(this, options);

    surfaceHolder = surfaceview.getHolder();
    surfaceHolder.setKeepScreenOn(true);
    surfaceHolder.addCallback(new SurfaceHolder.Callback() {
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
        }
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        }
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
        }
    });

    mediaPlayer = new MediaPlayer(libVLC);
    mediaPlayer.setAudioDigitalOutputEnabled(true);
    mediaPlayer.setAudioOutput("opensles_android");
    mediaPlayer.setRenderer(null);
    mediaPlayer.setEventListener(new MediaPlayer.EventListener() {
        @Override
        public void onEvent(MediaPlayer.Event event) {
            switch (event.type) {
                case MediaPlayer.Event.Buffering:
                    if (mediaPlayer.isPlaying()) {
                        //mediaPlayer.pause();
                    }
                    if (event.getBuffering() >= 100.0f) {
                        hideLoading();
                        Log.i(TAG, "onEvent: buffer success...");
                        handler.sendEmptyMessageDelayed(CODE_HIDE_BLACK, 500);
                        handler.sendEmptyMessageDelayed(CODE_GONE_PROGRAMINFO, 5000);
                        handler.sendEmptyMessageDelayed(CODE_HIDE_BLACK, 500);
                        handler.sendEmptyMessageDelayed(CODE_GONE_PROGRAMINFO, 5000);
                        //mediaPlayer.play();
                    } else {
                        showLoading();
                        tvCache.setText("Loading: " + Math.floor(event.getBuffering()) + "%");
                    }
                    break;
                case MediaPlayer.Event.Playing:
                    Log.i(TAG, "onEvent: playing...");
                    mediaPlayer.play();
                    Log.d("MediaPlayer","Duration: "+media.getDuration());
                    Log.d("MediaPlayer","AudioTracks: "+mediaPlayer.getAudioTracksCount());
                    Log.d("MediaPlayer","SubTracks: "+mediaPlayer.getSpuTracksCount());
                    break;
                case MediaPlayer.Event.EncounteredError:
                    Log.i(TAG, "onEvent: error...");
                    hideLoading();
                    mediaPlayer.stop();
                    Toast.makeText(VideoPlayerActivity.this, "ERROR!", Toast.LENGTH_LONG).show();
                    break;
            }
        }
    });

    media = new Media(libVLC, Uri.parse(liveBean.getData().get(programIndex).getUrl()));
    mediaPlayer.setMedia(media);
    ivlcVout = mediaPlayer.getVLCVout();
    ivlcVout.setVideoView(surfaceview);
    ivlcVout.attachViews();
    ivlcVout.addCallback(new IVLCVout.Callback() {
        @Override
        public void onSurfacesCreated(IVLCVout vlcVout) {
            int sw = getWindow().getDecorView().getWidth();
            int sh = getWindow().getDecorView().getHeight();
            if (sw * sh == 0) {
                Log.e(TAG, "Invalid surface size");
                return;
            }
            mediaPlayer.getVLCVout().setWindowSize(sw, sh);
            mediaPlayer.setAspectRatio("16:9");
            mediaPlayer.setScale(0);
        }

        @Override
        public void onSurfacesDestroyed(IVLCVout vlcVout) {
        }
    });
    mediaPlayer.play();
}`

I include full logs here logs.txt. As you can see in lines as 355, the app is looking for android_display but it can't find a match.

I would appreciate any help, I've been looking for the problem several weeks but I couldn't find the solution. Maybe I'm missing something. Thanks in advance.

Versions

  • libvlcVersion 3.2-eap3
  • medialibraryVersion 0.5-eap3
  • minSdkVersion = 23
  • targetSdkVersion = 28
  • Java 1.8
  • NDK r10e
  • Android version 6.0.1