Android OpenGLES视频剪辑示例源码

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

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

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

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

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

(需要源码的撩我,非免费的哦!)

复制代码
EGLSurfaceView实现代码
java 复制代码
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();
        }
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        if(surface == null) {
            surface = holder.getSurface();
        }
        mEGLThread = new EGLThread(new WeakReference<EGLSurfaceView>(this));
        mEGLThread.isCreate = true;
        mEGLThread.start();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        mEGLThread.width = width;
        mEGLThread.height = height;
        mEGLThread.isChange = true;
    }

    @Override
    public 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;
        }

        @Override
        public 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) {//TODO
                CustomLog.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;
    }
}
相关推荐
jinanwuhuaguo1 小时前
(第三十三篇)五月的文明奠基:OpenClaw 2026.5.2版本的文明级解读
android·java·开发语言·人工智能·github·拓扑学·openclaw
千码君20163 小时前
Trae:一些关于flutter和 go前后端开发构建的分享
android·flutter·gradle·android-studio·trae·vibe code
重生之我是Java开发战士6 小时前
【MySQL】事务 & 用户与权限管理
android·数据库·mysql
怣疯knight8 小时前
Windows不安装 Android Studio如何打包安卓软件
android·windows·android studio
ke_csdn8 小时前
从Java演变到Kotlin下的jet pack
android
wenzhangli78 小时前
在低代码设计中践行 Harness Engineering
android·低代码·rxjava
xingpanvip9 小时前
星盘接口开发文档:组合三限盘接口指南
android·开发语言·前端·python·php·lua
TechMix10 小时前
【fkw学习笔记】Android 13 AOSP 源码添加系统预置应用实战指南
android·笔记·学习
云起SAAS10 小时前
私域直播系统UniApp源码 多商户商城+直播带货 微信小程序+H5+安卓iOS
android·微信小程序·uni-app·私域直播系统
空中海10 小时前
01. 安卓逆向基础、环境搭建与授权
android