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);
}
}