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

fer*_*cis 29 video android libvlc

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

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

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

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

Mar*_*uku 26

是的,如果你已经有了vlc-sdk.7z(用于android的libVLC),这里是嵌入式VLC到你的Android应用程序的示例项目.

如果你没有libVLC,这里是构建一个步骤.(在"sh compile.sh"完成后,"make vlc-sdk.7z"创建vlc-sdk.7z并解压缩到演示项目.

我把vlc-sdk.7z(仅包括armeabi-v7a)放在这里进行测试.

  • @AshishSaini 此评论将增加网站的大小 (4认同)
  • 我认为libvlc是当前的LGPL:http://www.videolan.org/press/lgpl-libvlc.html (2认同)

Cal*_*len 20

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

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

compile "de.mrmaffen:vlc-android-sdk:1.9.8"
Run Code Online (Sandbox Code Playgroud)

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

更多信息可以在GitHub找到

  • 你能不能给我一些关于api文档的见解,不知道如何整合sdk (3认同)
  • [来自Gary Anderson的示例应用](https://github.com/gareoke/VLCPlayer)使用JCenter的VLC播放器. (2认同)
  • 当心:**注意:1.9.8是最新版本!请忽略旧版本3.0.0。** https://github.com/mrmaffen/vlc-android-sdk#get-it-via-maven-central (2认同)
  • @saiyancoder:为什么最新版本为1.9.8(似乎是3.0.0是较新的版本) (2认同)

Hai*_*han 8

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 中没有找到任何文档,有人会分享吗? (2认同)

Vla*_*kyi 7

在 build.gradle 中:

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

}

在 app\build.gradle 中:

implementation "org.videolan.android:libvlc-all:3.1.12"
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)

在 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()
    }
}
Run Code Online (Sandbox Code Playgroud)

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