Skip to content

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

Notifications You must be signed in to change notification settings

JueShouGitHub/VideoAndAudioMuxer

Repository files navigation

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 :合成后音视频路径

然后调用 AudioAndVideoCompounderstart()方法即可 最好通过异步方式来调用 如果需要,记得合成玩将原视频删除

    File file = new File(saveMp4Name);
    if (file.exists()) file.delete();

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

先说合成无声视频吧(关于声音,有了视频再合成声音嘛,上面说的方法就好了!)
    String videoPath = 
    CreateVideoUtil.createVideo(String saveMp4Name, List<String> 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<String> 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);
            }
        }

About

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

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages