gpt4 book ai didi

android - 通过 ffmpeg 进行视频修剪两次崩溃

转载 作者:行者123 更新时间:2023-11-30 03:23:03 25 4
gpt4 key购买 nike

我正在尝试使用 ffmpeg lib 修剪视频。 Video Trimming 第一次成功,但第二次崩溃。

为了解决这个崩溃,我搜索它并使用 dlopen() 和 dlclose() 动态加载 ffmpeg 库。

我的代码是-

const char* path;
void* handle;
void* handle1;
const char *in, *out;
int close;
__android_log_write(ANDROID_LOG_ERROR, "VideoTrimmer Invoke", "Video Trimmer Invoke");
in = (*env)->GetStringUTFChars(env, inputFile, 0);
out = (*env)->GetStringUTFChars(env, outFile, 0);

int *(*Java_com_videotrimmingwithnativesample_VideoTrimmer_trim)(JNIEnv*, jclass ,jstring inputFile, jstring outFile, jint startTime, jint length);
path = (*env)->GetStringUTFChars(env, libffmpegPath, 0);
handle = dlopen(path, RTLD_LAZY);
if(!handle)
{
__android_log_write(ANDROID_LOG_ERROR, "VideoTrimmer Invoke HAndle false", dlerror());
}
else
{
__android_log_write(ANDROID_LOG_ERROR, "VideoTrimmer Invoke HAndle True", dlerror());
}

Java_com_videotrimmingwithnativesample_VideoTrimmer_trim = dlsym(handle, "Java_com_example_videotrimmingwithnativesample_VideoTrimmer_trim");
if(!Java_com_videotrimmingwithnativesample_VideoTrimmer_trim)
{
__android_log_write(ANDROID_LOG_ERROR, "VideoTrimmer Invoke dlsym false",dlerror());
}
else
{
__android_log_write(ANDROID_LOG_ERROR, "VideoTrimmer Invoke dlsym true","Video TrimmerInvoke dlsym true");
}

int i=(*Java_com_videotrimmingwithnativesample_VideoTrimmer_trim)(env, obj, inputFile,outFile,startTime,length);
if(dlclose(handle)==0)
{
(*env)->ReleaseStringUTFChars(env, libffmpegPath, path);
__android_log_write(ANDROID_LOG_ERROR, "VideoTrimmer Invoke close true","Video TrimmerInvoke close true");
}

第二次在 dlopen 行上使用 show 时出错 --

Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), (IntentService[V) 

请帮我解决这个崩溃。

提前致谢。

最佳答案

我正在使用 FFmpeg 3.6.6 构建我的应用程序,但遇到了同样的问题。根据我的调试经验,出现这种情况是因为变量“nb_filtergraphs”不再是初始值,变量“filtergraphs”是,执行此方法时会导致系统崩溃

static int init_complex_filters(void){
int i, ret = 0;

for (i = 0; i < nb_filtergraphs; i++) {
ret = init_complex_filtergraph(filtergraphs[i] //crash here);
if (ret < 0)
return ret;
}
return 0;}

原始调用链是 ffmpeg#main(您可以更改此函数名称)-> ffmpeg_opt#ffmpeg_parse_options -> ffmpeg_opt#init_complex_filters

我的解决方法是在main方法执行完后调用下面的代码

ffmpeg.c

int main(int argc, char **argv)//you might change the name {
//.....
ffmpeg_cleanup(received_nb_signals ? 255 : main_return_code);
nb_filtergraphs = 0;
progress_avio = NULL;

input_streams = NULL;
nb_input_streams = 0;
input_files = NULL;
nb_input_files = 0;

output_streams = NULL;
nb_output_streams = 0;
output_files = NULL;
nb_output_files = 0;
exit_program(received_nb_signals ? 255 : main_return_code);
return main_return_code;
}

关于android - 通过 ffmpeg 进行视频修剪两次崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18762236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com