当RTSP流在Android上的VLC播放器中缓冲时显示进度对话框

当RTSP流在Android上的VLC播放器中缓冲时显示进度对话框

LibVLC库可用于在 Android 应用程序上显示来自 IP 摄像机的 RTSP 流。在视频流开始在 VLC 播放器中显示之前,会为用户显示一个黑色表面。用户可能认为视频流未加载。

本教程提供了在 Android 应用程序上的 VLC Player 中缓冲 RTSP 流时如何显示进度对话框的示例。

首先,打开模块build.gradle文件并在 dependencies 部分添加 LibVLC 库。

app//build.gradle

dependencies {
    // Other dependencies
    // ...
    implementation 'org.videolan.android:libvlc-all:3.4.4'
}

应用程序需要访问互联网。INTERNET在清单文件中请求权限。

app/src/main/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app">
 
    <uses-permission android:name="android.permission.INTERNET" />
 
    <application>
        ...
    </application>
 
</manifest>

在布局 XML 文件中,添加一个VLCVideoLayout. 它将用于显示来自 IP 摄像机的 RTSP 流。

app/src/main/res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <org.videolan.libvlc.util.VLCVideoLayout
        android:id="@+id/videoLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

创建一个新的布局 XML 文件,命名为progress.xml. 它将用于显示进度条以及文本“视频流正在缓冲…”。

app/src/main/res/layout/progress.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="10dp">

    <ProgressBar
        android:layout_width="40dp"
        android:layout_height="40dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Video stream is buffering..."
        android:layout_gravity="center_vertical"
        android:layout_marginStart="10dp" />

</LinearLayout>

我们创建了一个新ProgressDialog类,负责显示和隐藏进度对话框。查看资源R.layout.progress用作对话框的内容。如果视频流缓冲时间超过 1 秒(1000 毫秒),将显示进度对话框。该值可以调整。

app/src/main/java/com/example/app/ProgressDialog.java

package com.example.app;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;

public class ProgressDialog
{
    private static final int delayMs = 1000;
    private boolean isVisible = false;
    private long startTime = 0;
    private final Dialog dialog;

    public ProgressDialog(Context context)
    {
        dialog = new AlertDialog.Builder(context)
            .setView(R.layout.progress)
            .setCancelable(false)
            .create();
    }

    public void show()
    {
        if (isVisible) {
            return;
        }
        if (startTime == 0L) {
            startTime = System.currentTimeMillis();
        }
        if (System.currentTimeMillis() - startTime > delayMs) {
            isVisible = true;
            dialog.show();
        }
    }

    public void hide()
    {
        startTime = 0;
        isVisible = false;
        dialog.hide();
    }
}

该类MainActivity实现MediaPlayer.EventListener接口和覆盖onEvent方法。媒体播放器事件侦听器通过使用该方法附加到当前活动setEventListener

当活动开始时,来自 IP 摄像机的 RTSP 流开始捕获。onEvent当媒体播放器状态改变时调用该方法。当 RTSP 流正在缓冲时,Event.Buffering事件被触发。如果缓冲时间超过 1 秒,我们将显示进度对话框。当缓冲值达到 100% 时,我们隐藏进度对话框。

network-caching选项负责延迟来自 IP 摄像机的 RTSP 流。如果此选项太低,则流捕获可能会冻结。

当活动停止时,我们停止媒体播放器并将视频布局与播放器分离。当活动被销毁时,我们释放资源。

不要忘记更改网络摄像机的 RTSP URL。我们使用 Reolink E1 Pro 相机进行测试。

app/src/main/java/com/example/app/MainActivity.java

package com.example.app;

import android.net.Uri;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import org.videolan.libvlc.LibVLC;
import org.videolan.libvlc.Media;
import org.videolan.libvlc.MediaPlayer;
import org.videolan.libvlc.util.VLCVideoLayout;

public class MainActivity extends AppCompatActivity implements MediaPlayer.EventListener
{
    private static final String url = "rtsp://user:pass@192.168.0.9:554/h264Preview_01_main";

    private LibVLC libVlc;
    private MediaPlayer mediaPlayer;
    private VLCVideoLayout videoLayout;
    private ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        libVlc = new LibVLC(this);
        mediaPlayer = new MediaPlayer(libVlc);
        mediaPlayer.setEventListener(this);
        videoLayout = findViewById(R.id.videoLayout);
        progressDialog = new ProgressDialog(this);
    }

    @Override
    public void onEvent(MediaPlayer.Event event)
    {
        if (event.type == MediaPlayer.Event.Buffering) {
            if (event.getBuffering() == 100f) {
                progressDialog.hide();
            } else {
                progressDialog.show();
            }
        }
    }

    @Override
    protected void onStart()
    {
        super.onStart();

        mediaPlayer.attachViews(videoLayout, null, false, false);

        Media media = new Media(libVlc, Uri.parse(url));
        media.setHWDecoderEnabled(true, false);
        media.addOption(":network-caching=600");

        mediaPlayer.setMedia(media);
        media.release();
        mediaPlayer.play();
    }

    @Override
    protected void onStop()
    {
        super.onStop();

        mediaPlayer.stop();
        mediaPlayer.detachViews();
    }

    @Override
    protected void onDestroy()
    {
        super.onDestroy();

        mediaPlayer.release();
        libVlc.release();
    }
}

原文链接:https://lindevs.com/display-progress-dialog-when-rtsp-stream-is-buffering-in-vlc-player-on-android

本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/17500.html

(0)

相关推荐

发表回复

登录后才能评论