2014-08-13 2 views
2

Я пытаюсь записать видео в соотношении 1: 1 (квадрат), и я не могу заставить его работать, , если я устанавливаю собственное разрешение в экземпляре медиа-рекордера, я получаю сообщение об ошибке при запуске медиа-рекордера.Как Instagram обрезать видео в приложении Android?

mediaRecorder.setVideoSize(480, 480); 

но он работает, если я установил разрешение, поддерживаемое камерой.

Camera.Parameters p = c.getParameters(); 
     List<Camera.Size> list = p.getSupportedPreviewSizes(); 
     //They are ordered from largest to smallest, so the largest will be... 
     for (Camera.Size i : list) { 
      if (i.width <= 640 && i.width >= 480) { 
       size = i; 
      } 
      Log.d(TAG, "i.height: " + i.height + " i.width" + i.width); 
     } 
     if (size != null) { 
      p.setPreviewSize(size.width, size.height); 
      c.setParameters(p); 
     } 

затем установите

mediaRecorder.setVideoSize(size.width, size.height); 

я обычно получаю 480 640. Есть ли способ, чтобы обрезать видео на Android? Я видел библиотеку ffmpeg, но мне нужно использовать ее в проекте, и я не уверен, как работает LGPL. Есть ли более простое решение?

+1

«он работает, если я устанавливаю разрешение, поддерживаемое камерой» - только по везению. Используйте 'getSupportedVideoSizes()', чтобы найти размеры, поддерживаемые для записи видео, а не 'getSupportedPreviewSizes()'. «Как Instagram обрезает видео в приложении Android?» - они могут сделать это так, как делает Vine, чтобы не использовать «MediaRecorder», а вместо этого захватить кадры предварительного просмотра и сшить их вместе, чтобы создать фильм (в случае Instagram они обрезали рамки как квадратные как часть сшивание). Ни это, ни решение 'ffmpeg' будет особенно легко реализовать. – CommonsWare

+0

tnx для подсказки, есть ли у вас полезные ссылки, как это делается? getSupportedVideoSizes() запрашивает api level 11, и я работаю с 10-м уровнем, поэтому я использовал getSupportedPreviewSizes() – ddog

+0

«Есть ли у вас полезные ссылки, как это делается?» -- нет извините. – CommonsWare

ответ

0
  1. Вы можете посмотреть https://github.com/boxme/SquareCamera. Он используется для обрезки изображения, но идея может быть использована для обрезки видео. Основная идея состоит в том, чтобы добавить верхнюю и нижнюю черную крышку (или влево и вправо), чтобы она казалась квадратной.
  2. FFmpeg может использоваться, конечно, хотя это немного сложно.
+0

, добавив черную крышку сверху и снизу, я все еще вижу видео, снятое для просмотра над квадратной камерой, любые мысли? – Babs

2

На самом деле просто добавить эту зависимость:

compile 'com.writingminds:FFmpegAndroid:0.3.2' 

затем, используя ниже код делает вещи. Проблема только в том, что это не так быстро. В моих тестах длина видеоизображения длиной 20 сек. 720x480 обрезана до 480x в 6-7 секунд с галактикой 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"); 
} 

Там другая better solution с помощью новой MediaCodec если ваш мин SDK является апи 18

0

Использование OpenGL и шейдер может решить эту проблему. Или вы можете использовать libyuv, чтобы сделать это на CPU.

Смежные вопросы