【问题标题】:Play video using FFmpeg library in androidNDK在androidNDK中使用FFmpeg库播放视频
【发布时间】:2020-08-29 04:59:34
【问题描述】:

我拥有播放视频所需的所有 .so 库和头文件。我想播放 Raw 文件夹中的视频。我对 CPP 代码感到震惊。无法将视频文件路径传递给 CPP 代码。以下是我的 native-lib.cpp 代码

 const char *file = env->GetStringUTFChars(path, 0);
if (file == NULL) {
    printf("The file is a null object.");
}

av_register_all();
int ret = 0;
char errbuf[256];
AVFormatContext *fmt_ctx = avformat_alloc_context();
int ret12 = avformat_open_input(&fmt_ctx, file, NULL, NULL);
if (ret12 < 0) {
    av_strerror(ret, errbuf, sizeof(errbuf));
    __android_log_print(ANDROID_LOG_ERROR, "ffmpeg", "%s", errbuf);
    __android_log_print(ANDROID_LOG_ERROR, "ffmpeg", "%i", ret12);
    return;
}

上面的ret12返回-ve值,它正在返回控制

【问题讨论】:

    标签: android kotlin ffmpeg android-ndk android-ffmpeg


    【解决方案1】:

    不完全是您现在面临的问题,但是当您使用 GetStringUTFChars() 时,您必须在从本机方法返回 Java 之前调用 ReleaseStringUTFChars()

    现在,当您将文件路径传递给 JNI 时,它是完整路径还是相对路径?在 Android 应用程序中,“当前目录”的开头是 /,即根目录。因此,可能是您的代码找不到该文件。

    下一个问题是,你的应用是否有足够的权限来打开这个文件。如果文件位于应用程序私有文件夹之外的外部存储上,则需要运行时 READ_EXTERNAL_STORAGE 权限才能读取它。此外,在 Android 10 上还有更多限制。您的应用 AndroidManifest.xml 中可能需要 android:requestLegacyExternalStorage="true" 属性。

    【讨论】:

    • 这是作为参数传递的路径本机代码 File(Uri.parse("android.resource://"+packageName+"/" + R.raw.samplevideo).path).path跨度>
    • 您实际上可以访问捆绑到您的 APK 中的资源,但这是not easy。通常,我们会从 Java 中的 APK 中提取资源并将其放入一个(临时)文件中,然后将该文件的完整路径传递给 native 方法。
    • 任何传递原始文件完整路径的示例
    • 您的示例视频不是原始文件;它是打包到 APK 包中的资源 (blob)。它没有路径。
    猜你喜欢
    • 2021-01-04
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多