【发布时间】:2014-12-16 11:34:31
【问题描述】:
我目前正在制作一个简单的 Android 应用,可以将 SD 卡中的视频转换为 gif。
我了解到 ffmpeg 是处理转换的最有效方法。但我不知道如何将 ffmeg 添加到我的 android studio 项目中。
【问题讨论】:
标签: java android-ndk ffmpeg android-studio animated-gif
我目前正在制作一个简单的 Android 应用,可以将 SD 卡中的视频转换为 gif。
我了解到 ffmpeg 是处理转换的最有效方法。但我不知道如何将 ffmeg 添加到我的 android studio 项目中。
【问题讨论】:
标签: java android-ndk ffmpeg android-studio animated-gif
在你应用的 build.gradle 中添加
compile 'com.writingminds:FFmpegAndroid:0.3.2'
然后添加一个用于选择视频路径的按钮,并在按钮的 onClick 方法中创建一个意图,帮助用户从手机中选择视频
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("video/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Video"), PICK_CONTACT_REQUEST);
现在使用以下方法检索上述结果
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Check which request we're responding to
if (requestCode == PICK_CONTACT_REQUEST) {
// Make sure the request was successful
if (resultCode == RESULT_OK) {
Uri selectedImageUri = data.getData();
// OI FILE Manager
String filemanagerstring = selectedImageUri.getPath();
// MEDIA GALLERY
String selectedImagePath =getPath(selectedImageUri);
if (selectedImagePath != null) {
String[] cmd = {"-i"
, selectedImagePath
, "Image.gif"};
conversion(cmd);
}
}
}
}
定义getPath方法获取选中视频的路径
public String getPath(Uri uri) {
String[] projection = {MediaStore.Images.Media.DATA};
Cursor cursor = managedQuery(uri, projection, null, null, null);
if (cursor != null) {
// HERE YOU WILL GET A NULLPOINTER IF CURSOR IS NULL
// THIS CAN BE, IF YOU USED OI FILE MANAGER FOR PICKING THE MEDIA
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} else
return null;
}
然后创建一个将视频转换为gif的方法
public static void conversion(String[] cmd) {
FFmpeg ffmpeg = FFmpeg.getInstance(this);
try {
// to execute "ffmpeg -version" command you just need to pass "-version"
ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler() {
@Override
public void onStart() {
}
@Override
public void onProgress(String message) {
}
@Override
public void onFailure(String message) {
}
@Override
public void onSuccess(String message) {
}
@Override
public void onFinish() {
}
});
} catch (FFmpegCommandAlreadyRunningException e) {
// Handle if FFmpeg is already running
e.printStackTrace();
}
}
【讨论】:
Error:(38, 5) error: cannot find symbol class FFmpeg 有什么想法吗?
对于 JNI、NDK/AS,您可以以 this 开头
然后检查用户 (ph0b) SO 是否发布了有关 JNI/NDK 的帖子
那么,android 上的 ffmpeg 是一个非常艰巨的任务,您需要一些时间。
在 github 上搜索“android-ffmpeg”,寻找最高的社区评级(星星、克隆、)以及良好的构建说明。
IMO - 'guardianproject' 和 'halfninja' 很好。
您可以花一些时间在 android 之外(只是在 VM 上构建 ffmpeg 静态库),因此您只熟悉 ffmpeg 上的配置/构建。
然后,转到完整的 android 工作室,使用 ph0b 集成技术在 gradle 构建中运行 NDK/build,使用他的博客文章中对 gradle 的更改。
【讨论】: