#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