java 图片合成视频_GitHub - JueShouGitHub/VideoAndAudioMuxer: 一个简单的音视频你合成的框架,支持图片合成音视频(有内置的几款音频),支持图片编辑后合成音...

VideoAndAudioMuxer

一个简单的音视频你合成的框架,支持图片合成音视频(有内置的几款音频),支持图片编辑后合成音视频

使用方法

本项目中图片生成视频用的时JavaCV来实现的,JavaCV的使用方法 请参照

还有一点,该项目还集成了RxJava来处理异步操作,所以就不必要在重复添加依赖了,还有retrofit也集成了,不需要的小伙伴可以直接去掉

compile 'com.squareup.retrofit2:retrofit:2.3.0'

compile 'com.squareup.retrofit2:converter-gson:2.3.0'

compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'

compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'

compile 'io.reactivex.rxjava2:rxjava:2.1.7'

compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0'

1、首先在程序启动时初始化资源(即复制音频资源到SD卡上),音频文件放在assets文件夹下(与res文件夹

同级)

MediaConstant.copyFilesFassets(this, "audio", MediaConstant.createAssetsPath());

其中 audio 即本地存放音频文件的文件夹的原文件路径 可以随意修改

Constant.createAssetsPath() 即复制后在SD卡上的路径 可以随意修改

2、视频音频合成新的视频

AudioAndVideoCompounder compounder =

AudioAndVideoCompounder.createCompounder(String videoPath, String audioPath, String dstPath);

createCompounder 方法参数说明:

videoPath: 原视频路径

audioPath:原音频路径

dstPath :合成后音视频路径

然后调用 AudioAndVideoCompounder的start()方法即可 最好通过异步方式来调用

如果需要,记得合成玩将原视频删除

File file = new File(saveMp4Name);

if (file.exists()) file.delete();

###3、通过选择本地图片(编辑或者其他对图片进行涂鸦后),合成GIF或者合成无声的视频

先说合成无声视频吧(关于声音,有了视频再合成声音嘛,上面说的方法就好了!)

String videoPath =

CreateVideoUtil.createVideo(String saveMp4Name, List imageList, int width, int height);

createVideo 该方法有多个重载方法,注意参数就好了

saveMp4Name 生成视频的路径

imageList 用于生成视频的图片合集(可以是涂鸦过的,也可以时原图)

width 生成视频的宽

height 生成视频的高

宽高可以这样获取:

WindowManager manager = activity.getWindowManager();

DisplayMetrics outMetrics = new DisplayMetrics();

manager.getDefaultDisplay().getMetrics(outMetrics);

int mWidth = outMetrics.widthPixels;

int mHeight = outMetrics.heightPixels;

如果想要音频效果,按照第一步的合成音视频即可

接着说说用图片生成GIf图的方法吧

CreateGifUtil.createGif(String filename, List paths, Activity activity, ZCreateListener listener);

其中涉及一个回调函数 ZCreateListener,很简单就一个方法

void onComplete(String path);

参数 String path 就是生成的GIf的路径

补充一下,其中涉及的图片选择和图片涂鸦的功能

图片选择选用的是:

implementation('com.github.LuckSiege.PictureSelector:picture_library:v2.1.7')

图片涂鸦选择的是:

implementation ('com.hzw.graffiti:graffiti:4.3.1')

用法:必须用RecyclerView来展示图片,

mRecyclerView.setLayoutManager(new GridLayoutManager(mContext, 4));

其中 GridLayoutManager 已经实现,可以直接拿来使用

至于Adapter

GridImageAdapter(Context context, onAddPicClickListener mOnAddPicClickListener);

也是内部实现好的,可以直接拿来用

mAdapter = new GridImageAdapter(this, () -> {

//这里就是起吊相册,选择图片

GridImageConfig.intoAlbum(mContext, 30, selectList);

});

mAdapter.setOnItemClickListener((position, v) -> {

if (selectList.size() > 0) {

LocalMedia media = selectList.get(position);

//TODO 这里就是跳转涂鸦页面

Graffiti.startActivityForResult(ActivityImageList.this

, media.getCompressPath()

, position);

}

});

下面就是拿到选择后或者涂鸦后的图片方法:

通过onActivityResult拿到数据

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

//涂鸦回调

for (int a = 0; a < mAdapter.getItemCount(); a++) {

if (requestCode == a)

if (resultCode == GraffitiActivity.RESULT_OK) {

// 获取涂鸦后的图片

String path = data.getStringExtra(GraffitiActivity.KEY_IMAGE_PATH);

mImageList.remove(a);

mImageList.add(a, path);

LocalMedia media = selectList.get(a);

media.setCompressPath(path);

mAdapter.notifyDataSetChanged();

} else if (resultCode == GraffitiActivity.RESULT_ERROR) {

toast("制作失败");

}

}

//++++++++++++++++++++++++

//相册选取回调

if (requestCode == PictureConfig.CHOOSE_REQUEST)

if (resultCode == RESULT_OK) {

// 图片选择结果回调

selectList = PictureSelector.obtainMultipleResult(data);

GridImageAdapter adapter = (GridImageAdapter) mRecyclerView.getAdapter();

adapter.setList(selectList);

adapter.notifyDataSetChanged();

for (int a = 0; a < selectList.size(); a++) {

mImageList.add(a, selectList.get(a).getCompressPath());

}

}

Log.d("mImageList", mImageList.size() + "");

for (String path : mImageList) {

Log.d("mImageList", path);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值