Как написать команду в Android, когда я использую FFmpeg Native с файлом C++?

Используя последнюю версию FFmpeg («Ada») с собственным кодом и командой записи в файле android .cpp ниже, это очень простая функция VideogetDuration() :

#include <jni.h>
#include <string>
#include <iostream>
#include <android/log.h>
#include <unistd.h>

extern "C" {
#include <libavutil/timestamp.h>
#include <libavformat/avformat.h>
#include <libavutil/display.h>
}

    /***
     *
     * @param input - the absolute path to file
     * @returns the duration of file in seconds
     *
     */
    extern "C"
    JNIEXPORT jint JNICALL
    Java_com_ffmpegjni_videoprocessinglibrary_VideoProcessing_getDuration(JNIEnv *env,
                                                                          jobject instance,
                                                                          jstring input_) {
        av_register_all();
        AVFormatContext *pFormatCtx = NULL;
        if (avformat_open_input(&pFormatCtx, jStr2str(env, input_), NULL, NULL) < 0) {
            throwException(env, "Could not open input file");
            return 0;
        }


        if (avformat_find_stream_info(pFormatCtx, NULL) < 0) {
            throwException(env, "Failed to retrieve input stream information");
            return 0;
        }

        int64_t duration = pFormatCtx->duration;


        avformat_close_input(&pFormatCtx);
        avformat_free_context(pFormatCtx);
        return (jint) (duration / AV_TIME_BASE);
    }

когда это значение возвращает значение 0 либо неправильное значение. также я прочитал приведенные ниже документы для получения дополнительной информации. 1)http://dranger.com/ffmpeg/data.html 2)https://static.packt-cdn.com/downloads/Developing_Multimedia_Applications_with_NDK.pdf 3)https://github.com/KucherenkoIhor/VideoProcessingLibrary (см. также этот проект) 4)https://github.com/leandromoreira/ffmpeg-libav-tutorial#video---what-you-see

я также добавил ту же проблему со ссылкой ниже: как использовать libavcodec/ffmpeg для определения продолжительности видеофайла


person axita.savani    schedule 16.10.2019    source источник
comment
Каков формат вашего входного файла?   -  person BrianChen    schedule 15.11.2019
comment
Формат входного файла: видеофайл .mp4. @БрианЧен   -  person axita.savani    schedule 15.11.2019
comment
Что значит неправильное значение? Вы хотите напечатать значение продолжительности?   -  person BrianChen    schedule 15.11.2019
comment
Да, когда я запускаю эту команду, она будет отображать неправильное значение, что означает неправильную продолжительность отображения видео в миллисекундах. @БрианЧен   -  person axita.savani    schedule 15.11.2019
comment
Продолжительность означает продолжительность потока в долях секунды AV_TIME_BASE. Поэтому, если вы разделите продолжительность на AV_TIME_BASE, вы получите секунду, а не миллисекунду, и вы потеряете точность.   -  person BrianChen    schedule 15.11.2019
comment
Не могли бы вы проверить еще раз? У меня возвращается значение duration / AV_TIME_BASE. и не совпадают с секундами видео.   -  person axita.savani    schedule 15.11.2019
comment
Вы должны проверить продолжительность видеопотока и продолжительность аудиопотока, ffmpeg выводит продолжительность из видеопотока и аудиопотока. Возможно, у видеоплеера другой метод вывода с ffmpeg.   -  person BrianChen    schedule 15.11.2019
comment
В ПОРЯДКЕ. Я проверю это. Спасибо за предложение @BrianChen Но проверяли ли вы, что FFmpeg и VideoPlayer используют разные видеопотоки?   -  person axita.savani    schedule 15.11.2019
comment
Не используются разные видеопотоки. Длительность видеопотока может быть не равна длительности аудиопотока, мы выбираем большую из длительности файла в целом, но можно вычислить длительность и другим способом.   -  person BrianChen    schedule 15.11.2019
comment
В ПОРЯДКЕ. я проверю и отвечу вам. @BrianChen Спасибо.   -  person axita.savani    schedule 15.11.2019