I am trying to record the video in 1:1 ratio (square) and i cant get it to work, if i set custom resolution in media recorder instance i get an error on media recorder start.
Actually just adding this dependency:
compile 'com.writingminds:FFmpegAndroid:0.3.2'
then using below code makes the thing. Only problem is, it's not so fast. In my tests, 20sec length 720x480 video cropped to 480x in 6-7 second with a galaxy s6.
FFmpeg ffmpeg = FFmpeg.getInstance(context);
String[] complexCommand = {"-y", "-i", originalFilePath, "-vf", "crop=480:480:80:0", "-preset", "ultrafast", "-strict", "-2", "-c:v", "libx264", "-c:a", "copy", originalFilePath.replace(".mp4", "_crop.mp4")};
try {
ffmpeg.execute(complexCommand, new ExecuteBinaryResponseHandler() {
@Override
public void onStart() {super.onStart();}
@Override
public void onSuccess(String message) {super.onSuccess(message);}
@Override
public void onProgress(String message) {super.onProgress(message);}
@Override
public void onFailure(String message) {super.onFailure(message);}
@Override
public void onFinish() {super.onFinish();}
});
} catch (FFmpegCommandAlreadyRunningException e) {
Log.e("ffmpeg", "ffmpeg already running");
}
There's another better solution using with new MediaCodec if your min sdk is api 18
Using OpenGL and shader can solve this problem. Or you can use libyuv to do it on CPU.