//创建实例
AliyunIMixComposer mixComposer = AliyunMixComposerCreator.createMixComposerInstance();
//创建轨道1
AliyunMixTrackLayoutParam track1Layout = new AliyunMixTrackLayoutParam.Builder()
.centerX(0.25f)
.centerY(0.5f)
.widthRatio(0.5f)
.heightRatio(1.f)
.build();
// 创建轨道1的第一个视频流1
AliyunMixStream stream11 = new AliyunMixStream
.Builder()
.displayMode(VideoDisplayMode.FILL)
.filePath("/storage/emulated/0/11.mp4")
.streamEndTimeMills(20000)
.build();
//添加该视频流到轨道1
track1.addStream(stream11);
//创建轨道1的第二个视频流
AliyunMixStream stream12 = new AliyunMixStream
.Builder()
.displayMode(VideoDisplayMode.FILL)
.filePath("/storage/emulated/0/12.mp4")
.streamEndTimeMills(20000)
.build();
//添加该视频流到轨道1
track1.addStream(stream12);
//创建轨道2
AliyunMixTrackLayoutParam track2Layout = new AliyunMixTrackLayoutParam.Builder()
.centerX(0.75f)
.centerY(0.5f)
.widthRatio(0.5f)
.heightRatio(1.f)
.build();
//创建轨道2的第一个视频
AliyunMixStream stream21 = new AliyunMixStream
.Builder()
.displayMode(VideoDisplayMode.FILL)
.filePath("/storage/emulated/0/21.mp4")
.streamEndTimeMills(20000)
.build();
//添加该视频流到轨道2
track2.addStream(stream21);
//创建轨道2的第二个视频
AliyunMixStream stream22 = new AliyunMixStream
.Builder()
.displayMode(VideoDisplayMode.FILL)
.filePath("/storage/emulated/0/22.mp4")
.streamEndTimeMills(20000)
.build();
//添加该视频流到轨道2
track2.addStream(stream22);
//配置输出参数
AliyunMixOutputParam outputParam = new AliyunMixOutputParam.Builder()
.outputPath("/sdcard/output.mp4")
.outputAudioReferenceTrack(track2)//表示使用轨道2的音频作为最后的音频,目前音频轨道只支持一个音频流,因此轨道2第二个视频的音频流不会加进去。
.outputDurationReferenceTrack(track2)//表示使用轨道2的时长作为最后输出视频的时长,如果轨道1的时长不够,则会停在最后一帧
.crf(6)
.videoQuality(VideoQuality.HD)
.outputWidth(720)
.outputHeight(1280)
.fps(30)
.gopSize(30)
.build();
mixComposer.setOutputParam(outputParam);
//开始合成
AliyunMixCallback callback = new AliyunMixCallback() {
@Override
public void onProgress(long progress) {//合成进度
Log.e("MixRecord", "onProgress " + progress);
}
@Override
public void onComplete() {
Log.e("MixRecord", "onComplete");
runOnUiThread(new Runnable() {
@Override
public void run() {
//该接口一定不能在回调的线程中直接调用!!!
mixComposer.release();
}
});
}
@Override
public void onError(int errorCode) {
Log.e("MixRecord", "onError " + errorCode);
}
};
mixComposer.start(callback);