【问题标题】:How does Instagram crop video in android app?Instagram 如何在 Android 应用中裁剪视频?
【发布时间】:2023-03-22 02:45:01
【问题描述】:

我正在尝试以 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 x 640。有没有办法在 android 上裁剪视频?我看过 ffmpeg 库,但我需要在项目中使用它,我不确定 LGPL 是如何工作的。有没有更简单的解决方案?

【问题讨论】:

  • “如果我设置了相机支持的分辨率,它就可以工作”——只能靠运气。使用getSupportedVideoSizes() 查找视频录制支持的尺寸,而不是getSupportedPreviewSizes()。 “Instagram 如何在 Android 应用中裁剪视频?” ——他们可能会像 Vine 那样做,即不使用 MediaRecorder,而是捕获预览帧并将它们拼接在一起以创建电影(在 Instagram 的情况下,他们会将帧裁剪为正方形作为缝合工作)。这和ffmpeg 解决方案都不会特别容易实施。
  • tnx 提示,你有任何有用的链接如何完成这个图像拼接吗? getSupportedVideoSizes() 请求 api 级别 11,我正在使用级别 10,这就是为什么我使用 getSupportedPreviewSizes()
  • "你有任何有用的链接如何完成这个图像拼接吗?" -- 不,对不起。
  • @CommonsWare ffmpeg如何在Android SDK中实现?

标签: android video crop


【解决方案1】:

其实只是添加了这个依赖:

compile 'com.writingminds:FFmpegAndroid:0.3.2'

然后使用下面的代码就可以了。唯一的问题是,它不是那么快。在我的测试中,使用 Galaxy s6,20 秒长度的 720x480 视频在 6-7 秒内裁剪为 480 倍。

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 一起使用

【讨论】:

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

    【讨论】:

    • 通过顶部和底部添加黑色封面,我仍然可以看到为方形摄像头上方的视图拍摄的视频,有什么想法吗?
    【解决方案3】:

    使用OpenGL和shader可以解决这个问题。或者你可以使用 libyuv 在 CPU 上做。

    【讨论】:

      猜你喜欢
      • 2017-04-29
      • 2018-10-18
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      • 2017-07-09
      • 2020-08-04
      • 2021-09-03
      • 2011-07-09
      相关资源
      最近更新 更多