进阶功能

开源结构

Session相关的类开源出来,以供您按需修改。开源部分为

操作类 包含内容
LiveCaptureSession
实时录制
VideoCaptureSession
AudioCaptureSession
LiveStreamSession
实时推流(互动)直播
VideoCaptureSession
AudioCaptureSession
LiveScreenStreamSession
实时推流(录屏)直播
ScreenCaptureSession
AudioCaptureSession
MediaPreviewSession
编辑预览
VideoPreviewSession
AudioPreviewSession
MediaProcessSession
后台合成
VideoProcessSession
AudioProcessSession

这些Session将jar包中的基础组件进行组合,完成相应的操作。

基础组件

Android 采集端 OneSDK 的 jar 包含了几个基础组件Device、Filter、Encoder,如下图所示:

类名 作用
CameraCaptureDevice 负责获取摄像头数据、操作摄像头、并将摄像头产生的图像帧传递给下层
AudioRecorderDevice 负责捕获MIC数据,并将帧序列传递给下层
MediaDecoderDevice 负责解码文件(视频文件或背景乐),并产生几路解码帧输出给下层
AudioFilter 负责混音、播放声音等,并把处理后的音频帧组传递给下层
VideoFilter 负责处理视频效果、把效果呈现在屏幕上,并把处理后的帧传递给下层
AudioMediaEncoder 负责编码音频帧,并把编码后的帧传递给下层
VideoMediaEncoder 负责编码视频帧,并把编码后的帧传递给下层
FlvMuxer 负责将编码后的音视频帧封装成Flv的Tag并发送到rtmp服务器
MediaMuxer系统类 负责将编码后的音视频帧封装成Mp4

说明:
这些组件是相对独立的,Session的作用就是图中的'箭头',将组件组装起来。

自写Filter

继承GPUImageFilter类的方式

例如,创建一个GPUImageCustomGammaFilter类

public class GPUImageCustomGammaFilter extends GPUImageFilter {
    public static final String GAMMA_FRAGMENT_SHADER = "" +
            "varying highp vec2 textureCoordinate;\n" +
            " \n" +
            " uniform sampler2D inputImageTexture;\n" +
            " uniform lowp float gamma;\n" +
            " \n" +
            " void main()\n" +
            " {\n" +
            "     lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);\n" +
            "     \n" +
            "     gl_FragColor = vec4(pow(textureColor.rgb, vec3(gamma)), textureColor.w);\n" +
            " }";

    private int mGammaLocation;
    private float mGamma;

    public GPUImageCustomGammaFilter() {
        this(1.2f);
    }

    public GPUImageCustomGammaFilter(final float gamma) {
        super(VERTEX_SHADER_WITHOUT_MATRIX, GAMMA_FRAGMENT_SHADER);
        mGamma = gamma;
    }

    @Override
    public void onInit() {
        super.onInit();
        mGammaLocation = GLES20.glGetUniformLocation(getProgram(), "gamma");
    }

    @Override
    public void onInitialized() {
        super.onInitialized();
        setGamma(mGamma);
    }

    public void setGamma(final float gamma) {
        mGamma = gamma;
        setFloat(mGammaLocation, mGamma);
    }
}

核心点:

  • 重写FragmentShader
  • 开放参数设置接口,并在onInit时绑定参数;

颜色查找表(LUT)的方式

GPUImageLookupFilter lookupFilter = new GPUImageLookupFilter();
lookupFilter.setBitmap(BitmapFactory.decodeResource(getResources(), R.raw.lutforexample));
filterList.addFilter(lookupFilter);

使用LUT颜色查找表,涉及:

  • 找专业调色公司制作查找表或从网上搜寻相关滤镜LUT;
  • 使用上述代码,加载查找表;