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

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

相关推荐
ii_best1 小时前
按键精灵支持安卓14、15系统,兼容64位环境开发辅助工具
android
美狐美颜sdk1 小时前
跨平台直播美颜SDK集成实录:Android/iOS如何适配贴纸功能
android·人工智能·ios·架构·音视频·美颜sdk·第三方美颜sdk
恋猫de小郭6 小时前
Meta 宣布加入 Kotlin 基金会,将为 Kotlin 和 Android 生态提供全新支持
android·开发语言·ios·kotlin
aqi007 小时前
FFmpeg开发笔记(七十七)Android的开源音视频剪辑框架RxFFmpeg
android·ffmpeg·音视频·流媒体
androidwork9 小时前
深入解析内存抖动:定位与修复实战(Kotlin版)
android·kotlin
梦天20159 小时前
android核心技术摘要
android
szhangbiao11 小时前
“开发板”类APP如果做屏幕适配
android
高林雨露12 小时前
RecyclerView中跳转到最后一条item并确保它在可视区域内显示
android
大胡子大叔12 小时前
webrtc-streamer视频流播放(rstp协议h264笔记)
笔记·webrtc·rtsp·webrtc-streamer
移动开发者1号14 小时前
ReLinker优化So库加载指南
android·kotlin