【问题标题】:FFmpeg and file descriptors in Android LollipopAndroid Lollipop 中的 FFmpeg 和文件描述符
【发布时间】:2015-04-08 14:52:04
【问题描述】:

我将在 Android 项目中使用 FFmpeg 作为 JNI 库,我知道 Kitkat 的局限性。由于随着 Lollipop 的新版本,第三方应用程序有可能访问外部 microsd,我想利用它。我已经阅读了this useful question,所以我使用 ACTION_OPEN_DOCUMENT_TREE 意图,用户选择一个文件夹,然后我使用类似的代码来获取文件描述符。然后我将此 UNIX 文件描述符发送到 jni 函数。如果我使用这样的东西,我已经创建了一个演示:

int descriptor = a_file_descriptor;
FILE* fp = fdopen(descriptor , "w");
fprintf(fp, "Hello from Lollipop!");
fclose(fp);

一切都很好。问题是我想从文件描述符中提取完整的文件名。可以使用一些可用于 Linux 的技巧,但如果我执行 fopen 并尝试 fprintf 文件中的某些内容,则不会发生任何事情。所以我想我应该使用文件描述符,但是如何将它与 FFmpeg 一起使用呢?我读到了pipe 选项,但它似乎只适用于命令行。提前感谢您的帮助。

【问题讨论】:

    标签: android linux ffmpeg java-native-interface


    【解决方案1】:

    问题是我想从文件描述符中提取完整的文件名。

    是的,可以在 Linux 上通过一个小技巧从文件描述符中提取文件的完整路径。每个创建的进程在/proc/[pid] 下都有一个目录,您可以在进程目录/proc/[pid] 下找到有关进程的资源,包括打开的文件描述符。然后打开的文件描述符以/proc/[pid]/fd/[fd_number] 的形式存在,例如/proc/17059/fd/20。这通常是指向真实文件路径的符号链接,所以我们可以通过解析符号链接得到完整路径。

    以下是在 Linux 上运行的演示代码。是的,它可以通过您在 Android 上的 JNI 调用运行。

    #include <stdio.h>
    #include <unistd.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <limits.h>
    #include <stdlib.h>
    
    int main(int argc, char **argv) {
    
        int fd;
        char path[512] = { 0 };
        char* real_path = NULL;
    
        if ((fd = open("/tmp/test", O_CREAT | O_WRONLY)) == -1) {
            fprintf(stderr, "open fail");
        }
    
        sprintf(path, "/proc/%d/fd/%d", getpid(), fd);
    
        if (path[0] != '\0') {
            printf("fd path is %s\n", path);
            real_path = realpath(path, NULL);
            if (real_path != NULL) {
                printf("get full path from fd %s\n", real_path);
                free(real_path);
            }
        }
    
        exit(EXIT_SUCCESS);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-04-25
      • 2017-02-11
      • 1970-01-01
      • 2019-12-18
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多