Кадры пропускаются при загрузке RTSP с использованием VLCJ - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь загрузить видео из моего потока RTSP.Я могу загрузить видео идеально большую часть времени.Но в некоторых случаях в течение определенного периода времени некоторые кадры пропускаются.Например, 6-секундное видео, я получаю только около 4 секунд.Когда кадры пропускаются, я получаю следующую ошибку:

MultiFramedRTPSource::doGetNextFrame1(): The total received frame size exceeds the client's buffer size (250000).  17058 bytes of trailing data will be dropped!

Любое решение?

Полный вывод VLC:

00000000212b5bc0] x264 encoder: using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2

[00000000212b5bc0] x264 encoder: profile High, level 5.0

[0000000021303460] avcodec generic: Using D3D11VA (Intel(R) HD Graphics 630, vendor 8086(Intel), device 5912, revision 4) for hardware decoding
[00000000212b5bc0] x264 encoder: using SAR=1/1

[00000000212b5bc0] x264 encoder: using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2

[00000000212b5bc0] x264 encoder: profile High, level 5.0

MultiFramedRTPSource::doGetNextFrame1(): The total received frame size exceeds the client's buffer size (250000).  17058 bytes of trailing data will be dropped!
[00000000212b5bc0] x264 encoder: frame I:1     Avg QP:17.27  size:265736

[00000000212b5bc0] x264 encoder: frame P:30    Avg QP:18.12  size: 29747

[00000000212b5bc0] x264 encoder: frame B:89    Avg QP:22.63  size:  3406

[00000000212b5bc0] x264 encoder: consecutive B-frames:  0.8%  0.0%  2.5% 96.7%

[00000000212b5bc0] x264 encoder: mb I  I16..4: 40.8% 14.5% 44.7%

[00000000212b5bc0] x264 encoder: mb P  I16..4:  1.1%  0.5%  0.4%  P16..4: 36.4%  3.7%  3.7%  0.0%  0.0%    skip:54.3%

[00000000212b5bc0] x264 encoder: mb B  I16..4:  0.0%  0.0%  0.0%  B16..8: 12.9%  0.0%  0.0%  direct: 8.0%  skip:79.1%  L0:38.9% L1:59.0% BI: 2.0%

[00000000212b5bc0] x264 encoder: 8x8 transform intra:18.3% inter:40.4%

[00000000212b5bc0] x264 encoder: coded y,uvDC,uvAC intra: 65.4% 50.5% 10.4% inter: 2.9% 12.8% 0.1%

[00000000212b5bc0] x264 encoder: i16 v,h,dc,p: 34% 23% 28% 15%

[00000000212b5bc0] x264 encoder: i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 25% 20% 41%  2%  2%  3%  3%  2%  4%

[00000000212b5bc0] x264 encoder: i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 31% 29% 18%  3%  3%  4%  4%  3%  5%

[00000000212b5bc0] x264 encoder: i8c dc,h,v,p: 52% 25% 20%  2%

[00000000212b5bc0] x264 encoder: Weighted P-Frames: Y:0.0% UV:0.0%

[00000000212b5bc0] x264 encoder: ref P L0: 65.3%  3.1% 21.4% 10.2%

[00000000212b5bc0] x264 encoder: ref B L0: 87.7% 11.2%  1.0%

[00000000212b5bc0] x264 encoder: ref B L1: 92.7%  7.3%

[00000000212b5bc0] x264 encoder: kb/s:2922.60

Код для загрузки видео из RTSP:

String mrl = "rtsp://<URL>";
String videoName = "E:\\cam11558337161068.mp4";
String options = ":sout=#transcode{vcodec=mp4v,venc=x264{cfr=16},scale=1,acodec=mp4a,ab=160,channels=2,samplerate=44100}:file{dst=" + videoName + "}";

final CountDownLatch sync = new CountDownLatch(1);
MediaPlayerFactory factory = new MediaPlayerFactory();
final MediaPlayer mediaPlayer = factory.mediaPlayers().newMediaPlayer();

mediaPlayer.events().addMediaPlayerEventListener(new MediaPlayerEventAdapter() {
    @Override
    public void error(MediaPlayer mediaPlayer) {
        sync.countDown();
    }

    @Override
    public void finished(MediaPlayer mediaPlayer) {
        mediaPlayer.release();
        factory.release();
        try {
            Thread.sleep(1000);
        }
        catch(InterruptedException e) {
        }                
    }

    @Override
    public void buffering(MediaPlayer mediaPlayer, float newCache) {
        System.out.println("Buffering ...");
    }

    @Override
    public void playing(MediaPlayer mediaPlayer) {
        System.out.println("Playing ...");
    }

});

mediaPlayer.media().prepare(mrl, options);
mediaPlayer.controls().start();

try {
    sync.await();
}
catch (InterruptedException e) {
    e.printStackTrace();
}

System.out.println("Done");

1 Ответ

1 голос
/ 20 мая 2019

Предполагая, что причина связана с полученным сообщением отбрасывания: The total received frame size exceeds the client's buffer size (250000), вам, вероятно, нужно изменить размер буфера кадров RTSP. Это делается путем передачи следующего параметра:

"--rtsp-frame-buffer-size=500000"

Конечно, вы устанавливаете размер так, как считаете нужным. У меня нет опыта использования libVLC с привязками Java, но я считаю, что вы можете передать параметры конструктора, когда создадите экземпляр MediaPlayerFactory. Это от некоторых из связующего кода:

public  MediaPlayerFactory(String... libvlcArgs) {
    this(LibVlcFactory.factory().atLeast("2.1.0").create(), libvlcArgs);
}

... поэтому я считаю, что именно здесь вы передаете аргументы следующим образом:

String[] args = {
  "--rtsp-frame-buffer-size", 
  "500000",
};

mediaPlayerFactory = new MediaPlayerFactory(args);

Существует множество других доступных опций, которые вы также можете передать.

...