如何将VLC媒体播放器嵌入我的Android应用程序

时间:2014-02-27 16:07:55

标签: android video libvlc

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

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

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

我通过互联网搜索并发现了一个“libvlc”,但也有一些关于android的libvlc未完成的注释(但这些注释属于过去的时间,即使在stackoverflow中也是如此)。

7 个答案:

答案 0 :(得分:25)

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

如果您没有libVLC,here是构建一个的步骤。 (在“sh compile.sh”完成后,“make vlc-sdk.7z”创建vlc-sdk.7z并解压缩到演示项目。

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

答案 1 :(得分:19)

Maruku给出了一个很好的答案。

此外,如果你不想在你自己的机器上编译libVLC,那么mrmaffen已经把它推到了maven central上。所以在.gradle文件中包括

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

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

可以在GitHub

上找到更多信息

答案 2 :(得分: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()
    }
}

p.s。关于rtsp,以我为例,它只能在9982端口上工作(在链接中:rtsp:// login:password@100.00.00.01:9982,而在IE链接中看起来像:http://100.00.00.01:9981

答案 3 :(得分:3)

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

将maven网址“ 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

答案 4 :(得分:2)

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:-1)

第1步:安装Linux

第2步:安装ndk和sdk

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

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

编译 - 运行 - 享受