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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值