Instagram如何在Android应用程序中裁剪视频?

时间:2014-08-13 12:16:44

标签: android video crop

我试图以1:1的比例(正方形)录制视频,我无法让它工作, 如果我在媒体记录器实例中设置自定义分辨率,我在介质记录器启动时会出错。

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是如何工作的。有没有更简单的解决方案呢?

3 个答案:

答案 0 :(得分:2)

实际上只是添加了这种依赖:

compile 'com.writingminds:FFmpegAndroid:0.3.2'

然后使用下面的代码制作东西。唯一的问题是,它不是那么快。在我的测试中,20秒长度720x480视频在6-7秒内以星系s6裁剪为480x。

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");
}

如果您的min sdk是api 18,还有另一个better solution使用新的MediaCodec

答案 1 :(得分:0)

  1. 您可以查看https://github.com/boxme/SquareCamera。它用于裁剪图像,但该想法可用于裁剪视频。主要想法是在顶部和底部(或左侧和右侧)添加黑色封面,使其看起来像一个正方形。
  2. 当然可以使用FFmpeg,虽然它有点复杂。

答案 2 :(得分:0)

使用OpenGL和着色器可以解决这个问题。或者您可以使用libyuv在CPU上执行此操作。