在 Android 上使用 LibVLC 播放视频文件

可以使用LibVLC库嵌入 Android 应用程序上的 VLC 引擎。本教程提供了如何在 Android 应用程序上使用 LibVLC 播放视频文件的示例。

首先,将 LibVLC 库添加为模块build.gradle文件中的依赖项。

app/build.gradle

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

要显示视频,我们应该在布局 XML 文件中添加一个 VLCVideoLayout。还要添加打开文件浏览器的按钮。

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">

    <Button
        android:id="@+id/openButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:text="Open" />

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

</RelativeLayout>

确保您的移动设备中有视频文件。例如,您可以下载以下视频进行测试:

https://docs.evostream.com/sample_content/assets/bun33s.mp4

单击按钮时,我们附加了单击侦听器以打开文件浏览器。当用户选择一个视频文件时,playVideo调用该方法。它以读取模式打开文件。之后,Media创建该类的实例并开始播放视频。

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

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

package com.example.app;

import android.net.Uri;
import android.os.Bundle;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts.GetContent;
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;
import java.io.FileDescriptor;
import java.io.FileNotFoundException;

public class MainActivity extends AppCompatActivity
{
    private LibVLC libVlc;
    private MediaPlayer mediaPlayer;
    private VLCVideoLayout videoLayout;

    ActivityResultLauncher<String> resultLauncher = registerForActivityResult(
        new GetContent(),
        this::playVideo
    );

    @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);

        findViewById(R.id.openButton).setOnClickListener(
            v -> resultLauncher.launch("video/*")
        );
    }

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

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

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

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

    private void playVideo(Uri uri)
    {
        if (uri == null) {
            return;
        }
        try {
            FileDescriptor fd = getContentResolver()
                .openFileDescriptor(uri, "r")
                .getFileDescriptor();

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

            Media media = new Media(libVlc, fd);
            media.setHWDecoderEnabled(true, false);

            mediaPlayer.setMedia(media);
            media.release();
            mediaPlayer.play();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论