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.
相关产品推荐
相关产品推荐

