5.2 Yasea框架介绍

我们这里介绍的推流工作,借鉴于对Yasea来完成。Yasea是一个Android流媒体客户端,它通过移动设备的摄像机和麦克风,把YUV和PCM的视频、音频数据编码,转码为H.264 / AAC的形式,然后把H.264和AAC的数据封装到FLV中,并通过RTMP协议发送到服务器上进行传输。

特性列表

  • Android Min API 21 (Android 4.1 Jelly Bean)
  • 同时支持 H.264/AAC 硬编码和软编码
  • RTMP 推流,事件状态回调
  • 手机横竖屏动态切换
  • 前后摄像头热切换
  • 推流过程随时录制 MP4 ,支持暂停和恢复
  • 实时美颜(磨皮)滤镜

框架分析

我们可以先到GitHub上下载源码看一下,项目的下载地址是https://github.com/begeekmyfriend/yasea ,下载完成后我们在Android Studio中导入进来,导入过程中可能会出现SDK等编译错误,大家自行修改一下,这里我们就不详细介绍解决办法了,下面我们先看一下源码里library下这个module的结构。

通过这个结构图大致可以看出源码部分,大致由assets、cpp、java、res组成。assets中主要放的是滤镜需要的图片文件;cpp中主要是JNI所需的文件;java文件夹下的net.ossrs.yasea放的是项目封装的核心代码文件,而com下放的是第三方开源项目SimpleRtmp、x264、Magicfilter、mp4parser等的代码;res下raw放的是滤镜所需要的一些核心文件。

使用介绍

我们集成的过程中主要用到的是net.ossrs.yasea包下yasea框架提供的方法,其他类、方法在这里就不给大家详细介绍了,大家感兴趣的话可以在GitHub上了解一下。具体使用过程中我们主要用到的是SrsCameraView和SrsPublisher类中的方法,下面我们给大家介绍一下这两个类中常用、重要的方法。

//设置编码状态的回调方法
public void setEncodeHandler(SrsEncodeHandler handler) {
    mEncoder = new SrsEncoder(handler);
        if (mFlvMuxer != null) {
            mEncoder.setFlvMuxer(mFlvMuxer);
        }
        if (mMp4Muxer != null) {
            mEncoder.setMp4Muxer(mMp4Muxer);
        }
}
//设置录像状态的回调方法
public void setRecordHandler(SrsRecordHandler handler) {
    mMp4Muxer = new SrsMp4Muxer(handler);
    if (mEncoder != null) {
        mEncoder.setMp4Muxer(mMp4Muxer);
    }
}
//设置rtmp推流时状态回调
public void setRtmpHandler(RtmpHandler handler) {
    mFlvMuxer = new SrsFlvMuxer(handler);
    if (mEncoder != null) {
        mEncoder.setFlvMuxer(mFlvMuxer);
    }
}
//设置预览分辨率
public void setPreviewResolution(int width, int height) {
    int resolution[] = mCameraView.setPreviewResolution(width, height);
    mEncoder.setPreviewResolution(resolution[0], resolution[1]);
}
//设置推流分辨率
public void setOutputResolution(int width, int height) {
    if (width <= height) {
        mEncoder.setPortraitResolution(width, height);
    } else {
        mEncoder.setLandscapeResolution(width, height);
    }
}
//设置传输率
public void setVideoHDMode() {
    mEncoder.setVideoHDMode();
}
public void setVideoSmoothMode() {
    mEncoder.setVideoSmoothMode();
}
//开启美颜(其他滤镜效果在MagicFilterType中查看,目前提供多种选择方案,如NONE,FAIRYTALE,SUNRISE,SUNSET,WHITECAT等)
public boolean switchCameraFilter(MagicFilterType type) {
    return mCameraView.setFilter(type);
}
//打开摄像头,开始预览(未推流)
public void startCamera() {
    mCameraView.startCamera();
}
//选择软编码
public void switchToSoftEncoder() {
    mEncoder.switchToSoftEncoder();
}
//选择硬编码
public void switchToHardEncoder() {
    mEncoder.switchToHardEncoder();
}
//开始推流 rtmpUrl
public void startPublish(String rtmpUrl) {
    if (mFlvMuxer != null) {
        mFlvMuxer.start(rtmpUrl);
        mFlvMuxer.setVideoResolution(mEncoder.getOutputWidth(), mEncoder.getOutputHeight());
        startEncode();
    }
}
//stopPublish停止推流 
public void stopPublish() {
    if (mFlvMuxer != null) {
        stopEncode();
        mFlvMuxer.stop();
    }
}

results matching ""

    No results matching ""