当前位置: 首页 > ds >正文

使用TextureView和MediaPlayer播放视频黑屏问题

背景

使用TextureView和MediaPlayer播放视频,recycleView滑动显示,滑动到对应的视频页面,会先黑屏再播放视频,用户体验不好。

原因

TextureView 出现黑闪现象通常是因为在视频开始播放前,它的内容是空的。当视频开始渲染时,TextureView 从无内容状态切换到有内容状态,这个过程可能会导致短暂的黑屏。

解决方案

使用占位图:
在视频加载并准备播放前,使用一个静态的占位图。当视频开始播放的时候,再移除占位图。这可以通过在TextureView上层放置一个ImageView并在视频准备好时将其隐藏来实现。

// 设置OnInfoListener
holder.videoView.setOnInfoListener { mp, what, extra ->if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {// 视频开始渲染// 这里可以执行一些操作,例如隐藏加载指示器holder.imageView.visibility = View.GONEtrue} else {false}
}

media的监听方法源码:

/*** Interface definition of a callback to be invoked to communicate some* info and/or warning about the media or its playback.*/
public interface OnInfoListener
{/*** Called to indicate an info or a warning.** @param mp      the MediaPlayer the info pertains to.* @param what    the type of info or warning.* <ul>* <li>{@link #MEDIA_INFO_UNKNOWN}* <li>{@link #MEDIA_INFO_VIDEO_TRACK_LAGGING}* <li>{@link #MEDIA_INFO_VIDEO_RENDERING_START}* <li>{@link #MEDIA_INFO_BUFFERING_START}* <li>{@link #MEDIA_INFO_BUFFERING_END}* <li><code>MEDIA_INFO_NETWORK_BANDWIDTH (703)</code> -*     bandwidth information is available (as <code>extra</code> kbps)* <li>{@link #MEDIA_INFO_BAD_INTERLEAVING}* <li>{@link #MEDIA_INFO_NOT_SEEKABLE}* <li>{@link #MEDIA_INFO_METADATA_UPDATE}* <li>{@link #MEDIA_INFO_UNSUPPORTED_SUBTITLE}* <li>{@link #MEDIA_INFO_SUBTITLE_TIMED_OUT}* </ul>* @param extra an extra code, specific to the info. Typically* implementation dependent.* @return True if the method handled the info, false if it didn't.* Returning false, or not having an OnInfoListener at all, will* cause the info to be discarded.*/boolean onInfo(MediaPlayer mp, int what, int extra);
}

这段代码定义了一个名为 OnInfoListener 的接口,它是一个回调接口,用于在媒体播放过程中传达一些信息或警告。这个接口通常在Android的 MediaPlayer 类中使用。当播放媒体时,MediaPlayer 可能会遇到各种事件和状态变化,OnInfoListener 允许开发者在这些情况发生时得到通知。
接口中的 onInfo 方法会在有信息或警告时被调用。这个方法有三个参数:

  1. mp:MediaPlayer 对象,它是触发信息事件的媒体播放器。
  2. what:信息或警告的类型。这是一个整数值,代表不同的信息或警告。例如,MEDIA_INFO_VIDEO_RENDERING_START 表示视频开始渲染。
  3. extra:附加的整数值,提供有关信息的额外数据。这通常依赖于实现,不同的 what 类型可能会有不同的 extra 值。
    onInfo 方法返回一个布尔值,表示是否处理了这个信息。如果返回 true,表示应用处理了这个信息。如果返回 false 或者没有设置 OnInfoListener,那么这个信息就会被丢弃。
    下面是 what 参数可能包含的一些值的解释:
  • MEDIA_INFO_UNKNOWN:未知的信息或警告。
  • MEDIA_INFO_VIDEO_TRACK_LAGGING:视频跟踪落后,可能是因为处理不过来。
  • MEDIA_INFO_VIDEO_RENDERING_START:视频开始渲染,这可以用来处理视频播放开始的黑屏问题。
  • MEDIA_INFO_BUFFERING_START:开始缓冲,媒体播放器需要填充缓冲区。
  • MEDIA_INFO_BUFFERING_END:缓冲结束,缓冲区已填满,播放可以继续。
  • MEDIA_INFO_NETWORK_BANDWIDTH (703):网络带宽信息可用,extra 表示以kbps为单位的带宽。
  • MEDIA_INFO_BAD_INTERLEAVING:媒体文件的交错格式不佳,可能影响播放。
  • MEDIA_INFO_NOT_SEEKABLE:媒体不可寻址,不能跳转到指定的播放位置。
  • MEDIA_INFO_METADATA_UPDATE:元数据更新了。
  • MEDIA_INFO_UNSUPPORTED_SUBTITLE:不支持的字幕格式。
  • MEDIA_INFO_SUBTITLE_TIMED_OUT:字幕超时。
http://www.xdnf.cn/news/17710.html

相关文章:

  • AI模型服务接入WAF防火墙
  • 【C++】哈希表的实现(unordered_map和unordered_set的底层)
  • DDIA第五章:分布式数据复制中的一致性与冲突处理
  • 触想定制化工业一体机化身渔业预警终端,守望渔船安全
  • Spring Boot 菜单删除功能的实现与事务管理
  • 【前端基础】16、结构伪类(注:粗略说明)
  • 数据上云有什么好处?企业数据如何上云?
  • 基于FPGA的热电偶测温数据采集系统,替代NI的产品(一)FPGA 测温研究现状
  • 自由学习记录(81)
  • 【JAVA】使用系统音频设置播放音频
  • 零 shot 语义+在线闭环:深度学习让机器人学会“主动”
  • MySQL 数据操作全流程:创建、读取、更新与删除实战
  • 对比FRI 与 Ligero 证明大小
  • 怎么实现表征工程并强化模型的“事实性”“诚信性”
  • 深入解析大模型落地的四大核心技术:微调、提示词工程、多模态应用 及 企业级解决方案,结合代码示例、流程图、Prompt案例及技术图表,提供可落地的实践指南。
  • FreeRTOS学习:资源管理:互斥操作的本质
  • 腾讯云EdgeOne Pages深度使用指南
  • GPU指令集入门教程
  • 《 C Primer Plus》
  • 常用hook钩子函数
  • 快速了解DBSCAN算法
  • Vue.js设计于实现 - 响应式(三)
  • 音视频学习(五十二):ADTS
  • Graham 算法求二维凸包
  • Python 2025:最新技术趋势与展望
  • 每日五个pyecharts可视化图表-line:从入门到精通 (2)
  • lesson34:深入理解Python线程:从基础到实战优化
  • jupyter notebook如何打开其他盘目录
  • MCP学习与实践
  • [激光原理与应用-222]:机械 - 3D设计与2D设计的异同比较