在 android 中使用不带 NDK 的 FFmpeg
Using FFmpeg without NDK in android
我浏览了很多站点并搜索了关于 android 项目的“FFMPEG”实现。
建立的大多数解决方案都使用 NDK。
但我想使用 FFmpeg 而不使用 NDK,正如我在 This Link
中发现的那样
我用过这个项目
https://github.com/guardianproject/android-ffmpeg-java
它已经为 android 版本的 FFMPEG 库编译,这个文件将在 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 class。它是使用命令行 ffmpeg exe 文件的包装器。例如,如果你想执行这样的命令
ffmpeg -i source.wav -b:a 128k output.mp3
您需要为 FfmpegController.java 添加功能 class。像这样:
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 对象和 运行 您的函数。
我使用了这个 FFmpeg 示例,它是一个没有使用 NDK 的库
First of download sample example FFmpeg Sample
Download FFmpeg library 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);
}
运行 这并在文件管理器中检查输出。我希望它有效:) 享受
我浏览了很多站点并搜索了关于 android 项目的“FFMPEG”实现。
建立的大多数解决方案都使用 NDK。
但我想使用 FFmpeg 而不使用 NDK,正如我在 This Link
中发现的那样我用过这个项目 https://github.com/guardianproject/android-ffmpeg-java
它已经为 android 版本的 FFMPEG 库编译,这个文件将在 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 class。它是使用命令行 ffmpeg exe 文件的包装器。例如,如果你想执行这样的命令
ffmpeg -i source.wav -b:a 128k output.mp3
您需要为 FfmpegController.java 添加功能 class。像这样:
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 对象和 运行 您的函数。
我使用了这个 FFmpeg 示例,它是一个没有使用 NDK 的库
First of download sample example FFmpeg Sample
Download FFmpeg library 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);
}
运行 这并在文件管理器中检查输出。我希望它有效:) 享受