FFmpeg - Как я могу получить прогресс транскодирования? - PullRequest
0 голосов
/ 29 сентября 2018

Я использую fffmpeg для работы с видео, и теперь у меня возникают проблемы.Я не знаю, как получить прогресс транскодирования.Я проверил ffmpeg.c и обнаружил, что в большинстве случаев это «transcode», вот исходный код ffmpeg.c # transcode:

static int transcode(void)
    {
    XLOGD("==========transcode==========");
   ...
    XLOGD("start transcode");
    while (!received_sigterm) {
        int64_t cur_time= av_gettime_relative();

        /* if 'q' pressed, exits */
        if (stdin_interaction)
            if (check_keyboard_interaction(cur_time) < 0)
                break;

        /* check if there's any stream where output is still needed */
        if (!need_output()) {
            av_log(NULL, AV_LOG_VERBOSE, "No more output streams to write 
            to, finishing.\n");
            break;
        }

        ret = transcode_step();
        if (ret < 0 && ret != AVERROR_EOF) {
            av_log(NULL, AV_LOG_ERROR, "Error while filtering: %s\n", 
            av_err2str(ret));
            break;
        }

        /* dump report by using the output first video and audio streams */
        print_report(0, timer_start, cur_time);
    }

    return ret;
   }

Я назвал ffmpeg следующим образом:

intвыполнить (int argc, char ** argv) {

, если CONFIG_AVDEVICE

/* parse options and open all input/output files */
ret = ffmpeg_parse_options(argc, argv);
if (ret < 0){
    return exit_program(1);
}

if (nb_output_files <= 0 && nb_input_files == 0) {
    show_usage();
    av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
    return exit_program(1);
}

/* file converter / grab */
if (nb_output_files <= 0) {
    av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
    return exit_program(1);
}

if (nb_input_files == 0) {
    av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
    return exit_program(1);
}

for (i = 0; i < nb_output_files; i++) {
    if (strcmp(output_files[i]->ctx->oformat->name, "rtp"))
        want_sdp = 0;
}

current_time = ti = getutime();
if (transcode() < 0){
    return exit_program(1);
}

return main_return_code;}

Есть идеи у кого-нибудь?

Заранее большое спасибо.

#

большое спасибо, теперь я разбираюсь.в ffmpeg.c, функция

print_report(int is_last_report, int64_t timer_start, int64_t cur_time),

там я получил некоторый кодовый блок:

secs = FFABS(pts) / AV_TIME_BASE;
    us = FFABS(pts) % AV_TIME_BASE;
    mins = secs / 60;
    secs %= 60;
    hours = mins / 60;
    mins %= 60;

, из которого я могу узнать продолжительность транскодирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...