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

Android OpenGLES视频剪辑示例源码

1.基于Android OpenGLES开发,可实现各种视频剪辑功能,内置多种视频特效滤镜和转场动画,还可按需增加各种自定义滤镜和转场动画;

2.通过OpenGLES渲染图片,把图片当成视频,实现图片和视频混合编辑;

3.视频和背景音乐合成,可自定义任意时段的背景音乐;

4.集成FFmpeg,用于实现从视频中提取音频,视频格式转换等多种强大功能;

APK下载链接: https://pan.baidu.com/s/1YpgxrHIfP0VH1PzTht-ZWQ 提取码: v95m

EGLSurfaceView实现代码
import android.content.Context;
import android.util.AttributeSet;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;import com.libmycommon.myutils.CustomLog;
import com.mediaeditor.myegl.EglCore;import java.lang.ref.WeakReference;import javax.microedition.khronos.egl.EGLContext;public class EGLSurfaceView extends SurfaceView implements SurfaceHolder.Callback {private Surface surface;private EGLThread mEGLThread;private IGLRender mIGLRender;public final static int RENDER_MODE_WHEN_DIRTY = 0;public final static int RENDER_MODE_CONTINUOUSLY = 1;private int mRenderMode = RENDER_MODE_WHEN_DIRTY;public EGLSurfaceView(Context context) {this(context, null);}public EGLSurfaceView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public EGLSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);getHolder().addCallback(this);}public void setRender(IGLRender IGLRender) {this.mIGLRender = IGLRender;}public void setRenderMode(int mRenderMode) {if(mIGLRender == null) {throw  new RuntimeException("must set render before");}this.mRenderMode = mRenderMode;}public EGLContext getEglContext() {if(mEGLThread != null) {return mEGLThread.getEglContext();}return null;}public void requestRender() {if(mEGLThread != null) {mEGLThread.requestRender();}}@Overridepublic void surfaceCreated(SurfaceHolder holder) {if(surface == null) {surface = holder.getSurface();}mEGLThread = new EGLThread(new WeakReference<EGLSurfaceView>(this));mEGLThread.isCreate = true;mEGLThread.start();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {mEGLThread.width = width;mEGLThread.height = height;mEGLThread.isChange = true;}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {mEGLThread.onDestroy();mEGLThread = null;surface = null;}public EglCore getEglHelper() {return mEGLThread.getEglHelper();}public interface IGLRender {void onSurfaceCreated(EglCore eglHelper);void onSurfaceChanged(int width, int height);void onDrawFrame(WindowSurface windowSurface);}class EGLThread extends Thread {private WeakReference<EGLSurfaceView> surfaceViewWeakReference;private EglCore eglHelper = null;private Object object = null;private WindowSurface windowSurface;private boolean isExit = false;private boolean isCreate = false;private boolean isChange = false;private boolean isStart = false;private int width;private int height;public EGLThread(WeakReference<EGLSurfaceView> surfaceViewWeakReference) {this.surfaceViewWeakReference = surfaceViewWeakReference;}@Overridepublic void run() {super.run();try {isExit = false;isStart = false;object = new Object();eglHelper = new EglCore();windowSurface = new WindowSurface(eglHelper, surfaceViewWeakReference.get().surface, false);windowSurface.makeCurrent();while (true) {if(isExit) {release();break;}if(isStart) {if(surfaceViewWeakReference.get().mRenderMode == RENDER_MODE_WHEN_DIRTY) {synchronized (object) {try {object.wait();} catch (InterruptedException e) {e.printStackTrace();}}} else if(surfaceViewWeakReference.get().mRenderMode == RENDER_MODE_CONTINUOUSLY) {try {Thread.sleep(1000 / 60);} catch (InterruptedException e) {e.printStackTrace();}} else {throw  new RuntimeException("mRenderMode is wrong value");}}onCreate();onChange(width, height);onDraw();isStart = true;if(onMyDraw != null) {onMyDraw.onMyDraw();}}} catch (Exception e) {//TODOCustomLog.e("EGLThread runtime exception " + e.toString());}}private void onCreate() {if(isCreate && surfaceViewWeakReference.get().mIGLRender != null) {isCreate = false;surfaceViewWeakReference.get().mIGLRender.onSurfaceCreated(eglHelper);}}private void onChange(int width, int height) {if(isChange && surfaceViewWeakReference.get().mIGLRender != null) {isChange = false;surfaceViewWeakReference.get().mIGLRender.onSurfaceChanged(width, height);}}private void onDraw() {if(surfaceViewWeakReference.get().mIGLRender != null && eglHelper != null) {windowSurface.makeCurrent();surfaceViewWeakReference.get().mIGLRender.onDrawFrame(windowSurface);}}private void requestRender() {if(object != null) {synchronized (object) {object.notifyAll();}}}public void onDestroy() {isExit = true;requestRender();}public void release() {if(eglHelper != null) {
//                eglHelper.destroyEgl();eglHelper.release();eglHelper = null;object = null;surfaceViewWeakReference = null;}}public EGLContext getEglContext() {if(eglHelper != null) {eglHelper.getEGLContext();
//                return eglHelper.getEglContext();}return null;}public EglCore getEglHelper() {return eglHelper;}}private OnMyDraw onMyDraw;public interface OnMyDraw {void onMyDraw();}public void setOnMyDraw(OnMyDraw onMyDraw) {this.onMyDraw = onMyDraw;}
}

http://www.dtcms.com/a/531878.html

相关文章:

  • 做淘宝客导购网站推广wordpress 明星
  • WebForms 页面
  • Leetcode 39
  • 【STM32项目开源】基于STM32的智能水质检测系统
  • 设计模式-迭代器模式(Iterator)
  • GitHub等平台形成的开源文化正在重塑天热e
  • 做网站需要用什么开发软件有哪些制作视频的软件
  • github中获得Personal Access Token
  • 从RDPDD!DrvEscape到RDPWD!ShareClass::UPSendOrders
  • RiPro数据转换CeoMax插件
  • IA复习笔记4 路由
  • 邯郸手机网站建设服务常见的网络推广工具
  • NTRU 加密系统原理及示例:NTRU、CTRU以及ITRU
  • k8s高频面试题汇总
  • 一篇文章理解LRC校验:
  • 石家庄免费网站建设百度收录入口提交查询
  • 专业提供网站建设服务培训学校 网站费用
  • 找做网站公司需要注意什么条件国外网站建设什么价格
  • 阮一峰《TypeScript 教程》学习笔记——tsconfig.json 文件
  • python如何做声音识别
  • 解决Docker磁盘空间不足导致MySQL启动失败
  • 【微服务组件】Springboot结合Dubbo实现RPC调用
  • One-Shot Federated Learning with Classifier-FreeDiffusion Models
  • powershell终端在ide里默认位置不对
  • 探索Linux进程:从理论到实践
  • 正则化机制解析:L2 的约束逻辑与 L1 的特征选择
  • 股票与期货战法理论发展路径
  • 用Python手写一个能识花的感知器模型——Iris分类实战详解
  • MySQL笔记16
  • gRPC通信流程学习