Обрезка видеофайла с различным соотношением сторон

#java #android #video #crop #aspect-ratio

#java #Android #Видео #обрезка #соотношение сторон

Вопрос:

Я пытаюсь предоставить своим пользователям возможность обрезать свое видео с различным соотношением сторон, прежде чем загружать их в мою базу данных fireplace. Я использую Android-VideoCropView для отображения макета видеоредактора для моих пользователей и SimpleVideoEditor для обрезки видео.Однако мне трудно объединить обе библиотеки вместе, когда я пытаюсь получить информацию из VideoCropView, а затем обрезать файл с помощью SimpleVideoEditor. это результат, который я должен иметь, и это результат, который я получил. Итак, мой вопрос в том, что я делаю плохо и как я могу это исправить?

Вот мой код

      Uri fileUri = Uri.fromFile(new File(stringvideofile));
                                        String destPath = getVideoFilePath();


                                        //1.
                                        float baseWidthPx =  mVideoCropView.getVideoWidth();    // should be  // todo: match every views one side , then set that side. need an if-else
                                        float  baseHeightPx = mVideoCropView.getVideoHeight() ;
                                        // 2. get the center of crop quad
                                        float  cropQuadCenterX, cropQuadCenterY;
                                        cropQuadCenterX = mVideoCropView.getRealPositionX()   baseWidthPx/2;
                                        cropQuadCenterY = mVideoCropView.getRealPositionY()   baseHeightPx/2;

                                        // 3. get video frame quad center
                                        float  videoQuadCenterX, videoQuadCenterY;
                                        videoQuadCenterX =  mVideoCropView.getWidth()/2;
                                        videoQuadCenterY = mVideoCropView.getHeight()/2;

                                        float dx = videoQuadCenterX - cropQuadCenterX;
                                        float dy = videoQuadCenterY - cropQuadCenterY;

                                        dx = 2*dx/baseWidthPx;  // idk why multiply with 2 :/ divide with baseSizePx to get ratio, that makes sense but why 2???
                                        dy = 2*dy/baseHeightPx;

                                        float translateX = dx, translateY = dy;

                                        FillModeCustomItem fillModeCustomItem = new FillModeCustomItem(
                                                mVideoCropView.getScaleX(),
                                                mVideoCropView.getRotate(),
                                                translateX,
                                                translateY,
                                                mVideoCropView.getVideoWidth(),
                                                mVideoCropView.getVideoHeight()
                                        );


                                       GlFilterGroup glFilterGroup;
                                        if(composerGlFilter == null) {
                                         composerGlFilter = new GlFilter();
                                        }

                                        glFilterGroup  = new GlFilterGroup(new GlFilter()); // the default filter
                                        Log.e(TAG, "currentGlFilter is null");



                                        final Logger mylogger = new Logger() {
                                            @Override
                                            public void debug(String tag, String message) {
                                                Log.d(tag, message);
                                            }

                                            @Override
                                            public void error(String tag, String message, Throwable error) {
                                                Log.e(tag, "Message: " message   ". Error: " error.getLocalizedMessage());
                                            }

                                            @Override
                                            public void warning(String tag, String message) {
                                                Log.w(tag, message);
                                            }
                                        };


                                        mp4Composer = null;
                                        mp4Composer = new Mp4Composer(fileUri, destPath, CropVideoActivity.this, mylogger);
                                        mp4Composer
                                                .size(mVideoCropView.getWidth(), mVideoCropView.getHeight()) // fake it till you make it
                                                .fillMode(FillMode.CUSTOM)
                                                .customFillMode(fillModeCustomItem);



                                        if(composerGlFilter != null){
                                            mp4Composer.filter(composerGlFilter);
                                        }else{
                                            mp4Composer.filter(glFilterGroup);
                                        }

                                        mp4Composer.trim(mStartTimeMs,  mVideoCropView.getDuration())
                                                .listener(new Mp4Composer.Listener() {
                                                    @Override
                                                    public void onProgress(double progress) {
                                                        Log.d(TAG, "onProgress = "   progress);
                                                        new Thread()
                                                        {
                                                            public void run()
                                                            {
                                                                CropVideoActivity.this.runOnUiThread(new Runnable()
                                                                {
                                                                    public void run()
                                                                    {
                                                                        //Do your UI operations like dialog opening or Toast here
                                                                        Toast.makeText( CropVideoActivity.this, "onProgress = "   progress, Toast.LENGTH_SHORT).show();
                                                                    }
                                                                });
                                                            }
                                                        }.start();
                                                    }

                                                    @Override
                                                    public void onCompleted() {
                                                        Log.d(TAG, "onCompleted()");

                                                        new Thread()
                                                        {
                                                            public void run()
                                                            {
                                                                CropVideoActivity.this.runOnUiThread(new Runnable()
                                                                {
                                                                    public void run()
                                                                    {
                                                                        //Do your UI operations like dialog opening or Toast here
                                                                        Toast.makeText( CropVideoActivity.this, "codec complete path = "   destPath, Toast.LENGTH_SHORT).show();
                                                                    }
                                                                });
                                                            }
                                                        }.start();
                                                    }

                                                    @Override
                                                    public void onCanceled() {
                                                        Log.d(TAG, "onCanceled");

                                                        new Thread()
                                                        {
                                                            public void run()
                                                            {
                                                                CropVideoActivity.this.runOnUiThread(new Runnable()
                                                                {
                                                                    public void run()
                                                                    {
                                                                        //Do your UI operations like dialog opening or Toast here
                                                                        Toast.makeText( CropVideoActivity.this, "videoProcessing onCanceled", Toast.LENGTH_SHORT).show();
                                                                    }
                                                                });
                                                            }
                                                        }.start();
                                                    }

                                                    @Override
                                                    public void onFailed(Exception exception) {
                                                        Log.e(TAG, "onFailed()", exception);

                                                        new Thread()
                                                        {
                                                            public void run()
                                                            {
                                                                CropVideoActivity.this.runOnUiThread(new Runnable()
                                                                {
                                                                    public void run()
                                                                    {
                                                                        //Do your UI operations like dialog opening or Toast here
                                                                        Toast.makeText( CropVideoActivity.this, "exception.getMessage()  : " exception.getMessage(), Toast.LENGTH_SHORT).show();

                                                                    }
                                                                });
                                                            }
                                                        }.start();

                                                    }
                                                });

                                        mp4Composer.start();
 

Комментарии:

1. Вы пробовали использовать другое устройство?

2. @EmonHossainMunna нет только с Honor 9X pro