本文为您介绍Android端视频合并的功能介绍、合并流程以及示例代码。

功能介绍

短视频SDK提供了视频合并接口AliyunIMixComposer。该接口实现离线多画面合并成一个视频的功能,例如画中画、九宫格、左右分屏、上下分屏等视频效果,支持添加多轨道视频。

拼接流程

  • 初始化前

    需要将各类文件加载完成。

    AlivcSdkCore.register(getApplicationContext());
  • 初始化
    AliyunMixComposerCreator.createMixComposerInstance();
  • 创建轨道
    AliyunIMixComposer.createTrack(AliyunMixTrackLayoutParam layoutParam);
  • 轨道添加视频流
    配置项 配置实例
    创建视频流
    new AliyunMixStream.Builder().build();
    给轨道添加视频流
    AliyunMixTrack.addStream(AliyunMixStream stream);
  • 配置输出参数
    AliyunIMixComposer.setOutputParam(AliyunMixOutputParam param);
  • 开始混合
    AliyunIMixComposer.start(AliyunMixCallback callback);
  • 暂停混合
    AliyunIMixComposer.pause();
  • 继续混合
    AliyunIMixComposer.resume();
  • 取消混合
    AliyunIMixComposer.cancel();
  • 销毁
    AliyunIMixComposer.release();

示例代码

//创建实例
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);