API 使用示例具体细节「component」包下的使用示例
| 类名 | 功能说明 | 
|---|---|
| TuSDKAACAudioFileEncoder | AAC音频文件编码器 | 
| TuSDKAverageAudioMixer | 音频混合器 | 
(参考Demo中AudioMixedActivity)
初始化音频混合对象
  TuSDKAverageAudioMixer audioMixer = new TuSDKAverageAudioMixer();
  //设置混音回调
  audioMixer.setOnAudioMixDelegate(mAudioMixerDelegate);
这里需要设置一个混音的回调mAudioMixerDelegate 
/**
 * 音频混合Delegate
 */
private TuSDKAudioMixer.OnAudioMixerDelegate mAudioMixerDelegate = new TuSDKAudioMixer.OnAudioMixerDelegate() {
    /**
     * 混合状态改变事件
     */
    @Override
    public void onStateChanged(TuSDKAudioMixer.State state) {
        if (state == TuSDKAudioMixer.State.Complete) {
            // 停止AAC编码器
            mAACFileEncoder.stop();
            TuSdk.messageHub().showSuccess(AudioMixedActivity.this, "混合完成");
        } else if (state == Decoding || state == Mixing) {
            TuSdk.messageHub().setStatus(AudioMixedActivity.this, "混合中");
        } else if (state == TuSDKAudioMixer.State.Cancelled) {
            //删除混合的音频文件
            delMixedFile();
        }
    }
    /**
     * 当前解析到主背景音乐信息时回调该方法,其他音乐将参考该信息进行混合
     */
    @Override
    public void onReayTrunkTrackInfo(TuSDKAudioInfo rawInfo) {
    }
    @Override
    public void onMixingError(int errorCode) {
        TuSdk.messageHub().showError(AudioMixedActivity.this, "混合失败");
    }
    /**
     * 混合后的音频数据(未经编码)
     */
    @Override
    public void onMixed(byte[] mixedBytes) {
        // 编码音频数据
        mAACFileEncoder.queueAudio(mixedBytes);
    }
};
混音的状态是在TuSDKAudioMixer.State这个枚举中,有以下几种状态 
  /**
   * 混音状态
   */
  public enum State
  {
      /** 空闲状态 */
      Idle,
      /** 正在解码 */
      Decoding,
      /** 解码完成 */
      Decoded,
      /** 混合中 */
      Mixing,
      /** 混合完成 */
      Complete,
      /** 已取消 */
      Cancelled
  }
我们看到在回调中用到了TuSDKAACAudioFileEncoderAAC文件编码器 ,AAC文件编码器的初始化方式为
初始化AAC音频文件编码器
/** AAC 音频文件编码器,可将混合的音频数据编码为AAC文件 */
TuSDKAACAudioFileEncoder mAACFileEncoder = new TuSDKAACAudioFileEncoder();
// 初始化音频编码器
mAACFileEncoder.initEncoder(TuSDKAudioEncoderSetting.defaultEncoderSetting());
// 设置输入路径
mAACFileEncoder.setOutputFilePath(getMixedAudioPath());
在初始化调用initEncoder的时候,我们会传入一个TuSDKAudioEncoderSetting对象,这个是音频编码器的设置,主要用来设置以下的参数
/** TuSDKAudioEncoderSetting **/
/** 录制的音频数据格式 默认:AudioFormat.ENCODING_PCM_16BIT */
public int audioFormat;
/** 录制的音频采样率 默认:44100 */
public int sampleRate;
/** 录制的音频通道设置 AudioFormat.CHANNEL_IN_MONO 或 AudioFormat.CHANNEL_IN_STEREO  默认:AudioFormat.CHANNEL_IN_STEREO */
public int channelConfig;
/** 音频质量 默认:AudioQuality.MEDIUM1 */
public AudioQuality audioQuality;
/** 默认:MediaCodecInfo.CodecProfileLevel.AACObjectLC */
public int mediacodecAACProfile;
/** 音道数 默认:2 */
public int mediacodecAACChannelCount;
/** 是否启用音频缓冲区 */
public boolean enableBuffers;
如果不需要自定义参数的话,直接调用TuSDKAudioEncoderSetting.defaultEncoderSetting()获取默认配置即可
多音轨开始混合
/** 启动AAC文件编码器 **/
mAACFileEncoder.start();
/** 向音频混合器输入需要混合的音频对象列表 **/
mAudioMixer.mixAudios(getAudioEntryList());
getAudioEntryList()为获取音频对象TuSDKAudioEntry列表
获取音频文件列表
音频对象为TuSDKAudioEntry.java 支持URI和Path两种形式,其中可支持的操作有
/**
 * 设置改音频是否为主背景
 * @param trunk 其他音频混合时将参考该音频 
 */
public TuSDKAudioEntry setTrunk(boolean trunk);
/**
* 设置是否循环
* @param looping true : 在背景音乐中循环
*/
public TuSDKAudioEntry setLooping(boolean looping);
/**
* 该音频在主干音频的位置  (mTrunk == true时 忽略该设置)
* @param timeRange 时间区间
*/
public TuSDKAudioEntry setTimeRange(TuSDKTimeRange timeRange);
/**
* 设置裁剪区域
* @param cutTimeRange 裁剪时间区间
*/
public TuSDKAudioEntry setCutTimeRange(TuSDKTimeRange cutTimeRange)
/**
 * 设置音量
 * @param volume (0f - 1f)
 */
public TuSDKAudioEntry setVolume(float volume);
| 类名 | 功能说明 | 
|---|---|
| TuSDKMP4MovieMixer | 对视频和多个音频进行混合 | 
(参考Demo中的TuSDKMP4MovieMixer)
初始化混合器
混合器采用了建造者模式去构建,构建方式如下
TuSDKMP4MovieMixer mMP4MovieMixer = new TuSDKMP4MovieMixer();
mMP4MovieMixer.setDelegate(this)
        .setOutputFilePath(getMixedVideoPath()) // 设置输出路径
        .setVideoSoundVolume(1.0f) // 设置音乐音量
        .setClearAudioDecodeCacheInfoOnCompleted(true); // 设置音视频混合完成后是否清除缓存信息 默认:true (false:再次混合时可加快混合速度)
    这边会设置一个回调 OnMP4MovieMixerDelegate 这个回调内部有这几个方法
/**
 * 音视频混合Delegate
 */
public interface OnMP4MovieMixerDelegate
{
   /**
    * 混合状态改变
    * @param state
    * @see TuSDKMP4MovieMixer.State
    */
   void onStateChanged(TuSDKMP4MovieMixer.State state);
   /**
    * 错误状态
    * @param code
    * @see ErrorCode
    */
   void onErrrCode(ErrorCode code);
   /**
    * 混合完成
    * @param result 视频混合结果
    */
   void onMixerComplete(TuSDKVideoResult result);
}
开始混合
//  mVideoDataSource : 视频路径 mAudioTracks : 待混合的音频数据 true : 是否混合视频原音
mMP4MovieMixer.mix(TuSDKMediaDataSource.create(getVideoPath()), mAudioEntryList, false); 
 开始混合的时候需要传入
TuSDKMediaDataSource   mAudioEntryList(TuSDKAudioEntry列表,多音轨混合有详细介绍)这三个设置
状态和错误码
/**
 *  TuSDKMP4VideoMixer 状态信息
 */
public enum State
{
   /** 空闲状态 */
   Idle,
   /** 正在解码 */
   Decoding,
   /** 解码完成 */
   Decoded,
   /** 混合中 */
   Mixing,
   /** 已取消 */
   Cancelled,
   /** 混合视频 */
   Failed
}
/**
 * 错误码
 */
public enum ErrorCode
{
   /** 不支持的视频格式 */
   UnsupportedVideoFormat,
}
| 类名 | 功能说明 | 
|---|---|
| TuSDKVideoImageExtractor | 视频帧提取器 | 
(参考Demo中MovieThumbActivity)
视频帧提取器用法
//获取出的每帧图片大小
TuSdkSize tuSdkSize = TuSdkSize.create(TuSdkContext.dip2px(56), TuSdkContext.dip2px(30));
//创建视频帧提取器
TuSDKVideoImageExtractor extractor = TuSDKVideoImageExtractor.createExtractor();
//设置输出图片大小
extractor.setOutputImageSize(tuSdkSize)
      //设置视频数据源
        .setVideoDataSource(TuSDKMediaDataSource.create(getVideoPath()))
      //设置分离图片的数量
        .setExtractFrameCount(15);
//设置分离回调,开始提取图片
extractor.asyncExtractImageList(mImageExtractorDelegate);
 这里会设置分离的回调,回调的方法为
public  interface TuSDKVideoImageExtractorDelegate
{   
   /** 此方法是在所有图片分离完毕之后回调 只会回调一次 **/
   void onVideoImageListDidLoaded(List<Bitmap> images);
   /** 此方法是在每分离出一张图片就会回调一次  **/
   void onVideoNewImageLoaded(Bitmap bitmap);
}
在TuSDKVideoImageExtractor中调用此方法可以精确提取视频帧
/**
* 获取指定时间的视频缩略图 单位:微秒
* 
* @param frameTimeUs 侦时间 单位:微妙
* @param quality 质量 0-100
* @return Bitmap
*/
public Bitmap getFrameAtTime(long frameTimeUs, int quality) 
| 类名 | 功能说明 | 
|---|---|
| TuSdkMediaSuit.merge() | 多视频拼接 | 
TuSdkMediaSuit.merge(mMoviePathList, muxerPath, ouputVideoFormat, ouputAudioFormat, mediaProgress);
mMoviePathList 待合成视频列表muxerPath 最终生成的文件路径ouputVideoFormat 输出的视频格式ouputAudioFormat输出的音频格式mediaProgress进度回调进度的回调有以下几个方法
/** 媒体处理进度接口 */
public interface TuSdkMediaProgress {
    /**
     * 执行进度 [主线程]
     *
     * @param progress        进度百分比 0-1
     * @param mediaDataSource 当前处理的视频媒体源
     * @param index           当前处理的视频索引
     * @param total           总共需要处理的文件数
     */
    void onProgress(float progress, TuSdkMediaDataSource mediaDataSource, int index, int total);
    /***
     * 完成转码 [主线程]
     * @param e 如果成功则为Null
     * @param outputFile 输出文件路径
     * @param total 处理文件总数
     */
    void onCompleted(Exception e, TuSdkMediaDataSource outputFile, int total);
}
| 类名 | 功能说明 | 
|---|---|
| TuSdkMediaSuit.cuter() | 视频裁剪 | 
(参考Demo中的 MovieCutActivity)
TuSdkMediaSuit.cuter(inputMediaSource, outputFilePath, ouputVideoFormat, ouputAudioFormat, orientation,rectDrawF, rectCutF, timeSlice, mCuterMediaProgress);
inputMediaSource  输入的视频源outputFilePath      输出的地址ouputVideoFormat  输出的视频格式信息ouputAudioFormat  输入的视频格式信息orientation 设置输出视频方向 详见ImageOrientation timeSlice 设置时间的范围| 类名 | 功能说明 | 
|---|---|
| TuSDKAudioFileRecorder | 音频录制器 | 
(参考Demo中的AudioRecordActivity)
初始化音频录制器
TuSDKAudioFileRecorder mAudioRecorder = new TuSDKAudioFileRecorder();
//设置输出文件类型
mAudioRecorder.setOutputFormat(TuSDKAudioFileRecorder.OutputFormat.AAC);
//设置文件录制回调
mAudioRecorder.setAudioRecordDelegate(mRecordAudioDelegate);
       文件输出类型可以设置为PCM和AAC两种文件类型
回调接口有以下几个方法
/** 录音事件回调 */
public static interface TuSDKRecordAudioDelegate
{
   /**
    * 录制完成
    * 
    * @param file
    */
   public void onAudioRecordComplete(File file);
   /**
    * 录制状态改变
    * 
    * @param state @see RecordState
    */
   void onAudioRecordStateChanged(RecordState state);
   /**
    * 错误信息回调
    * 
    * @param error @see RecordError
    */
   void onAudioRecordError(RecordError error);
}
开始、暂停、继续、结束的方法分别是
//开始录制
mAudioRecorder.start();
//暂停录制
mAudioRecorder.pauseRecord();
//继续录制
mAudioRecorder.resumeRecord();
//结束录制
mAudioRecorder.stop();
| 类名 | 功能名称 | 
|---|---|
| TuSdkAudioPitchEngine | 音频变声 | 
目前音频特效类型有以下几种:
 //正常
TuSdkSoundPitchType.Normal
//怪兽
TuSdkSoundPitchType.Monster
//大叔
TuSdkSoundPitchType.Uncle
//女生
TuSdkSoundPitchType.Girl
//萝莉
TuSdkSoundPitchType.Lolita
TuSdkAudioPitchEngine 队列中 /***
  * 处理音频数据
  * @param byteBuffer 输入缓存
  * @param bufferInfo 缓存信息
  * @return 是否已处理
 */
 void processInputBuffer(ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo);
TuSdkAudioPitchEngine输入的 PCM 音频信息变更/**
 * 更新音频信息
 * @param inputAudioInfo 新的音频信息
 */
void changeAudioInfo(TuSdkAudioInfo inputAudioInfo);
/**
* 重置处理器 
*/
void reset();
/**
* 释放处理器
*/
void release();
// setp1: 初始化输入的音频信息
TuSdkAudioInfo  inputAudioInfo = new TuSdkAudioInfo(TuSdkMediaFormat.buildSafeAudioEncodecFormat());
// setp2: 初始化 TuSdkAudioPitchEngine
TuSdkAudioPitchEngine audioPitchEngine = new TuSdkAudioPitchEngine(inputAudioInfo);
// setp3: 设置 TuSdkAudioPitchEngine 处理回调
audioPitchEngine.setOutputBufferDelegate(mAudioPitchEngineOutputBufferDelegate);
// setp4: 设置当前需要的音效
audioPitchEngine.setSoundPitchType(TuSdkAudioPitchEngine.TuSdkSoundPitchType.Normal);
// setp5: 在输出PCM数据的地方调用
audioPitchEngine.processInputBuffer(outputByteBuffer, bufferInfo);
// setp6: 经过TuSdkAudioPitchEngine处理后的数据在会在回调中返回
/** 音频处理数据输出委托 **/
interface TuSdKAudioEngineOutputBufferDelegate {
    void onProcess(ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo);
}
// 在这里添加后续处理逻辑,可用于编码,播放,或写入文件。