libvlc «Изображение слишком поздно для отображения» ошибка на Android - PullRequest
0 голосов
/ 29 апреля 2019

Я использую код ниже для отображения живого потока RTSP на устройстве Android. он работает нормально, но проблема в том, что видео задерживается примерно на 2-4 секунды от реальности и на 2 секунды позже от приложения Xmeye. Я получаю тоны "изображение слишком поздно для отображения" в журнале android studio, и ни одна из конфигураций libvlc (закомментированных в коде) до сих пор не была полезной. Версия libvlc 2.5.4, и она реализована как модуль в моем проекте.

Есть ли какая-либо конфигурация или альтернативное решение для преодоления этой проблемы?

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    Window window = getWindow();
    window.setFlags(
            WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
//        args.add("--ffmpeg-hw");
//        args.add("--avcodec-fast");
//        args.add("--avcodec-dr");
//        args.add("--avcodec-skiploopfilter=4");
//        args.add("--rtsp-frame-buffer-size=947483647");
//        args.add("--rtsp-frame-buffer-size=13107200");
//        args.add("--network-caching=2000"); // reduces the quality
//        args.add("--live-caching==2000");
//        args.add("--no-plugins-cache");// prevent from working
//        args.add("--sout-rtp-caching=1000"); // prevent from working
    mLibVLC = new LibVLC(this, args);
    mMediaPlayer = new MediaPlayer(mLibVLC);
    ...
    }
  @Override
protected void onStart() {
    super.onStart();

    final IVLCVout vlcVout = mMediaPlayer.getVLCVout();

    if (mVideoSurface != null) {
        vlcVout.setVideoView(mVideoSurface);
        if (mSubtitlesSurface != null)
            vlcVout.setSubtitlesView(mSubtitlesSurface);
    } else
        vlcVout.setVideoView(mVideoTexture);
    vlcVout.attachViews(this);
    startVideo();
}

private void startVideo() {
    setMedia();

    if (mOnLayoutChangeListener == null) {
        mOnLayoutChangeListener = new View.OnLayoutChangeListener() {
            private final Runnable mRunnable = new Runnable() {
                @Override
                public void run() {
                    updateVideoSurfaces();
                }
            };

            @Override
            public void onLayoutChange(View v, int left, int top, int right,
                                       int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
                if (left != oldLeft || top != oldTop || right != oldRight || bottom != oldBottom) {
                    mHandler.removeCallbacks(mRunnable);
                    mHandler.post(mRunnable);
                }
            }
        };
    }
    mVideoSurfaceFrame.addOnLayoutChangeListener(mOnLayoutChangeListener);
}

private void setMedia() {
    try {
        final Media media = new Media(mLibVLC, Uri.parse(getRTSPURL()));
        mMediaPlayer.setMedia(media);
        media.release();
    } catch (Exception e) {
        throw new RuntimeException("Invalid asset folder");
    }
    mMediaPlayer.play();

большая часть кода взята из vlc android java-sample. ссылка

Обновление

благодаря комментарию mtz я обновил libvlc до 3.0.0 и добавил эту строку кода.

media.addOption(":codec=mediacodec_ndk,mediacodec_jni,none");

Теперь ошибка «картинка слишком поздняя для отображения» возникает только несколько раз в начале или с видео качества SD, кроме того, я неоднократно получаю сообщение об ошибке ниже.

E/VLC-std: Sending request: 
GET_PARAMETER
rtsp://192.168.1.12:554/user=admin_password=tlJwpbo6_channel=1_stream=0.sdp
RTSP/1.0
CSeq: 10
User-Agent: LibVLC/3.0.0-git (LIVE555 Streaming Media v2015.11.09)
Session: 3914750
E/VLC-std: Received 50 new bytes of response data.
Received a complete GET_PARAMETER response:
RTSP/1.0 200 OK
Server: H264DVR 1.0
Cseq: 10

и когда устройство Bluetooth подключено к телефону, я в основном получаю эту ошибку, и никакого выхода нет

core decoder: buffer deadlock prevented
...