如何在android中以编程方式执行命令行ffmpeg命令?
我已经使用 . 现在我必须构建一个示例转换器应用程序,如mp4到3gp。我知道有命令行命令如何在android中以编程方式执行命令行ffmpeg命令?,android,android-ndk,ffmpeg,media,codec,Android,Android Ndk,Ffmpeg,Media,Codec,我已经使用 . 现在我必须构建一个示例转换器应用程序,如mp4到3gp。我知道有命令行命令ffmpeg-I video\u origine.avi video\u finale.mpg。但我不知道如何通过编程执行这些命令。我有这样的示例代码 jint Java_com_example_ndklearning1_MainActivity_logFileInfo(JNIEnv * env, jobject this, jstring filename) { av_register_all()
ffmpeg-I video\u origine.avi video\u finale.mpg
。但我不知道如何通过编程执行这些命令。我有这样的示例代码
jint Java_com_example_ndklearning1_MainActivity_logFileInfo(JNIEnv * env, jobject this, jstring filename)
{
av_register_all();
AVFormatContext *pFormatCtx;
const jbyte *str;
str = (*env)->GetStringUTFChars(env, filename, NULL);
if(av_open_input_file(&pFormatCtx, str, NULL, 0, NULL)!=0)
{
LOGE("Can't open file '%s'\n", str);
return 1;
}
else
{
LOGI("File was opened\n");
LOGI("File '%s', Codec %s",
pFormatCtx->filename,
pFormatCtx->iformat->name
);
}
return 0;
}
这段代码打开一个文件并提取编解码器信息。我想要的只是,将打开的文件转换为所需的格式。任何类型的帮助,如代码片段或后续步骤,将不胜感激
ffmpeg API能满足我的需求吗?如果有可用的现有API,它将更有帮助最近我遇到了类似的问题。我的解决方案是在Java程序中模拟命令行 首先,我在文件“ffmpeg.c”中添加了一个函数: 希望这有帮助 编辑: Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_WHOLE_STATIC_LIBRARIES := libavformat libavcodec libavutil libpostproc libswscale libswresample libavfilter
LOCAL_MODULE := VideoUtilLib
LOCAL_SRC_FILES := NativeVideoUtil.c ffmpeg.c ffmpeg_opt.c cmdutils.c ffmpeg_filter.c
LOCAL_LDLIBS := -lz -llog
include $(BUILD_SHARED_LIBRARY)
include $(call all-makefiles-under,$(LOCAL_PATH))
用本机文件替换NativeVideoUtil.c。!我会试试你的方法!我不在办公室,所以我得等到明天早上。同时,你能告诉我,在做了修改之后,我是否需要为android重建ffmpeg?我是否需要在我的本机代码文件中包含任何头文件?您需要包含的头文件只是和。我将在我的答案中发布我的Android.mk。我收到以下错误:08-14 05:30:11.729:W/dalvikvm(17973):PR_CAPBSET_DROP 0失败:参数无效。请确保编译内核时启用了文件功能支持。我直接用ffmpeg源代码编译了我的android项目。所以我没有遇到这个问题。也许你可以尝试用ffmpeg源代码编译。请给我们你编译过的ffmpeg源代码好吗?
extern const char* cmd_simulation(int, const char**);
JNIEXPORT int JNICALL Java_com_test_videowatermark_VideoUtil_test(JNIEnv * env, jobject object, jobjectArray strArray);
JNIEXPORT int JNICALL Java_com_test_videowatermark_VideoUtil_test(JNIEnv * env, jobject object, jobjectArray strArray)
{
int arrayLength = (*env)->GetArrayLength(env, strArray);
const char* args[arrayLength];
int i;
for(i = 0; i < arrayLength; i++){
jstring jstr = (jstring)((*env)->GetObjectArrayElement(env, strArray, i));
args[i] = (*env)->GetStringUTFChars(env, jstr, 0);
//strcpy(args[i], arg);
//env->ReleaseStringUTFChars(jstr, arg);
}
const char** argv = args;
return cmd_simulation(arrayLength, argv);
}
private void executeCommand(){
String[] command = {"ffmpeg", "-i", "some video file name",};
int result = test(command);
}
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_WHOLE_STATIC_LIBRARIES := libavformat libavcodec libavutil libpostproc libswscale libswresample libavfilter
LOCAL_MODULE := VideoUtilLib
LOCAL_SRC_FILES := NativeVideoUtil.c ffmpeg.c ffmpeg_opt.c cmdutils.c ffmpeg_filter.c
LOCAL_LDLIBS := -lz -llog
include $(BUILD_SHARED_LIBRARY)
include $(call all-makefiles-under,$(LOCAL_PATH))