【问题标题】:How to embed VLC media player to my Android App如何将 VLC 媒体播放器嵌入我的 Android 应用程序
【发布时间】:2026-02-11 19:15:02
【问题描述】:

有没有办法将 VLC 媒体播放器嵌入到 Android 应用程序中?我有几个问题:

1) 我有一个视频流摄像头(来自 RTSP),我无法在我的常规 videoview 面板上播放它的流(抱歉,此视频无法播放错误)。但是,我安装了适用于 Android 的 VLC 应用程序(测试版)并且能够播放它。 2) 我的主要目标是将使用 VLC 插件的桌面 Java 应用程序移植到 Android。我想以最少的努力完成这项任务(我有一些时间问题)。

另一种选择,有没有办法将 VLC 使用的编解码器嵌入到我的应用程序中?因为使用我的videoview,结果会根据视频的格式而有所不同。我可以在我的 videoview 上播放通过 RTSP 流式传输的其他一些视频。

我在互联网上搜索并找到了一个“libvlc”,但也有一些关于用于 android 的 libvlc 的注释不完整(但这些注释属于过去的时间,即使在 * 中也是如此)。

【问题讨论】:

  • 鉴于您说存在 VLC 播放器应用程序,您显然有证据证明 VLC 可以嵌入到应用程序中......您是否尝试过检查适用于该应用程序的源(和许可证)?

标签: android video libvlc


【解决方案1】:

是的,如果您已经拥有 vlc-sdk.7z(用于 android 的 libVLC),here 是将 VLC 嵌入到您的 android 应用程序中的示例项目。

如果您没有 libVLC,here 是构建 libVLC 的步骤。 (“sh compile.sh”完成后,“make vlc-sdk.7z”创建vlc-sdk.7z并解压到demo工程。

我把vlc-sdk.7z(只包括armeabi-v7a)here 用于测试。

【讨论】:

  • 有谁知道这个的许可是什么?是否兼容在商业应用中使用?
  • 这个库会增加apk的大小
  • @AshishSaini 此评论将增加网站的大小
【解决方案2】:

Maruku 给出了很好的答案。

另外,如果你不想在自己的机器上编译 libVLC,mrmaffen 已经把它扔到了 maven Central 上。所以在你的 .gradle 文件中包含

compile "de.mrmaffen:vlc-android-sdk:1.9.8"

请记住,LibVLC 可能不会 100% 更新,因为您没有自己编译源代码。

更多信息可以在这里找到GitHub

【讨论】:

【解决方案3】:

2019 年引入了 VLCVideoLayout 组件,该组件大大简化了将 VLC 嵌入 android 所需的代码。

https://code.videolan.org/videolan/libvlc-android-samples

libVLC 由托管在 BinTray 上的官方 VideoLAN 项目提供。请参阅 build.gradle 文件以获取 Maven 存储库和包名称/版本的链接。

https://code.videolan.org/videolan/libvlc-android-samples/blob/master/build.gradle#L18 https://code.videolan.org/videolan/libvlc-android-samples/blob/master/java_sample/build.gradle#L34

【讨论】:

  • 这很好,但是文档呢?.. 我在 Google 中没有找到任何文档,有人会分享吗?
【解决方案4】:

在 build.gradle 中:

allprojects {
repositories {
    google()
    jcenter()
    maven {
        url 'https://jitpack.io'
    }
    maven {
        url "https://dl.bintray.com/videolan/Android"
    }
}

}

在 app\build.gradle 中:

implementation "org.videolan.android:libvlc-all:3.1.12"

在activity_camera.xml中:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
    android:background="@android:color/background_dark"
    android:keepScreenOn="true"
    tools:context=".ui.main.cameras.CameraActivity">

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

</FrameLayout>

在CameraActivity.java中

import android.net.Uri
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.navArgs
import com.android.forum.R
import kotlinx.android.synthetic.main.activity_camera.*
import org.videolan.libvlc.LibVLC
import org.videolan.libvlc.Media
import org.videolan.libvlc.MediaPlayer
import java.io.IOException
import java.util.*

private const val USE_TEXTURE_VIEW = false
private const val ENABLE_SUBTITLES = true

class CameraActivity : AppCompatActivity() {

    private var mLibVLC: LibVLC? = null
    private var mMediaPlayer: MediaPlayer? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_camera)
        mLibVLC = LibVLC(this, ArrayList<String>().apply {
            add("--no-drop-late-frames")
            add("--no-skip-frames")
            add("--rtsp-tcp")
            add("-vvv")
        })
        mMediaPlayer = MediaPlayer(mLibVLC)
    }

    override fun onStart() {
        super.onStart()
        mMediaPlayer?.attachViews(videoLayout, null, ENABLE_SUBTITLES, USE_TEXTURE_VIEW)

        try {
            val name = "login";
            val password = "password";
            val cameraUrl = "100.00.00.01:9982";
            val rtspUrl = "rtsp://" + name + ":" + password + "@" + cameraUrl
            val httpUrl = "https://archive.org/download/Popeye_forPresident/Popeye_forPresident_512kb.mp4"
            val uri = Uri.parse(httpUrl) // ..whatever you want url...or even file fromm asset
            
            Media(mLibVLC, uri).apply {
                setHWDecoderEnabled(true, false);
                addOption(":network-caching=150");
                addOption(":clock-jitter=0");
                addOption(":clock-synchro=0");
                mMediaPlayer?.media = this

            }.release()

            mMediaPlayer?.play()

        } catch (e: IOException) {
            e.printStackTrace()
        }
    }

    override fun onStop() {
        super.onStop()
        mMediaPlayer?.stop()
        mMediaPlayer?.detachViews()
    }

    override fun onDestroy() {
        super.onDestroy()
        mMediaPlayer?.release()
        mLibVLC?.release()
    }
}

附言关于 rtsp,在我的情况下,它仅适用于 9982 端口(在链接中:rtsp://login:password@100.00.00.01:9982 而在 IE 中链接看起来像:http://100.00.00.01:9981

【讨论】:

  • 最佳答案! +1 提出来。如果可能,请说明您在创建LibVLCMedia 的对象时添加的选项。
  • 有这方面的文档吗?有 java 例子吗?
【解决方案5】:

libVLC 由托管在 BinTray 上的官方 VideoLAN 项目提供。 您可以直接使用该库作为依赖项,而无需对其进行编译。

将 maven url "https://dl.bintray.com/videolan/Android" 添加到您的项目级 Gradle 文件中,如下所示:

allprojects {
 repositories {
      google()
      jcenter()
      maven {
        url "https://maven.google.com";
        }
      maven { url "https://dl.bintray.com/videolan/Android" }
  }
}

在您的应用级 Gradle 文件中,添加 libVLC 依赖项

implementation 'org.videolan.android:libvlc-all:<latest-version-here>'

从以下官方 VLC GitHub 存储库获取最新的 libVLC 版本。

查找字符串“libvlcVersion”以获取最新版本。

https://github.com/videolan/vlc-android/blob/master/build.gradle#L33

【讨论】:

【解决方案6】:

其他一些答案链接到过时的版本,但 2019.03 的实际答案是 LibVlc for all platforms 3.1.8。这是.aar 版本,您可以使用these instructions 将其添加到您的项目中并使用。

但是如果所有版本太大(超过 70MB),here 是 armv7 版本,here 如果是 x86。

【讨论】:

    【解决方案7】:

    第一步:安装 Linux

    第 2 步:安装 ndk 和 sdk

    第 3 步:将目录路径更改为 compile.sh

    然后 compile.sh 通过你的 Linux 终端运行并生成 apk

    编译 - 运行 - 享受

    【讨论】: