使用Android的OpenGL编写视频播放器
Android自身有MediaPlayer播放器,为什么还要使用OpenGL?因为使用OpenGL可以实现更多的效果,比如对视频翻转一定角度,加任意特效,多视频合并播放等,类似“激萌”的APP应该就是这样做的;相比之下,直接调用MediaPlayer的功能就少太多了。
OpenGL ES剔除了OpenGL中四边形和多边形的部分,即ES版本只支持三角形的绘制。使用分为三个步骤:
- 创建GLSurfaceView组件,使用Activity来显示GLSurfaceView;
- 为GLSurfaceView组件创建GLSurfaceView.Renderer实例,实现GLSurfaceViewRenderer类的三个接口:
// 真正绘制的函数
abstract void onDrawFrame(GL10 gl);
// 当GLSurfaceView的大小改变时回调,如横屏竖屏切换
abstract void onSurfaceChanged(GL10 gl, int width, int height);
// 当GLSurfaceView被创建时回调
abstract void onSurfaceCreated(GL10 gl, EGLConfig config);
- 调用GLSurfaceView组件的setRenderer()方法指定Renderer对象。
由以上三个步骤,可以编写OpenGL的渲染框架如下:
public class SampleActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// 创建一个GLSurfaceView,用于显示OpenGL绘制的图形
GLSurfaceView glView = new GLSurfaceView(this);
// 创建GLSurfaceView的内容绘制器
SampleRender myRender = new SampleRender();
// 为GLSurfaceView设置绘制器
glView.setRenderer(myRender);
setContentView(glView);
}
}
public class SampleRender implements Renderer
{
@Override
public void onDrawFrame(GL10 gl)
{
// 清除屏幕缓存和深度缓存
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
// 启用顶点座标数据
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
// 启用顶点颜色数据
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
// 设置当前矩阵堆栈为模型堆栈,
gl.glMatrixMode(GL10.GL_MODELVIEW);
// 重置当前的模型视图矩阵
gl.glLoadIdentity();
gl.glTranslatef(0.6f, 0.8f, -1.5f);
gl.glRotatef(rotate, 0f, 0.1f, 0f);
// 设置顶点的位置数据
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, rectDataBuffer);
// 设置顶点的颜色数据
gl.glColorPointer(4, GL10.GL_FIXED, 0, rectColorBuffer);
// 根据顶点数据绘制平面图形
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
// 绘制结束
gl.glFinish();
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}
}
在此渲染框架的基础上,使用MediaPlayer播放视频,调用MediaPlayer的setSurface()函数set到一个surface上。
SurfaceTexture mSurfaceTexture = new SurfaceTexture(textureName);
Surface mSurface = new Surface(mSurfaceTexture);
mMediaPlayer.setSurface(mSurface);
mMediaPlayer.setDataSource(fileName);
mMediaPlayer.prepareAsync();
这样,播放器播放的视频都显示到了我们设置的texture上,然后调用GLES20.glBindTexture(render.GL_TEXTURE_EXTERNAL_OES,textureName);绑定纹理,将纹理显示出来即可。剩下的就是对SurfaceTexture做伸缩,分屏,加特效图片等具体的业务了。
GLSurfaceView自带渲染线程,如果不使用默认的渲染线程,需要进行如下设置,之后调用requestRender()手动渲染:
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
自行设计定时器渲染的话,注意保证定时精度,如果精度太小而机器性能有限,可以使用多个定时器大粒度交叉渲染的方式保证30帧每秒的渲染频率。
使用Android的OpenGL编写视频播放器的更多相关文章
- Android短信管家视频播放器代码备份
自己保留备份,增强记忆 这是video的类 public class VideoActivity extends Activity { /** * 解析网络页面 */ private WebVie ...
- android,Exoplayer实现视频播放器
bundle配置: implementation 'com.google.android.exoplayer:exoplayer-core:2.8.1'implementation 'com.goog ...
- Qt编写视频播放器(vlc内核)
在研究qt+vlc的过程中,就想直接做个播放器用于独立的项目,vlc还支持硬件加速,不过部分电脑硬件不支持除外.用vlc的内核写播放器就是快,直接调用api就行,逻辑处理和ui展示基本上分分钟的事情, ...
- Android ijkplayer 强大的视频播放器框架教程 -- 导入demo运行(一)
首先介绍下这个开源项目,这个开源项目是BiliBli 开源的,首先感谢他们的团队. 这是开源的地址: https://github.com/Bilibili/ijkplayer 首先我为什么要选这个, ...
- 22_Android中的本地音乐播放器和网络音乐播放器的编写,本地视频播放器和网络视频播放器,照相机案例,偷拍案例实现
1 编写以下案例: 当点击了"播放"之后,在手机上的/mnt/sdcard2/natural.mp3就会播放. 2 编写布局文件activity_main.xml <Line ...
- Android 视频播放器 (二):使用MediaPlayer播放视频
在 Android 视频播放器 (一):使用VideoView播放视频 我们讲了一下如何使用VideoView播放视频,了解了基本的播放器的一些知识和内容.也知道VideoView内部封装的就是Med ...
- android形状属性、锁屏密码、动态模糊、kotlin项目、抖音动画、记账app、视频播放器等源码
Android精选源码 直观了解Android的"形状"属性如何影响Drawable的外观. 一个灵活的视频播放器, 可替换播放器内核. android锁屏输入密码功能源码 背景动 ...
- Android 视频播放器切换到下个视频时残留上个视频画面的解决办法
最近在做一个Android视频播放器,遇到一个问题:切换到下一个视频时,中间会停留上一个视频的残存画面. 这是怎么回事? 我在网上找了很多资料,终于找到了原因:我是用自定义一个surfacev ...
- android视频播放器开发
http://blog.csdn.net/u010181592/article/details/49301703 http://blog.csdn.net/qq_33291295/article/de ...
随机推荐
- sql 流程函数
create table salary (userid int,salary decimal(9,2)); -- mysqlinsert into salary values(1,1000),(2,2 ...
- ubuntu16.04安装五笔输入法
在 Ubuntu16.04 中为fctix小企鹅增加五笔输入法 转载:https://jingyan.baidu.com/article/454316ab67d702f7a7c03a1a.html U ...
- UPDATE语句总结
一.基本语句 1.SQL UPDATE 语法 UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition ...
- PHP接收IOS post过来的json数据无法解析的问题
在本地环境下运行解析OK 换到线上的环境解析失败 开始怀疑各种编码问题,解决均无效. 查看phpinfo 发现magic_quotes_gpc =on 终于找到问题所在,更改php.ini文件 mag ...
- 3 个简单、优秀的 Linux 网络监视器
作者: Carla Schroder 译者: LCTT geekpi 用 iftop.Nethogs 和 vnstat 了解更多关于你的网络连接. 你可以通过这三个 Linux 网络命令,了解有关你网 ...
- 将字典或者数组转换成JSON数据或者字符串
将字典或者数组转换成JSON数据或者字符串 源码: NSDictionary+JSON.h 与 NSDictionary+JSON.m // // NSDictionary+JSON.h // Cat ...
- MFC连接postgre数据库
配置环境: include:libpq-fe.h文件 lib:libpq.lib文件 dll:libeay32.dll,libiconv-2.dll,libintl-8.dll,libpq.dll,s ...
- [转]Centos7下面配置静态IP
修改网卡配置文件(操作前先备份一下该文件),/etc/sysconfig/network-scripts/ifcfg-enp0s3 ,如下: TYPE=Ethernet BOOTPROTO=stati ...
- 【转载】 C语言命令行小猪佩奇
// ASCII Peppa Pig by Milo Yip #include <math.h> #include <stdio.h> #include <stdlib. ...
- win10WLAN没有有效的ip配置
方案一:将路由器和猫重启一下,一般都可以解决了!方案二:1.在开始菜单上单击鼠标右键,选择“命令提示符(管理员)”,如果没有找到这个选项,通过cortana搜索cmd,右键以管理员身份运行,还可以进入 ...