我正在使用下面的代码在 android 设备上显示实时 RTSP 流。它工作正常,但问题是视频比现实晚了大约 2-4 秒,而 Xmeye 应用程序晚了 2 秒。我在 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
当蓝牙设备连接到手机时,我大多会收到此错误并且没有输出
core decoder: buffer deadlock prevented