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
}
我们看到在回调中用到了TuSDKAACAudioFileEncoder
AAC文件编码器 ,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);
}
// 在这里添加后续处理逻辑,可用于编码,播放,或写入文件。