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

