热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Android基于IJKPlayer视频播放器简单封装设计

这篇文章主要介绍了Android基于IJKPlayer视频播放器简单封装设计,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

播放器的简单设计

播放器基于IJKPlayer来设计的, 播放器大致分三层

1.播放内核(基于ijkMediaplayer)

2.播放器View

3.播放器的MediaController

1、封装播放内核

我们都知道需要播放一个视频需要三个过程 1.create MediaPlayer 2.MediaPlayer prepare 3.MediaPlayer 与 Surface 绑定

xinvideoplayer中使用了VideoManager来控制ijkmediaplayer 所有的操作

三个过程 我们使用 HandlerThread + Hander 来实现 第一个过程创建大致可能需要100ms左右,严重影响UI线程!!!

第一个过程: create MediaPlayer

new IjkMediaPlayer() 设置一些播放器回调方法

//IJK 的 Mediaplayer api 类似 Android 系统播放器api
//IMediaPlayer.class
public interface IMediaPlayer{
 void setOnPreparedListener(IMediaPlayer.OnPreparedListener var1); //prepareAsync 之后回调方法
 void setOnCompletionListener(IMediaPlayer.OnCompletionListener var1); //播放完成回调方法
 void setOnBufferingUpdateListener(IMediaPlayer.OnBufferingUpdateListener var1);//当播放网络的数据流的buffer发生变化的时候
 void setOnSeekCompleteListener(IMediaPlayer.OnSeekCompleteListener var1);//当seek定位操作完成后
 void setOnVideoSizeChangedListener(IMediaPlayer.OnVideoSizeChangedListener var1);//当视频的大小第一次被知道或者发生改变时
 void setOnErrorListener(IMediaPlayer.OnErrorListener var1);//当有发生错误
 void setOnInfoListener(IMediaPlayer.OnInfoListener var1);//当有信息或者警告
 void setOnTimedTextListener(IMediaPlayer.OnTimedTextListener var1); //当媒体的时间数据需要被显示
}

第二个阶段 prepare

mediaPlayer.prepareAsync(); 等待回调 IMediaPlayer.OnPreparedListener#onPrepare()

第三个阶段 给IJKMediaPlayer 绑定 Surface 呈现画面

mediaPlayer.setSurface();

2、播放器View

实现 播放器基本方法(IViewPlayer)和 播放内核回调方法(IMediaPlayerListener)

IMediaPlayerListener 是包装 IMediaPlayer 所有接口并通过 Handle 发送到主线程中实现

//IVideoPlayer.java
interface IVideoPlayer{
 void start();//开始播放
 void pause();//暂停播放
 void seekTo(long time); //seekto time
 void release();//关闭播放
 void setVideoPath();//设置视频路径
 void onStartFullScreen();//全屏播放
 void onBackFullScreen(); //退出全屏
 void onResumeVideo();//播放器后台唤起
 void onPauseVideo();//切换后台
 int getCurrentState();//视频的当前状态
 int getCurrentScreenState(); //当前屏幕的状态 例如小屏,大屏,竖屏
 long getTcpSpeed();//获取网速
 void switchVideoSource(String url,long delay);//切换清晰度 并流畅的切换
}
public interface MediaPlayerListenerextends IVideoPlayer{

 void onPrepared();
 void onAutoCompletion();
 void onCompletion();
 void onBufferingUpdate(int percent);
 void onSeekComplete(long currentPosition);
 void onError(int what, int extra);
 void onInfo(int what, int extra);
 void onVideoSizeChanged();
}

以上接口大致满足了所有播放器的功能要求!!

3.MediaController

public interface IVideoController{
 //顾名思义
 ViewbindPlayer(IVideoPlayer player);
 void onChangeVideoStatus(IVideoPlayer player,int old_status, int new_status);
 void onChangeScreenStatus(IVideoPlayer player,int old_status, int new_status);
 boolean onChangedNetWork(int currentNetState);
 void onVideoProgress(int percent, long curr_position, long duration);
 void unbindPlayer(IVideoPlayer player);
 boolean isLock();
 void onVideoDefinitionSwitched();
 void show();
 void hide();
 boolean isShowing();

BaseVideoPlayer#setVideoController()

播放器的简单接入使用

videoplayer.setVideoPath(url);
videoplayer.start();//开始播放
//如果需要后台暂停唤起继续播放
videoplayer.onVideoResume();
videoplayer.onVideoPause();
//如果需要后台暂停唤起继续播放
全屏时控制返回键问题:
if (!VideoPlayerUtils.onBackPressed()) {
 //返回的正常逻辑
}
...

播放器的内部实现

预加载需求 & 复用播放器

智能后台&唤起处理

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 优化局域网SSH连接延迟问题的解决方案
    本文介绍了解决局域网内SSH连接到服务器时出现长时间等待问题的方法。通过调整配置和优化网络设置,可以显著缩短SSH连接的时间。 ... [详细]
  • 本文介绍如何通过SSH协议使用Xshell远程连接到Ubuntu系统。为了实现这一目标,需要确保Ubuntu系统已安装并配置好SSH服务器,并保证网络连通性。 ... [详细]
  • 本文探讨了如何通过最小生成树(MST)来计算严格次小生成树。在处理过程中,需特别注意所有边权重相等的情况,以避免错误。我们首先构建最小生成树,然后枚举每条非树边,检查其是否能形成更优的次小生成树。 ... [详细]
  • 本文详细介绍了如何在BackTrack 5中配置和启动SSH服务,确保其正常运行,并通过Windows系统成功连接。涵盖了必要的密钥生成步骤及常见问题解决方法。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • moment 国际化设置中文语言 (全局) 及使用示例 ... [详细]
  • 深入解析 Spring Security 用户认证机制
    本文将详细介绍 Spring Security 中用户登录认证的核心流程,重点分析 AbstractAuthenticationProcessingFilter 和 AuthenticationManager 的工作原理。通过理解这些组件的实现,读者可以更好地掌握 Spring Security 的认证机制。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • Git管理工具SourceTree安装与使用指南
    本文详细介绍了Git管理工具SourceTree的安装、配置及团队协作方案,旨在帮助开发者更高效地进行版本控制和项目管理。 ... [详细]
  • 本文详细介绍如何在Linux系统中配置SSH密钥对,以实现从一台主机到另一台主机的无密码登录。内容涵盖密钥对生成、公钥分发及权限设置等关键步骤。 ... [详细]
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
  • Python 工具推荐 | PyHubWeekly 第二十一期:提升命令行体验的五大工具
    本期 PyHubWeekly 为大家精选了 GitHub 上五个优秀的 Python 工具,涵盖金融数据可视化、终端美化、国际化支持、图像增强和远程 Shell 环境配置。欢迎关注并参与项目。 ... [详细]
author-avatar
jajsjsbbsdjauuw
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有