【问题标题】:Using FFmpeg without NDK in android在android中使用没有NDK的FFmpeg
【发布时间】:2015-05-23 21:14:55
【问题描述】:

我浏览了许多网站并搜索了有关 Android 项目的“FFMPEG”实现。

创建的大多数解决方案都使用 NDK。

但我想使用 FFmpeg 而不使用 NDK,正如我在 This Link

中找到的那样

【问题讨论】:

  • 在运行时可以通过Android的命令行使用FFMPEG执行文件。你的问题到底是什么?
  • 我想在我的项目中使用 ffmpeg 本机库。 .so 文件
  • 请参考我在问题中提供的链接

标签: android android-ndk ffmpeg shared-libraries


【解决方案1】:

我用过这个项目 https://github.com/guardianproject/android-ffmpeg-java

它已经为 FFMPEG 库的 android 版本编译,这个文件将在 res/raw 文件夹中(如果你需要更新版本,你可以更新这个文件)。您需要将此项目作为库添加到您的项目中。之后,您可以在 java 中编写自己的函数,例如:

public Clip convert (Clip mediaIn, String outPath, ShellCallback sc) throws Exception
{
    ArrayList<String> cmd = new ArrayList<String>();

    cmd.add(mFfmpegBin);
    cmd.add("-y");
    cmd.add("-i");
    cmd.add(new File(mediaIn.path).getCanonicalPath());

    if (mediaIn.startTime != null)
    {
        cmd.add("-ss");
        cmd.add(mediaIn.startTime);
    }
    if (mediaIn.duration != -1)
    {
        cmd.add("-t");
        cmd.add(String.format(Locale.US,"%f",mediaIn.duration));

    }
    Clip mediaOut = new Clip();
    File fileOut = new File(outPath);
    mediaOut.path = fileOut.getCanonicalPath();
    cmd.add(mediaOut.path);
    execFFMPEG(cmd, sc);
    return mediaOut;
}

并使用 FfmpegController 对象执行它。 如果您有任何问题或者这是您想要的,请通知我。

编辑: 我希望您将此 github 代码连接为您项目的库。 src 文件夹中有FfmpegController.java 类。它是使用命令行 ffmpeg exe 文件的包装器。例如,如果你想执行这样的命令

ffmpeg -i source.wav -b:a 128k output.mp3

您需要向 FfmpegController.java 类添加函数。像这样的:

    public Clip convert(Clip mediaIn, String outPath, ShellCallback sc) throws Exception
    {
    ArrayList<String> cmd = new ArrayList<String>();

    Clip mediaOut = new Clip();

    String mediaPath = mediaIn.path;

    cmd = new ArrayList<String>();

    cmd.add(mFfmpegBin);
    cmd.add("-i");
    cmd.add(mediaPath);

    cmd.add("-b:a");
    cmd.add("128k");

    mediaOut.path = outPath;

    cmd.add(mediaOut.path);

    execFFMPEG(cmd, sc);

    return mediaOut; // this is not importatnt because file will be put in outPath
    }

现在在您的项目中初始化 FfmpegController 对象并运行您的函数。

【讨论】:

  • 我已经实现了。找不到 execFFMPEG(cmd,sc) 和 cmd.add(mFfmpegBin);
  • 还有一个问题可以使用任何使用这个库的ffmpeg命令吗?怎么样?
  • 无法更快地重播。检查我的编辑。希望这是你想要的
  • 谢谢。我可以在生产环境中使用这些库项目吗(它是开源的)。我想在我的 google play 应用程序中使用这个库。我可以吗?
  • 是的,你可以,但它是 GPLv3,所以如果你使用这个库,你也必须使用 GPLv3 限制你的商业应用程序。因此,您有义务发布您的资源。但我相信你并没有从这个库中使用太多。它只能作为如何使用 FFmpeg 库的指南(这是在 LGPL 许可下,这意味着您可以在商业应用程序中使用它)。
【解决方案2】:

我使用了这个 FFmpeg 示例,它是在没有 NDK 的情况下使用的库

首先下载示例示例 FFmpeg Sample

下载FFmpeg库 FFmpeg Library

在一个文件夹中提取并从 Android Studio 中导入项目

现在,调用 FFmpeg 命令

此命令用于将 (/sdcard/videokit/in.mp4) 视频旋转 90 度并在 SD 卡中的特定位置生成 out.mp4

ffmpeg -y -i /sdcard/videokit/in.mp4 -strict experimental -vf transpose=1 -s 160x120 -r 30 -aspect 4:3 -ab 48000 -ac 2 -ar 22050 -b 2097k /sdcard/videokit/out.mp4

现在使用库中预定义的方法运行此命令并添加 GeneralUtils 的侦听器

GeneralUtils.copyLicenseFromAssetsToSDIfNeeded(this, workFolder);
      GeneralUtils.copyDemoVideoFromAssetsToSDIfNeeded(this, demoVideoFolder);
   //demoVideoFolder where your Input file path
   //workFolder Absolute path
   // workFolder = getApplicationContext().getFilesDir().getAbsolutePath() + "/";



            LoadJNI vk = new LoadJNI();
        try {
        
            vk.run(GeneralUtils.utilConvertToComplex(commandStr), workFolder, getApplicationContext());
            
            // copying vk.log (internal native log) to the videokit folder
            GeneralUtils.copyFileToFolder(vkLogPath, demoVideoFolder);
            
        } catch (Throwable e) {
            Log.e(Prefs.TAG, "vk run exeption.", e);
        }

运行它并在文件管理器中检查输出。我希望它运作良好:) 享受

【讨论】:

  • 我认为它不是免费的图书馆。它允许大约 15 天的试用期....所以我刚买了它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 2017-11-22
  • 1970-01-01
  • 2012-03-25
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多