You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android下LibVLC播放本地MJPG格式RTSP流超时问题求助

解决Android LibVLC播放MJPG格式RTSP流超时问题

我在Android平台使用LibVLC访问本地网络摄像头的MJPG格式RTSP流(地址:rtsp://192.168.0.51:8554/MCDE3000),现有Kotlin代码可正常播放公网H.264格式RTSP流,但播放本地MJPG流时出现超时问题。已启用INTERNET权限并在network_security_config.xml中添加目标IP,日志显示连接成功,但10秒后触发libvlc access: no data received in 10s, aborting错误。

现有代码

class VLCStreamActivity : AppCompatActivity() {

    private lateinit var vlcVideoLayout: VLCVideoLayout
    private var libVLC: LibVLC? = null
    private var mediaPlayer: MediaPlayer? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_vlcstream)

        // Initialize VLCVideoLayout
        vlcVideoLayout = findViewById(R.id.vlc_video_layout)

        // Initialize LibVLC
        val options = arrayListOf(
            "-vv", // Enable verbose logging
            "--rtsp-frame-buffer-size=2000", // Adjust buffer size if necessary
            "--network-caching=1500"
        )
        libVLC = LibVLC(this, options)

        // Initialize MediaPlayer
        mediaPlayer = MediaPlayer(libVLC).apply {
            attachViews(
                vlcVideoLayout,
                null,
                false,
                false
            )
        }

        // Play RTSP Stream
        val media = Media(libVLC, Uri.parse("rtsp://192.168.0.51:8554/MCDE3000")).apply {
            setHWDecoderEnabled(true, false) // Enable hardware decoding
            addOption(":network-caching=3000") // Increase network caching to 3 seconds
            addOption(":rtsp-tcp") // Force RTSP over TCP
            addOption(":rtsp-timeout=60") // Extend the RTSP timeout to 60 seconds
            addOption(":live-caching=3000") // Additional caching for live streams
            addOption(":rtsp-frame-buffer-size=5000") // Increase buffer size
            addOption(":demux=mjpeg") // Specify MJPEG as the demuxer

        }
        mediaPlayer?.media = media
        media.release()

        try {
            mediaPlayer?.play()
        } catch (e: Exception) {
            Log.e("RTSPStreamActivity", "Error playing RTSP stream", e)
            Toast.makeText(this, "Unable to play the stream.", Toast.LENGTH_SHORT).show()
        }
    }
}

错误日志

2024-12-05 10:10:34.574 26275-26336 VLC                     com.example.androidwatchapp          D  [b40000748e7e4890/66e0] libvlc access: play start: 0.000000 stop:0.000000
2024-12-05 10:10:34.574 26275-26336 VLC                     com.example.androidwatchapp          D  [00000073cf553790/66e0] libvlc generic: using access module "live555"
2024-12-05 10:10:34.574 26275-26336 VLC                     com.example.androidwatchapp          D  [00000073cf5532e0/66e0] libvlc generic: looking for video decoder module matching "any": 15 candidates
2024-12-05 10:10:34.574 26275-26336 VLC                     com.example.androidwatchapp          D  [b4000074ee7f4280/66e0] libvlc decoder: using ffmpeg Lavc60.31.102
2024-12-05 10:10:34.574 26275-26336 VLC                     com.example.androidwatchapp          D  [b4000074ee7f4280/66e0] libvlc decoder: CPU flags: 0x00000160
2024-12-05 10:10:34.575 26275-26336 VLC                     com.example.androidwatchapp          D  [b4000074ee7f4280/66e0] libvlc decoder: allowing 5 thread(s) for decoding
2024-12-05 10:10:34.575 26275-26336 VLC                     com.example.androidwatchapp          D  [b4000074ee7f4280/66e0] libvlc decoder: codec (mjpeg) started
2024-12-05 10:10:34.575 26275-26336 VLC                     com.example.androidwatchapp          D  [00000073cf5532e0/66e0] libvlc generic: using video decoder module "avcodec"
2024-12-05 10:10:34.575 26275-26336 VLC                     com.example.androidwatchapp          D  [b40000751e7ebcf0/66e0] libvlc input: ES track selected: 'video/auto/0' (fourcc: 'MJPG')
2024-12-05 10:10:34.575 26275-26336 VLC                     com.example.androidwatchapp          D  [00000073cf5539b0/66e0] libvlc generic: looking for meta reader module matching "any": 2 candidates
2024-12-05 10:10:34.575 26275-26336 VLC                     com.example.androidwatchapp          D  [b40000741e7ff380/66e0] libvlc demux meta: Trying Lua scripts in /data/user/0/com.example.androidwatchapp/app_vlc/.share/lua/meta/reader
2024-12-05 10:10:34.575 26275-26336 VLC                     com.example.androidwatchapp          D  [00000073cf5539b0/66e0] libvlc generic: no meta reader modules matched with name any
2024-12-05 10:10:34.575 26275-26336 VLC                     com.example.androidwatchapp          D  [b40000751e7ebcf0/66e0] libvlc input: `rtsp://192.168.0.51:8554/MCDE3000' successfully opened
2024-12-05 10:10:45.113 26275-26336 VLC                     com.example.androidwatchapp          E  [b40000748e7e4890/66e0] libvlc access: no data received in 10s, aborting
2024-12-05 10:10:45.113 26275-26336 VLC                     com.example.androidwatchapp          D  [b40000751e7ebcf0/66e0] libvlc input: EOF reached
2024-12-05 10:10:45.113 26275-26336 VLC                     com.example.androidwatchapp          D  [b4000074ee7f4280/66e0] libvlc decoder: killing decoder fourcc `MJPG'
2024-12-05 10:10:45.113 26275-26336 VLC                     com.example.androidwatchapp          D  [b4000074ee7f4280/66e0] libvlc decoder: removing "video decoder" module "avcodec"
2024-12-05 10:10:45.114 26275-26336 VLC                     com.example.androidwatchapp          D  [b40000751e7ebcf0/66e0] libvlc input: ES track unselected: 'video/auto/0' (fourcc: 'MJPG')
2024-12-05 10:10:45.114 26275-26336 VLC                     com.example.androidwatchapp          D  [b40000748e7e4890/66e0] libvlc access: removing "access" module "live555"
2024-12-05 10:10:45.114 26275-26327 VLC-std                 com.example.androidwatchapp          E  Sending request: TEARDOWN rtsp://192.168.0.51:8554/MCDE3000/ RTSP/1.0
                                                                                                    CSeq: 6
                                                                                                    User-Agent: LibVLC/4.0.0-dev (LIVE555 Streaming Media v2022.07.14)
                                                                                                    Session: -67682726
2024-12-05 10:10:45.114 26275-26336 VLC                     com.example.androidwatchapp          D  [b40000751e7ebcf0/66e0] libvlc input: ES track deleted: 'video/auto/0' (fourcc: 'MJPG')
2024-12-05 10:10:45.114 26275-26336 VLC                     com.example.androidwatchapp          D  [b40000751e7ebcf0/66e0] libvlc input: Program doesn't contain anymore ES
2024-12-05 10:10:45.114 26275-26333 VLC                     com.example.androidwatchapp          D  [b40000751e7ebcf0/66dd] libvlc input: destroying input for 'rtsp://192.168.0.51:8554/MCDE3000'

解决方案

1. 修复RTSP超时参数未生效问题

LibVLC的rtsp-timeout参数需全局配置,而非Media级别。将--rtsp-timeout=60000(单位为毫秒)加入LibVLC初始化的options数组,删除Media中的:rtsp-timeout=60。

2. 禁用硬件解码适配MJPG

MJPG硬件解码兼容性差,将setHWDecoderEnabled(true, false)改为setHWDecoderEnabled(false, false),强制使用软件解码。

3. 简化缓存配置避免冲突

删除LibVLC初始化中的--network-caching=1500,仅保留Media中的:network-caching=3000和:live-caching=3000,确保两者值一致。

4. 移除不必要的强制参数

  • 去掉:rtsp-tcp,部分MJPG摄像头仅支持UDP传输;
  • 删除:demux=mjpeg,让LibVLC自动识别封装格式,避免强制指定导致解析错误。

5. 延迟释放Media资源

将media.release()移至onDestroy生命周期方法中,避免Media资源提前被回收。

修改后的完整代码

class VLCStreamActivity : AppCompatActivity() {

    private lateinit var vlcVideoLayout: VLCVideoLayout
    private var libVLC: LibVLC? = null
    private var mediaPlayer: MediaPlayer? = null
    private var media: Media? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_vlcstream)

        vlcVideoLayout = findViewById(R.id.vlc_video_layout)

        // 初始化LibVLC,添加全局RTSP超时参数
        val options = arrayListOf(
            "-vv",
            "--rtsp-frame-buffer-size=2000",
            "--rtsp-timeout=60000" // 全局设置RTSP超时为60秒(毫秒)
        )
        libVLC = LibVLC(this, options)

        mediaPlayer = MediaPlayer(libVLC).apply {
            attachViews(
                vlcVideoLayout,
                null,
                false,
                false
            )
        }

        // 配置Media,移除无效参数
        media = Media(libVLC, Uri.parse("rtsp://192.168.0.51:8554/MCDE3000")).apply {
            setHWDecoderEnabled(false, false) // 禁用硬件解码
            addOption(":network-caching=3000")
            addOption(":live-caching=3000")
            addOption(":rtsp-frame-buffer-size=5000")
        }
        mediaPlayer?.media = media

        try {
            mediaPlayer?.play()
        } catch (e: Exception) {
            Log.e("RTSPStreamActivity", "Error playing RTSP stream", e)
            Toast.makeText(this, "Unable to play the stream.", Toast.LENGTH_SHORT).show()
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        // 按顺序释放资源
        mediaPlayer?.apply {
            stop()
            detachViews()
            release()
        }
        libVLC?.release()
        media?.release()
    }
}

内容的提问来源于stack exchange,提问作者Andi R.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 18:37:01