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

ExoPlayer无法播放WiFi摄像头HTTP流问题求助

ExoPlayer无法播放摄像头HTTP流的解决方案

问题背景

  • 摄像头通过WiFi连接手机,HTTP流地址:http://192.168.4.1:8081/video,无音频,分辨率1280x740,VLC和浏览器可正常播放
  • Android App使用ExoPlayer能正常播放MP3、MP4测试链接,但无法播放该摄像头流
  • 当前初始化代码未针对摄像头流做特殊配置

解决方案

1. 手动指定媒体类型

ExoPlayer可能无法自动识别摄像头流的编码格式,需要在创建MediaItem时明确指定MimeType。常见的摄像头流格式为MJPEG或H.264,根据实际情况选择:

private fun initializePlayer(){
    player = SimpleExoPlayer.Builder(this)
        .build()
        .also { exoPlayer ->
            viewBinding.videoView.player = exoPlayer
            val mediaItem = MediaItem.Builder()
                .setUri(getString(R.string.camera_stream))
                // MJPEG流用MimeTypes.VIDEO_MJPEG,H.264裸流用MimeTypes.VIDEO_H264
                .setMimeType(MimeTypes.VIDEO_MJPEG)
                .build()
            exoPlayer.setMediaItem(mediaItem)

            exoPlayer.playWhenReady = playWhenReady
            exoPlayer.seekTo(currentWindow, playbackPosition)
            exoPlayer.prepare()
        }
}

2. 确保依赖对应扩展库

如果是特殊编码格式,需要添加ExoPlayer的对应扩展库。核心库已支持MJPEG,若需其他格式(如HLS、DASH),在build.gradle中添加依赖:

// ExoPlayer核心库
implementation "com.google.android.exoplayer:exoplayer-core:2.X.X"
// 如需HLS支持,添加以下依赖
// implementation "com.google.android.exoplayer:exoplayer-hls:2.X.X"

注意:替换2.X.X为当前最新的ExoPlayer版本号

3. 强制启用仅视频轨道

无音频流可能导致ExoPlayer无法自动选择轨道,通过TrackSelector强制启用视频轨道:

private fun initializePlayer(){
    val trackSelector = DefaultTrackSelector(this).apply {
        setParameters(buildUponParameters().setForceEnableTrackType(C.TRACK_TYPE_VIDEO))
    }
    player = SimpleExoPlayer.Builder(this)
        .setTrackSelector(trackSelector)
        .build()
        .also { exoPlayer ->
            viewBinding.videoView.player = exoPlayer
            val mediaItem = MediaItem.Builder()
                .setUri(getString(R.string.camera_stream))
                .setMimeType(MimeTypes.VIDEO_MJPEG)
                .build()
            exoPlayer.setMediaItem(mediaItem)

            exoPlayer.playWhenReady = playWhenReady
            exoPlayer.seekTo(currentWindow, playbackPosition)
            exoPlayer.prepare()
        }
}

4. 调整数据源缓存策略

部分摄像头HTTP流为持续流,关闭缓存或调整数据源配置可解决播放问题:

private fun initializePlayer(){
    player = SimpleExoPlayer.Builder(this)
        .build()
        .also { exoPlayer ->
            viewBinding.videoView.player = exoPlayer
            // 创建不带缓存的HTTP数据源工厂
            val dataSourceFactory = DefaultHttpDataSource.Factory()
                .setAllowCrossProtocolRedirects(true)
            
            val mediaItem = MediaItem.Builder()
                .setUri(getString(R.string.camera_stream))
                .setMimeType(MimeTypes.VIDEO_MJPEG)
                .build()
            // 创建ProgressiveMediaSource加载流
            val mediaSource = ProgressiveMediaSource.Factory(dataSourceFactory)
                .createMediaSource(mediaItem)
            
            exoPlayer.setMediaSource(mediaSource)
            exoPlayer.playWhenReady = playWhenReady
            exoPlayer.seekTo(currentWindow, playbackPosition)
            exoPlayer.prepare()
        }
}

内容的提问来源于stack exchange,提问作者izadora

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 00:47:46