最近在做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流的延迟主要有以下几个因素:
- 网络延迟:包括路由、丢包等。
- 缓冲区设置:设置过大的缓冲区会增加延迟。
- 解码延迟:视频流的编码格式及解码方式也会影响延迟。
鉴于这些因素,我们可以如何调整VLC播放器的设置来减少延迟呢?
5.2 如何降低延时
1.调整缓存设置
media.addOption(":netwrok-catch=100")
2.选择合适的解码器也会影响延迟,VLC允许我们选择不同的解码方式。
media.addOption(":avcodec-dec-options=skip=nonkey")
通过以上设置可以有效减少延时。