Search code examples
androidffmpegvideo-processingslowmotion

encoder 'aac' not enable exception while processing video for slowing


While chaging playback speed of video (making video slow) following exception occurs using FFMPEG android java library.

[aac @ 0x416c26f0] The encoder 'aac' is experimental but experimental codecs are not enabled, add '-strict -2' if you want to use it.

Solution

  • Here is a command to change playback of the speed

     VideoIn = getInternalDirectoryPath() + "/Download/input.mp4";
     VideoOut = getInternalDirectoryPath() + "/Download/output.mp4";
     cmd = "-i "+VideoIn+" -vf setpts=2*PTS -strict -2 "+VideoOut;
    

    adding -strict in command avoid encoder 'aac' not enable exception. You can follow this link to implement ffmpeg video commands.

    Here is the complete sample code

       public class TestFFMpegActivity {
            private static String cmd,
            private static FFmpeg ffmpeg;
            private static Context mContext;
    
    
            public static String getInternalDirectoryPath() {
                return Environment.getExternalStorageDirectory().getAbsolutePath();
            }
    
            public static void initiateFFmpeg(Context context, String path) {
                mContext = context;
                ffmpeg = FFmpeg.getInstance(context);   
                VideoIn = getInternalDirectoryPath() + "/Download/input.mp4";
                VideoOut = getInternalDirectoryPath() + "/Download/output.mp4";
                cmd = "-i "+VideoIn+" -vf setpts=2*PTS -strict -2 "+VideoOut;
                try {
                    ffmpeg.loadBinary(new LoadBinaryResponseHandler() {
    
                        @Override
                        public void onStart() {
                        }
    
                        @Override
                        public void onFailure() {
                        }
    
                        @Override
                        public void onSuccess() {
                        }
    
                        @Override
                        public void onFinish() {
                            processVideo();
                        }
                    });
                } catch (FFmpegNotSupportedException e) {
                    // Handle if FFmpeg is not supported by device
                }
            } 
            private static void processVideo(){
            try {
                ffmpeg.execute(cmd ,
                        new ExecuteBinaryResponseHandler() {
    
                            @Override
                            public void onStart() {
                                //for logcat
                                Log.w(null,"processing started");
                            }
    
                            @Override
                    public void onProgress(String message) {
                        //for logcat
                        Log.w(null, "onProgress");
                    }
    
                    @Override
                    public void onFailure(String message) {
                        Log.w(null, message.toString());
                    }
    
                    @Override
                    public void onSuccess(String message) {
                        Log.w(null, message.toString());
                    }
    
                    @Override
                    public void onFinish() {
    
                    }
                });
            } catch (FFmpegCommandAlreadyRunningException e) {
                Toast.makeText(mContext, "Video processing failed due to exception", Toast.LENGTH_LONG).show();
    
                // Handle if FFmpeg is already running
                e.printStackTrace();
                Log.w(null, e.toString());
            }
        }
    }