网站地图 | RSS订阅 老铁博客 - 上海SEO优化|上海网站建设|蜘蛛池出租|站群代搭建
你的位置:首页 » 前端脚本 » 正文

glsurfaceview播放视频

2018-7-13 6:13:49 | 作者:老铁SEO | 0个评论 | 人浏览

OpenGL实现视频的剪裁、旋转、水印、滤镜?? 将 ffmpeg 库移植到 Android 平台?

  在播放网络上的视频流时,Android原生的MediaPlayer支持两种协议,HTTP和RTSP,这两种协议最大的不同是,RTSP协议支持实时流媒体的播放,而HTTP协议不支持。因为VideoView的底层实现是MediaPlayer,因此VideoView也支持以上两种协议。 但是Android原生MediaPalyer支持的协议(不支持RTMP、MMS等)和封装格式实在太有限了.

  除了使用MediaPlayer + SurfaceView播放视频的方式,我们还可以使用VideoView来直接播放视频。SurfaceView播放视频时,如果不进行设置,视频宽高总是等于定义的SurfaceView布局宽高,所以视频可能会被拉伸变形。而使用VideoView时,视频宽度等于VideoView布局宽,但是高是自适应的,自动调整宽高比到视频原始比例,所以不会有拉伸。
> MediaPlayer+SurfaceView点播视频

Android MediaPlayer+SurfaceView播放视频(附Demo)- http://blog.csdn.net/junzia/article/details/52704129

Android移动开发-使用MediaPlayer和SurfaceView播放视频的实现- https://download.csdn.net/download/fukaimei/10002446

Android--SurfaceView播放视频- http://www.cnblogs.com/plokmju/p/android_SurfaceView.html
Android SurfaceView播放视频有声音无图像问题- http://blog.csdn.net/aminfo/article/details/7588475

从头学Android之多媒体--使用MediaPlayer和SurfaceView播放视频- http://blog.csdn.net/worker90/article/details/7108358

Android之SurfaceView实现视频播放- http://www.cnblogs.com/devinzhang/archive/2012/02/03/2337576.html

Android SurfaceView使用dirty rect刷新- http://blog.csdn.net/jjwwmlp456/article/details/50364424
Android中 Rect类- http://blog.csdn.net/u010142437/article/details/38585637
Android开发:SurfaceView上新建线程绘制旋转图片 及 刷新特定区域(脏矩形)- http://blog.csdn.net/yanzi1225627/article/details/8581200
基于Surface的视频编解码与OpenGL ES渲染- http://blog.csdn.net/gh_home/article/details/52399959 https://github.com/google/grafika
Android图形系统之Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的联系- http://blog.csdn.net/conowen/article/details/7821409

openGL ES进阶教程(四)用openGL ES+MediaPlayer 渲染播放视频+滤镜效果- http://blog.csdn.net/king1425/article/details/72773331


> TextureView+MediaPlayer点播视频 ,SurfaceTexture.OnFrameAvailableListener

TextureView+SurfaceTexture+OpenGL ES来播放视频(一)- https://www.jianshu.com/p/d3d3186eefcb

SurfaceTexture进行视频分屏的文字,GLSurfaceView和SurfaceTexture,使用opengl绘制

TextureView+SurfaceTexture+OpenGL ES来播放视频(一)- http://blog.csdn.net/Ray_Chou/article/details/48416467


> openGL+GLSurfaceView+MediaPlayer点播视频/拍照、预览图片和视频、滤镜等,GLSurfaceView.Renderer。 

  创建一个纹理时,视频的每一帧都可以看成图片,也就是要不断的更新纹理.

主要的原因是,MediaPlayer的输出往往不是RGB格式(一般是YUV),而GLSurfaceView需要RGB格式才能正常显示,另外,获取每一帧的数据并没有那么方便。

    GLSurfaceView是OpenGL中的一个类,也是可以预览Camera的,而且在预览Camera上有其独到之处。独到之处在哪?当使用Surfaceview无能为力时就只有使用GLSurfaceView了,它能够真正做到让Camera的数据和显示分离,所以搞明白了这个,像Camera只开预览不显示这都是小菜,妥妥的。Android4.0的自带Camera源码是用SurfaceView预览的,但到了4.2就换成了GLSurfaceView来预览。如今到了4.4又用了自家的TextureView,所以从中可以窥探出新增TextureView的用意。

-- 推荐:通过Opengl ES去绘制视频的demo- https://github.com/ChouRay/PlayVideo-OpenGL

Android上使用OpenGLES2.0显示YUV数据-
https://blog.csdn.net/android_technology/article/details/52143291 https://blog.csdn.net/ueryueryuery/article/details/17608185

OpenGL预览摄像头-https://download.csdn.net/download/a296777513/9786330 

Android OpenGL渲染双视频- https://github.com/296777513/AndroidOpenGL

GLSurfaceView控件通过MediaPlayer播放普通视频- https://download.csdn.net/download/fowuchubuzai/10140354?locationNum=3&fps=1
Android OpenGL使用GLSurfaceView预览视频- http://blog.csdn.net/a296777513/article/details/63685658

视频学习笔记:Android OpenGL渲染YUV420P图像- http://blog.csdn.net/lidec/article/details/73732369

Android上使用OpenGLES2.0显示YUV数据- http://blog.csdn.net/ueryueryuery/article/details/17608185
github.com/xiaoyanger0825/NiceVideoPlayer  github.com/lipangit/JieCaoVideoPlayer

Android使用OpengGL Es2.0技术(GLSurfaceView含缩放功能)yuv视频流展示总结- http://blog.csdn.net/android_technology/article/details/52143291

Camera_V3.0.0[使用GLsurfaceView预览Camera 拍照demo]- https://download.csdn.net/download/rzjhsbyj110/8361481
PlayCamera_V2.0.0[TextureView预览Camera 拍照完整demo]- https://download.csdn.net/download/yanzi1225627/7540903
 使用GLsurfaceView预览Camera 拍照demo- http://download.csdn.net/detail/yanzi1225627/7547263
 Android camera实时预览 实时处理,人脸识别示例- http://www.jb51.net/article/103783.htm  http://www.apkbus.com/thread-589022-1-1.html
 Android人脸识别Demo竖屏YUV方向调整和图片保存(分享)- http://www.jb51.net/article/131299.htm

 使用GLSurfaceView预览Camera 基础拍照demo;GLSurfaceView做Camera预览
OpenGL预览摄像头- https://download.csdn.net/download/a296777513/9786330

 GLSurfaceView预览图像,一些滤镜处理和OpenGLES进阶Demo- https://github.com/lb377463323/GraphicsTestBed
 渲染多个视频流数据,微信视频聊天- https://github.com/296777513/AndroidOpenGL
 
  通过在C++层实现YUV-RGB转换,通过OpenGL绘制,通过片段着色器运行Shader脚本实现图像处理,虽然将滤镜的一些处理交给GPU来执行,极大的减少了速度,但YUV-RGB过程却拖了后腿。GLSL(GL Shading Language)的着色器代码分成2个部分:Vertex Shader(顶点着色器)和Fragment(片断着色器),有时还会有Geometry Shader(几何着色器)。负责运行顶点着色的是顶点着色器。它可以得到当前OpenGL 中的状态,GLSL内置变量进行传递。GLSL其使用C语言作为基础高阶着色语言,避免了使用汇编语言或硬件规格语言的复杂性。
  GPUImage for Android- https://github.com/CyberAgent/android-gpuimage

GL的Program/Shader把用户传过来的YUV数据,转换成RGB数据后,通过Renderer贴在GLSurfaceView上。
利用ffmpeg解码视频帧,然后通过 shader 进行处理,再通过ffmpeg编码为视频
opengGL+ffmpeg,FFmpeg解码、OpenGL视频显示;RTSP取流+FFmpeg解码+OpenGL显示
1、https://github.com/htwahzs/Rtsp-Android-Client(RTSP取流)
2、http://blog.csdn.net/shikh/article/details/45345313(用FFmpeg解码)
3、http://blog.csdn.net/ueryueryuery/article/details/17608185(解码后的YUV数据显示)

1.android本身也不能直接显示YUV图像,YUV转成RGB还是必要的;
2.YUV手动转RGB会占用大量的CPU资源,如果以这样的形式播放视频,手机会很热,所以我们尽量让GPU来做这件事;

 GLSurfaceView.getHolder().getSurface();.用openGL实现过贴图.
Rect rect =  mGLSurfaceView.getHolder().getSurfaceFrame();//获得当前SurfaceView上的帧.
通过Surface就可以获取raw buffer其中的内容。原生缓冲区(raw buffer)存储着当前窗口的像素数据。

 视频播放暂停时,OpenGL ES重绘SurfaceView  Android
Android Camera使用OpenGL ES 2.0和GLSurfaceView对预览进行实时处理(黑白滤镜)- http://blog.csdn.net/lb377463323/article/details/77071054
OpenGL ES总结(四)OpenGL 渲染视频画面- http://blog.csdn.net/hejjunlin/article/details/62976457
解决android opengl es绘制物体屏幕横竖屏切换物体压扁形变以及矩阵相关知识- http://blog.csdn.net/pangrui201/article/details/75452155


> 将YUV转成ARGB_8888的jni代码:
jintArray Java_com_spore_jni_ImageUtilEngine_decodeYUV420SP(JNIEnv * env,
jobject thiz, jbyteArray buf, jint width, jint height)
{
jbyte * yuv420sp = (*env)->GetByteArrayElements(env, buf, 0);
 
int frameSize = width * height;
jint rgb[frameSize]; // 新图像像素值
 
int i = 0, j = 0,yp = 0;
int uvp = 0, u = 0, v = 0;
for (j = 0, yp = 0; j < height; j++)
{
uvp = frameSize + (j >> 1) * width;
u = 0;
v = 0;
for (i = 0; i < width; i++, yp++)
{
int y = (0xff & ((int) yuv420sp[yp])) - 16;
if (y < 0)
y = 0;
if ((i & 1) == 0)
{
v = (0xff & yuv420sp[uvp++]) - 128;
u = (0xff & yuv420sp[uvp++]) - 128;
}
 
int y1192 = 1192 * y;
int r = (y1192 + 1634 * v);
int g = (y1192 - 833 * v - 400 * u);
int b = (y1192 + 2066 * u);
 
if (r < 0) r = 0; else if (r > 262143) r = 262143;
if (g < 0) g = 0; else if (g > 262143) g = 262143;
if (b < 0) b = 0; else if (b > 262143) b = 262143;
 
rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff);
}
}
 
jintArray result = (*env)->NewIntArray(env, frameSize);
(*env)->SetIntArrayRegion(env, result, 0, frameSize, rgb);
(*env)->ReleaseByteArrayElements(env, buf, yuv420sp, 0);
return result;
}


public native int[] decodeYUV420SP(byte[] buf, int width, int height);

> VideoView

Android VideoView播放本地视频短暂黑屏的解决方法- https://blog.csdn.net/goodlixueyong/article/details/53590573

android 启动页VideoView 播放本地视频短暂黑屏解决- https://blog.csdn.net/dhl_1986/article/details/79063923
Android VideoView 播放黑屏- https://www.jianshu.com/p/d5a63a0af370

 

  • 本文来自: 老铁博客,转载请保留出处!欢迎发表您的评论
  • 相关标签:glsurfaceview播放视频  
  • 已有0位网友发表了一针见血的评论,你还等什么?

    必填

    选填

    记住我,下次回复时不用重新输入个人信息

    必填,不填不让过哦,嘻嘻。

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

    相关推荐