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

作者: Kris_liu | 来源:发表于2017-09-13 22:39 被阅读230次

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

    视频压缩处理我用了两种方式来解决的,一种是第三方,一种用了自己写了封装的。
    今天先给大家讲解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<ResolveInfo> 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<Void, Void, String>{
            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<Map> list = MapUtil
                                .getSafeMapWhenInteger((List) resultMap
                                        .get("data"));
    //              System.out.println("list:"+list);
                        List<Map> maps=new ArrayList<Map>();
                        for (int i = 0; i <list.size(); i++) {
                            Map data =list.get(i);
                            if (data.get("uploadStatus").equals("0")) {
                                Map<String, String> temp = new HashMap<String, String>();
                                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就可启动

    这里写图片描述

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

    这里写图片描述

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

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

    这里写图片描述

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

    解决办法

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

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


    这里写图片描述

    CSDN请移步到

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

    相关文章

      网友评论

      本文标题:Android - FFmpeg视频录制压缩处理走过的坑

      本文链接:https://www.haomeiwen.com/subject/djxrsxtx.html