Я использую код ниже для отображения живого потока 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