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

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

相关推荐
Peter(阿斯拉)35 分钟前
[Android]_[中级]_[如何创建MVVM架构原型]
android·java·架构·mvvm·viewmodel
kingbal1 小时前
Flutter:Flutter SDK版本管理工具FVM
android·flutter·ios·android-studio·window
天天开发1 小时前
Flutter状态管理新宠:RiverPod全面解析与实战指南
android·flutter
ltlovezh17 小时前
ROI 编码学习指南:Android 与 FFmpeg 的真实实现边界
android·ffmpeg·音视频开发
心前阳光18 小时前
Unity之2021.3.45f2c1发布安卓程序遇到的问题
android·unity·游戏引擎
utf8mb4安全女神19 小时前
MySQL5.7升级到MySQL8.0并进行数据迁移
android
黄林晴19 小时前
Android XR DP4 重磅发布:手机 App 直投眼镜,Compose 原生玩转 3D 内容
android·google io
炼川淬海DB21 小时前
数据库开发规范
android·adb·数据库开发
2501_9159184121 小时前
iOS App性能测试工具的实现方法与优化循环指南
android·ios·小程序·https·uni-app·iphone·webview
天天爱吃肉821821 小时前
豆包 vs DeepSeek API 对比分析报告
android·java·大数据·开发语言·功能测试·嵌入式硬件·汽车