android vlc播放rtsp

最近在做IOT开发,需要把IOT设备的RTSP流在手机端播放,VLC是个不错的选择,使用起来简单方便。

1、在AndroidManifest.xml 中添加网络权限

复制代码
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

2.引入vlc 库

2.1 在libs.versions.toml 引入VCL

复制代码
libvlcAll = "3.4.2"
libvlc-all = { module = "org.videolan.android:libvlc-all", version.ref = "libvlcAll" }

2.2 在build.gradle.kts 中添加依赖

复制代码
implementation (libs.libvlc.all)

3.在layout 文件中添加播放器的布局

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

4. 添加代码

4.1 在Actvitiy中使用vlc

复制代码
class RtspPlayActivity : AppCompatActivity() {
    companion object {
        const val WIFI_IP = "wifi_ip"
    }
    private lateinit var binding: ActivityRtspPlayBinding

    private lateinit var libVLC: LibVLC
    private lateinit var mediaPlayer: MediaPlayer
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        binding = ActivityRtspPlayBinding.inflate(layoutInflater)
        setContentView(binding.root)
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }
        initView()
    }

    private fun initView() {
        libVLC = LibVLC(this)
        mediaPlayer = MediaPlayer(libVLC)
        mediaPlayer.attachViews(binding.videoLayout, null, false, false)
        val rtspUri = intent.getStringExtra(WIFI_IP)
        val media = Media(libVLC, Uri.parse(rtspUri))
        mediaPlayer.media = media

        mediaPlayer.setEventListener { event ->
            if (event?.type == MediaPlayer.Event.EndReached) {
                mediaPlayer.stop()
            }
        }
        mediaPlayer.play()
    }

    override fun onResume() {
        super.onResume()
        if (!mediaPlayer.isPlaying) {
            mediaPlayer.play()
        }

    }

    override fun onPause() {
        super.onPause()
        if (mediaPlayer.isPlaying) {
            mediaPlayer.pause()
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        libVLC.release()
        mediaPlayer.release()
    }
}

5.时延问题

运行代码以后,发现延时很严重大概在2s左右

5.1 .时延原因

RTSP流的延迟主要有以下几个因素:

  1. 网络延迟:包括路由、丢包等。
  2. 缓冲区设置:设置过大的缓冲区会增加延迟。
  3. 解码延迟:视频流的编码格式及解码方式也会影响延迟。

鉴于这些因素,我们可以如何调整VLC播放器的设置来减少延迟呢?

5.2 如何降低延时

1.调整缓存设置

复制代码
media.addOption(":netwrok-catch=100")

2.选择合适的解码器也会影响延迟,VLC允许我们选择不同的解码方式。

复制代码
media.addOption(":avcodec-dec-options=skip=nonkey")

通过以上设置可以有效减少延时。

相关推荐
xingxiliang2 小时前
深入浅出 Android CTS 视频测试:从环境搭建、用例设计到底层通信原理
android·音视频
我命由我123452 小时前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
雨白4 小时前
深入理解 Kotlin 协程 (八):拾遗补阙,探秘官方框架的调度细节与取消闭环
android·kotlin
海天鹰5 小时前
PHP上传文件
android·开发语言·php
2501_915918416 小时前
详解iOS App上架至App Store的全流程步骤与注意事项
android·macos·ios·小程序·uni-app·cocoa·iphone
码农coding8 小时前
android12 SystemUI之StatusBar(二)
android
Lesile10 小时前
Interview#1 历史演进:MVC · MVP · MVVM · MVI架构详解
android·android jetpack
杉氧10 小时前
Flutter 像素级还原实战:用 CustomPaint 与 Bezier 曲线手绘精致图针
android·前端·flutter
我命由我1234513 小时前
Android 在构建过程中,发现有两个依赖库都包含了相同路径的资源文件
android·java·开发语言·java-ee·kotlin·android-studio·android runtime
Coffeeee13 小时前
谷歌的一个优化建议,让我重新学了一遍Android里面如何正确处理位图
android·google·kotlin