在 Android 上使用 LibVLC 显示来自网络摄像机的 RTSP 流

LibVLC for Android是一个允许在 Android 应用程序中嵌入 VLC 引擎的库。本教程提供了如何在 Android 应用程序上使用 LibVLC 显示来自 IP 摄像机的 RTSP 流的示例。

首先,我们需要在模块build.gradle文件中添加 LibVLC 依赖项。

app/build.gradle

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

请求INTERNET清单文件中的权限,因为应用程序应具有 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>

当活动开始时,来自 IP 摄像机的 RTSP 流被捕获并使用媒体播放器显示。确保您已更改网络摄像机的 RTSP URL。制造商可能使用不同的 RTSP URL。我们使用 Reolink E1 Pro 相机进行测试。可以最小化该network-caching选项以减少来自 IP 摄像机的 RTSP 流的延迟。如果您设置network-caching为低,则流捕获可能会冻结。因此,请尝试使用各种值并根据您的移动设备调整此选项。

当 Activity 进入停止状态时,媒体播放器也会停止,视频布局会与播放器分离。当活动被销毁时,资源被释放。爪哇科特林

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
{
    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;

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

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

    @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://www.nxrte.com/jishu/17526.html

(0)

相关推荐

发表回复

登录后才能评论