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

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

相关推荐
六件套是我1 小时前
redission实现延时队列
android·java·servlet
00后程序员张6 小时前
iOS 上架费用全解析 开发者账号、App 审核、工具使用与开心上架(Appuploader)免 Mac 成本优化指南
android·macos·ios·小程序·uni-app·cocoa·iphone
来来走走6 小时前
Android开发(Kotlin) 扩展函数和运算符重载
android·开发语言·kotlin
wuwu_q6 小时前
用通俗易懂 + Android 开发实战的方式,详细讲解 Kotlin Flow 中的 retryWhen 操作符
android·开发语言·kotlin
天选之女wow7 小时前
【代码随想录算法训练营——Day60】图论——94.城市间货物运输I、95.城市间货物运输II、96.城市间货物运输III
android·算法·图论
沐怡旸7 小时前
【底层机制】Android对Linux线程调度的移动设备优化深度解析
android·面试
正经教主9 小时前
【咨询】Android Studio 第三方手机模拟器对比【202511】
android·ide·android studio
Jomurphys9 小时前
网络 - 缓存
android
似霰10 小时前
安卓14移植以太网&&framework-connectivity-t 编译问题
android·framework·安卓·ethernet