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