Android - FFmpeg视频录制压缩处理走过的坑

在公司里面开发项目做视频处理时遇到了问题,这个问题困扰我很久了,解决了只想给大家说出来,虽然很简单的问题,免得你们遇到我类似的问题再次难以自拔!

视频压缩处理我用了两种方式来解决的,一种是第三方,一种用了自己写了封装的。
今天先给大家讲解popwindow引用第三方视频压缩处理所注意的问题。

package com.zontonec.ztkid.activity;

import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.ClipData;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.FileProvider;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import android.view.animation.AnimationUtils;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;

import com.zontonec.ztkid.Constants;
import com.zontonec.ztkid.R;
import com.zontonec.ztkid.bean.DataRequestManager;
import com.zontonec.ztkid.net.Apn;
import com.zontonec.ztkid.net.request.ShareGrowthRequest;
import com.zontonec.ztkid.net.request.ShareRequest;
import com.zontonec.ztkid.util.Bimp;
import com.zontonec.ztkid.util.FileUtils;
import com.zontonec.ztkid.util.ImageUtil;
import com.zontonec.ztkid.util.JSONUtils;
import com.zontonec.ztkid.util.MapUtil;
import com.zontonec.ztkid.util.Tip;
import com.zontonec.ztkid.util.UploadUtil;
import com.zontonec.ztkid.videorecording.SendSmallVideoActivity;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import mabeijianxi.camera.MediaRecorderActivity;
import mabeijianxi.camera.VCamera;
import mabeijianxi.camera.model.MediaRecorderConfig;
import mabeijianxi.camera.util.DeviceUtils;

public class ShareActivity extends CommonActivity{
    private EditText edit_txt;
    LayoutInflater layoutInflater;
    private byte[] mContent;
    private Bitmap myBitmap;
    private InputMethodManager manager;
    private GridView noScrollgridview;
    private GridAdapter adapter;
    private String path = "";
    private ProgressDialog progressDialog;
    //拍照
    private Uri contentUri;
    private final int NEED_CAMERA = 200;
    private static final int TAKE_PICTURE = 2;
    //相册
    private static final int REQUEST_CAMERA = 1;
    private final int NEED_ALBUM = 100;

    //视频
    private static final int VIDEO_RECORDING = 3;

    private ImageButton iv_back;
    private TextView sendText;

    private String module;//发布动态目录

    private String userid;//家长id
    private String kidid;//学生id
    private String schoolid;//学校id

    private String appType;//家长端
    private String appKey;//时间戳
    private String timeSpan;//时间

    private String toWhereType;//toWhereType = 5代表同步到成长日记;toWhereType = 4代表同步到班级圈
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_diary);

        int value_tag = sp.readInt(Constants.VALUE_TAG, 0);
        int tag = sp.readInt(Constants.VAULE_KID, value_tag);
        userid = sp.readString(Constants.VAULE_FAMILYID + tag, "");
        kidid = sp.readString(Constants.VAULE_KIDID + tag, "");
        schoolid = sp.readString(Constants.VALUE_SCHOOLID + tag, "");

        DataRequestManager dataRequest = new DataRequestManager();
        appType = dataRequest.getAppType();
        appKey = dataRequest.getAppKey();
        timeSpan = dataRequest.getTimeSpan();

        Intent intent = this.getIntent();
        module = getIntent().getStringExtra("module");

        initActivity();
        //初始化视频存储路径
        initSmallVideo(this);
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        FileUtils.deleteDir();
        Bimp.bmp.clear();
        Bimp.drr.clear();
        Bimp.max=0;
    }

    @Override
    public void initActivity() {
        super.initActivity();
        if (module.equals("showclass")) {
            setBackTitleBar("发布班级圈");
        } else {
            setBackTitleBar("发布成长日记");
        }
        iv_back = (ImageButton) this.findViewById(R.id.title_bar_back);
        iv_back.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                finish();
            }
        });
        sendText = (TextView) findViewById(R.id.title_bar_right_send);
        sendText.setOnClickListener(this);
        manager = (InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
        noScrollgridview = (GridView) findViewById(R.id.noScrollgridview);
        edit_txt = (EditText) findViewById(R.id.edit);//编辑的文本内容
        noScrollgridview = (GridView) findViewById(R.id.noScrollgridview);

        //是否同步到成长日记
        toWhereType = "0";
        //选择同步时执行如下方法
//      ((CompoundButton) findViewById(R.id.switch_main)).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
//          @Override
//          public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//              if (module.equals("showclass")) {
//                  toWhereType = "5";
//              } else if (module.equals("showmy")) {
//                  toWhereType = "4";
//              }
//          }
//      });

        if (module.equals("showclass")) {
            ((CompoundButton) findViewById(R.id.switch_main)).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if (isChecked == false) {
                        toWhereType = "5";
                    } else {
                        toWhereType = "0";
                    }
                }
            });
        } else if (module.equals("showmy")) {
            ((CompoundButton) findViewById(R.id.switch_main)).setText("同步到班级圈");
            ((CompoundButton) findViewById(R.id.switch_main)).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if (isChecked == false) {
                        toWhereType = "4";
                    } else {
                        toWhereType = "0";
                    }
                }
            });
        }

        Init();
    }


    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
            case R.id.title_bar_right_send:
                String content =edit_txt.getEditableText().toString().trim();
                if((content.equals("") || content.equals(null)) && (Bimp.drr.size() == 0)){
                    Tip.tipshort(mContext, "分享不能为空哦");
                    return;
                }
                new UpHead().execute();
                break;
            default:
                break;
        }
    }


    @SuppressLint("NewApi")
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        ContentResolver resolver = mContext.getContentResolver();
        /**
         * 因为两种方式都用到了startActivityForResult方法, 这个方法执行完后都会执行onActivityResult方法,
         * 所以为了区别到底选择了那个方式获取图片要进行判断,
         * 这里的requestCode跟startActivityForResult里面第二个参数对应
         */
        if (requestCode == 0) {
            try {
                // 获得图片的uri
                Uri originalUri = data.getData();
                // 将图片内容解析成字节数组
                mContent = ImageUtil.readStream(resolver.openInputStream(Uri
                        .parse(originalUri.toString())));
                // 将字节数组转换为ImageView可调用的Bitmap对象
                myBitmap = ImageUtil.getPicFromBytes(mContent, null);
                myBitmap = ImageUtil.comp(myBitmap);
                myBitmap = ImageUtil.toRoundCorner(myBitmap, 20);
                // //把得到的图片绑定在控件上显示
//              add_image.setImageBitmap(myBitmap);
            } catch (Exception e) {
                // System.out.println(e.getMessage());
            }

        } else if (requestCode == REQUEST_CAMERA) {
            try {
                super.onActivityResult(requestCode, resultCode, data);
                Bundle extras = data.getExtras();
                myBitmap = (Bitmap) extras.get("data");
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                myBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
                mContent = baos.toByteArray();
                myBitmap = ImageUtil.toRoundCorner(myBitmap, 20);
            } catch (Exception e) {
                e.printStackTrace();
            }
            // 把拍摄的照片转成圆角显示在预览控件上
            // //把得到的图片绑定在控件上显示
//          add_image.setImageBitmap(myBitmap);

        }else if (requestCode == TAKE_PICTURE){
            super.onActivityResult(requestCode, resultCode, data);
            if (Bimp.drr.size() < 9 && resultCode == -1) {
                Bimp.drr.add(path);

                BitmapFactory.Options op = new BitmapFactory.Options();
                //开始读入图片,此时把options.inJustDecodeBounds 设回true了
                op.inJustDecodeBounds = true;
                Bitmap pic = null;
                op.inJustDecodeBounds = false;
                int w = op.outWidth;//图片的实际宽度
                float ww = 1080f;//这里设置高度为1080f
                //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
                int be = 1;//be=1表示不缩放
                if (w > ww) {//根据宽度固定大小缩放
                    be = (int) (op.outWidth / ww)+1;
                }
                if (be <= 0)
                    be = 1;
                op.inSampleSize = be;//设置缩放比例
                //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
                pic = BitmapFactory.decodeFile(path, op);
                FileOutputStream b = null;
                try {
                    b = new FileOutputStream(path);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
                if (pic != null) {
                    pic.compress(Bitmap.CompressFormat.JPEG, 30, b);//30是压缩率表示,压缩70%;如果不压缩是100,表示压缩率为0
                }
            }
        }
    }


    public void Init() {

        noScrollgridview.setSelector(new ColorDrawable(Color.TRANSPARENT));
        if(adapter==null){
            adapter = new GridAdapter(mContext);
        }
        adapter.update();
        adapter.notifyDataSetChanged();
        noScrollgridview.setAdapter(adapter);
        noScrollgridview.setOnItemClickListener(new OnItemClickListener() {

            @SuppressLint("NewApi")
            public void onItemClick(AdapterView arg0, View arg1, int arg2,
                                    long arg3) {
//                  Intent intent = new Intent(mContext,
//                          PhotoActivity.class);
//                  intent.putExtra("ID", arg2);
////                    startActivity(intent);
//                  startActivityForResult(intent, REQUEST_CAMERA);
                if (arg2 == Bimp.bmp.size()) {
                    hideKeyboard();
                    new PopupWindows(mContext,
                            noScrollgridview);
                } else {
                    Intent intent = new Intent(mContext,
                            PhotoActivity.class);
                    intent.putExtra("ID", arg2);
                    startActivity(intent);
                }
            }
        });
    }
    @SuppressLint("HandlerLeak")
    public class GridAdapter extends BaseAdapter {
        private LayoutInflater inflater; // 视图容器
        private int selectedPosition = -1;// 选中的位置
        private boolean shape;

        public boolean isShape() {
            return shape;
        }

        public void setShape(boolean shape) {
            this.shape = shape;
        }

        public GridAdapter(Context context) {
            inflater = LayoutInflater.from(context);
        }

        public void update() {
            loading();
        }

        public int getCount() {
            return (Bimp.bmp.size() + 1);
        }

        public Object getItem(int arg0) {

            return null;
        }

        public long getItemId(int arg0) {

            return 0;
        }

        public void setSelectedPosition(int position) {
            selectedPosition = position;
        }

        public int getSelectedPosition() {
            return selectedPosition;
        }

        /**
         * ListView Item设置
         */
        @SuppressLint("NewApi")
        public View getView(int position, View convertView, ViewGroup parent) {
            final int coord = position;
            ViewHolder holder = null;
            if (convertView == null) {

                convertView = inflater.inflate(R.layout.item_published_grida,
                        parent, false);
                holder = new ViewHolder();
                holder.image = (ImageView) convertView
                        .findViewById(R.id.item_grida_image);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

//          if(Bimp.bmp.size() > 4){
//              add_image.setVisibility(View.INVISIBLE);
//          }else{
//              add_image.setVisibility(View.VISIBLE);
//          }
//          holder.image.setImageBitmap(Bimp.bmp.get(position));
            if (position == Bimp.bmp.size()) {
                holder.image.setImageBitmap(BitmapFactory.decodeResource(
                        getResources(), R.mipmap.icon_addpic_unfocused));
                if (position == 9) {
                    holder.image.setVisibility(View.GONE);

                }
            } else {
                holder.image.setImageBitmap(Bimp.bmp.get(position));
            }
            return convertView;
        }

        public class ViewHolder {
            public ImageView image;
        }

        Handler handler = new Handler() {
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case 1:
                        adapter.notifyDataSetChanged();
                        break;
                }
                super.handleMessage(msg);
            }
        };

        public void loading() {
            new Thread(new Runnable() {
                public void run() {
                    while (true) {
                        if (Bimp.max == Bimp.drr.size()) {
                            Message message = new Message();
                            message.what = 1;
                            handler.sendMessage(message);
                            break;
                        } else {
                            try {
                                String path = Bimp.drr.get(Bimp.max);
                                System.out.println(path);
                                Bitmap bm = Bimp.revitionImageSize(path);
                                Bimp.bmp.add(bm);
                                String newStr = path.substring(
                                        path.lastIndexOf("/") + 1,
                                        path.lastIndexOf("."));
                                FileUtils.saveBitmap(bm, "" + newStr);
                                Bimp.max += 1;
                                Message message = new Message();
                                message.what = 1;
                                handler.sendMessage(message);
                            } catch (IOException e) {

                                e.printStackTrace();
                            }
                        }
                    }
                }
            }).start();
        }
    }

    public String getString(String s) {
        String path = null;
        if (s == null)
            return "";
        for (int i = s.length() - 1; i > 0; i++) {
            s.charAt(i);
        }
        return path;
    }

//  protected void onRestart() {
//      adapter.update();
//      super.onStart();
//  }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        adapter.update();
        adapter.notifyDataSetChanged();
    }

    //相册 拍照 视频
    public class PopupWindows extends PopupWindow {

        public PopupWindows(final Context mContext, View parent) {

            View view = View
                    .inflate(mContext, R.layout.item_popupwindows, null);
            view.startAnimation(AnimationUtils.loadAnimation(mContext,
                    R.anim.fade_ins));
            LinearLayout ll_popup = (LinearLayout) view
                    .findViewById(R.id.ll_popup);
            ll_popup.startAnimation(AnimationUtils.loadAnimation(mContext,
                    R.anim.push_bottom_in_2));

            setWidth(LayoutParams.FILL_PARENT);
            setHeight(LayoutParams.FILL_PARENT);
            setBackgroundDrawable(new BitmapDrawable());
            setFocusable(true);
            setOutsideTouchable(true);
            setContentView(view);
            showAtLocation(parent, Gravity.BOTTOM, 0, 0);
            update();

            final Button bt1 = (Button) view
                    .findViewById(R.id.item_popupwindows_camera);
            Button bt2 = (Button) view
                    .findViewById(R.id.item_popupwindows_Photo);
            Button bt3 = (Button) view
                    .findViewById(R.id.item_popupwindows_cancel);
            //视频部分
            Button bt4 = (Button) view
                    .findViewById(R.id.item_popupwindows_video);
            bt1.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    //检测是否有相机和读写文件权限
//                    if (ActivityCompat.checkSelfPermission(ShareActivity.this, Manifest.permission.CAMERA)
//                            != PackageManager.PERMISSION_GRANTED
//                            || ActivityCompat.checkSelfPermission(ShareActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
//                            != PackageManager.PERMISSION_GRANTED) {
//                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//                            requestPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, NEED_CAMERA);
//                        } else {
                            photo();
//                        }
//                    }
                    dismiss();
                }
            });
            bt2.setOnClickListener(new OnClickListener() {
                @SuppressLint("NewApi")
                public void onClick(View v) {

                    //检测是否有相机和读写文件权限
//                    if (ActivityCompat.checkSelfPermission(ShareActivity.this, Manifest.permission.CAMERA)
//                            != PackageManager.PERMISSION_GRANTED
//                            || ActivityCompat.checkSelfPermission(ShareActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
//                            != PackageManager.PERMISSION_GRANTED) {
//                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//                            requestPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, NEED_ALBUM);
//                        }else {
                            Intent intent = new Intent(mContext,
                                    PhotoListActivity.class);
                            startActivityForResult(intent, REQUEST_CAMERA);
//                        }
//                    }
                   dismiss();

                }
            });
            bt3.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    dismiss();
                }
            });
/**
 * Created by kris-liutao on 2017.
 * 小视频录制
 */
            bt4.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    MediaRecorderConfig config = new MediaRecorderConfig.Buidler()
                            //进行H264编码二次压缩
                            .doH264Compress(true)
                            .smallVideoWidth(480)
                            .smallVideoHeight(480)
                            .recordTimeMax(10 * 1000)
                            .maxFrameRate(20)
                            .minFrameRate(8)
                            .captureThumbnailsTime(1)
                            .recordTimeMin((int) (3.0 * 1000))
                            .build();
                    MediaRecorderActivity.goSmallVideoRecorder((Activity) mContext, SendSmallVideoActivity.class.getName(), config);
                    dismiss();

                }
            });
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,  @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        switch (requestCode) {
            case NEED_CAMERA:
                // 如果权限被拒绝,grantResults 为空
                if (grantResults.length > 0
                        && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                    photo();
                } else {
                    Tip.tipshort(mContext, "该功能需要相机和读写文件权限");
                }
                break;
            case NEED_ALBUM:
                // 如果权限被拒绝,grantResults 为空
                if (grantResults.length > 0
                        && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                    Intent intent = new Intent(mContext,
                            PhotoListActivity.class);
                    startActivityForResult(intent, REQUEST_CAMERA);
                } else {
                    Tip.tipshort(mContext, "该功能需要相册和读写文件权限");
                }
                break;

        }
    }

    @SuppressLint("NewApi")
    public void photo() {
//      Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//      File file = new File(Environment.getExternalStorageDirectory()
//              + "/myimage/", String.valueOf(System.currentTimeMillis())
//              + ".jpg");
//      if (!file.exists())
//          file.getParentFile().mkdirs();
//      path = file.getPath();
//      Uri imageUri = Uri.fromFile(file);
//      openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
//      startActivityForResult(openCameraIntent, TAKE_PICTURE);

        File imagePath = new File(Environment.getExternalStorageDirectory(), "images");
        if (!imagePath.exists()) imagePath.mkdirs();
        File newFile = new File(imagePath, "default_image.jpg");
        path = newFile.getPath();

        //第二参数是在manifest.xml定义 provider的authorities属性
        contentUri = FileProvider.getUriForFile(this, "com.zontonec.ztkid.fileprovider", newFile);

        Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        //兼容版本处理,因为 intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION) 只在5.0以上的版本有效
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            openCameraIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            ClipData clip =
                    ClipData.newUri(getContentResolver(), "A photo", contentUri);
            openCameraIntent.setClipData(clip);
            openCameraIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        } else {
            List resInfoList =
                    getPackageManager()
                            .queryIntentActivities(openCameraIntent, PackageManager.MATCH_DEFAULT_ONLY);
            for (ResolveInfo resolveInfo : resInfoList) {
                String packageName = resolveInfo.activityInfo.packageName;
                grantUriPermission(packageName, contentUri,
                        Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            }
        }

        openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri);
        startActivityForResult(openCameraIntent, TAKE_PICTURE);
    }

    class UpHead extends AsyncTask{
        private String result;
        @Override
        protected String doInBackground(Void... params) {

            Map resultMap = null;
            try {
                String url = Apn.DMS_UPLOADFILE;

                url = url + "&module=" + module + "&userid=" + userid + "&apptype=" + appType + "&schoolid=" + schoolid + "&kidid=" + kidid;

                System.out.println("url:"+url);
                String resultjson = UploadUtil.uploadFiles(Bimp.drr, url);
//              System.out.println("resultjson:"+resultjson);
                if(resultjson==null){
                    return null;
                }else if(resultjson.equals("timeout")){
                    return "timeout";
                }else{

                    resultMap = JSONUtils.fromJson(resultjson, Map.class);
//              System.out.println("resultMap:"+resultMap);

                    List list = MapUtil
                            .getSafeMapWhenInteger((List) resultMap
                                    .get("data"));
//              System.out.println("list:"+list);
                    List maps=new ArrayList();
                    for (int i = 0; i  temp = new HashMap();
                            temp.put("sType", "1");
                            temp.put("attachmentID", MapUtil.getValueStr(data, "fileId"));
                            temp.put("attachmentUrl", MapUtil.getValueStr(data, "fileUrl"));
                            maps.add(temp);
                        }else{
                            return result;
                        }
                    }
                    try {
                        String content =edit_txt.getText().toString();
                        System.out.println("发布动态请求:" + userid + "--" + kidid + "--" + appType + "--" + toWhereType + "--" + content + "--" + appKey + "--" + timeSpan + "--" + maps);
                        if (module.equals("showclass")) {
                            result = Apn.httpConnection(new ShareRequest(userid, kidid, appType, toWhereType, content, appKey, timeSpan, maps));
                        } else if (module.equals("showmy")) {
                            result = Apn.httpConnection(new ShareGrowthRequest(userid, kidid, appType, toWhereType, content, appKey, timeSpan, maps));
                        }

                    } catch (Exception e) {
                        e.printStackTrace();
                    }}

            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
            return result;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressDialog=new ProgressDialog(mContext);
            progressDialog.setMessage("正在分享......");
            progressDialog.setCancelable(false);
            progressDialog.show();
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            progressDialog.dismiss();
//          System.out.println("发布动态的result:"+result);
            if(result==null){
                Tip.tipshort(mContext,"分享失败!");
            }else if(result.equals("timeout")){
                Tip.tipshort(mContext,"上传超时!");
            }else{
                Map resultMap = JSONUtils.fromJson(result, Map.class);
                try {
                    if (Apn.isSuccess(resultMap)) {

//                      String sumpersonpoints = MapUtil.getValueStr(resultMap, "sumpersonpoints");
//
//                      String[] sumpoint = sumpersonpoints.toString().split("\\.");
//                      int sumpoints = Integer.parseInt(sumpoint[0]);
//
//                      if (sumpoints < 20) {
//                          Tip.tipshort(mContext, "积分值 +1");
//                      } else {
//                          Tip.tipshort(mContext, "分享成功");
//                      }

                        Tip.tipshort(mContext,"分享成功");
                        //刷新视图
                        FileUtils.deleteDir();
                        Bimp.bmp.clear();
                        Bimp.drr.clear();
                        Bimp.max=0;
                        adapter.update();
                        adapter.notifyDataSetChanged();
                        edit_txt.setText("");
//                      add_image.setVisibility(View.VISIBLE);

                        if (module.equals("showclass")) {
                            Intent intent = new Intent();
                            intent.setAction("refresh.class.fragment");
                            intent.putExtra("share", "refresh");
                            mContext.sendBroadcast(intent);
                        } else if (module.equals("showmy")) {
                            Intent intent = new Intent();
                            intent.setAction("refresh.growth.fragment");
                            intent.putExtra("share", "refresh");
                            mContext.sendBroadcast(intent);
                        }
                        finish();
                    } else {
                        Tip.tipshort(mContext,resultMap.get("data").toString());
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
    /**
     * 隐藏软键盘
     */
    private void hideKeyboard() {
        if (((Activity) mContext).getWindow().getAttributes().softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN) {
            if (((Activity) mContext).getCurrentFocus() != null)
                manager.hideSoftInputFromWindow(((Activity) mContext).getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }
    @Override
    public void initView() {
        super.initView();
    }

    private void initSmallVideo(Context context) {
        // 设置拍摄视频缓存路径
        File dcim = Environment
                .getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
        if (DeviceUtils.isZte()) {
            if (dcim.exists()) {
                VCamera.setVideoCachePath(dcim + "/beiguanhuai/");
            } else {
                VCamera.setVideoCachePath(dcim.getPath().replace("/sdcard/",
                        "/sdcard-ext/")
                        + "/beiguanhuai/");
            }
        } else {
            VCamera.setVideoCachePath(dcim + "/beiguanhuai/");
        }
        // 开启log输出,ffmpeg输出到logcat
        VCamera.setDebugMode(true);
        // 初始化拍摄SDK,必须
        VCamera.initialize(context);
    }
}

这种方式使用压缩异常简单

第一步:
添加下面这段依赖同步
compile 'com.mabeijianxi:small-video-record:1.0.7'

第二步:
在activity或者fragment中初始化initSmallVideo()

 private void initSmallVideo(Context context) {
        // 设置拍摄视频缓存路径
        File dcim = Environment
                .getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
        if (DeviceUtils.isZte()) {
            if (dcim.exists()) {
                VCamera.setVideoCachePath(dcim + "/beiguanhuai/");
            } else {
                VCamera.setVideoCachePath(dcim.getPath().replace("/sdcard/",
                        "/sdcard-ext/")
                        + "/beiguanhuai/");
            }
        } else {
            VCamera.setVideoCachePath(dcim + "/beiguanhuai/");
        }
        // 开启log输出,ffmpeg输出到logcat
        VCamera.setDebugMode(true);
        // 初始化拍摄SDK,必须
        VCamera.initialize(context);
    }

第三步

只需要写个button就可启动

Android - FFmpeg视频录制压缩处理走过的坑_第1张图片
这里写图片描述

这个便是处理视频压缩,时长等等功能的代码部分

Android - FFmpeg视频录制压缩处理走过的坑_第2张图片
这里写图片描述

当然这样写很多人会觉得没问题的呀

我就是这么干的,加上去后代码不会 报错,而且运行正常,但是当你点击下面这个popwindow的按钮时

Android - FFmpeg视频录制压缩处理走过的坑_第3张图片
这里写图片描述

你会发现之前写的拍照,相册不能使用了,按钮点击无响应,万般无奈看了各种博客说什么gradle的呀,SDK版本问题的呀...........?最后还是没能解决,还真不好注意这方面的问题。

解决办法

将写好的权限管理全部注释掉使用EasyPermissions啊或者其他类的来管理动态授权,在这里面只有简单的调用就OK了

最后每个按钮的点击事件便都能响应
效果图如下:


Android - FFmpeg视频录制压缩处理走过的坑_第4张图片
这里写图片描述

CSDN请移步到

http://blog.csdn.net/First_CooMan##

你可能感兴趣的:(Android - FFmpeg视频录制压缩处理走过的坑)