1

I'm using fffmpeg to do some video work,and now I get some troulbe. I don't know how to get the progress of transcode. I check ffmpeg.c and found that most time cost is 'transcode', here is the source code of 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;
   }

I called ffmpeg like this:

int execute(int argc, char **argv) {

if 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; }

Any ideas anyone?

Many thanks in advance.

#

many thanks, now I figure it out. in ffmpeg.c, function

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

there I got some code block:

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

from this I can know the duration that had been transcode.

wensefu
  • 93
  • 2
  • 7
  • That's the main (and only) loop in main() after parse_options() has returned. How are you using ffmpeg - command line, API? – Gyan Sep 29 '18 at 04:37
  • Possible duplicate of [Can ffmpeg show a progress bar?](https://stackoverflow.com/questions/747982/can-ffmpeg-show-a-progress-bar) – Bud Damyanov Sep 29 '18 at 08:56

1 Answers1

0

First get duration of the movie : int64_t duration = output_files[0]->ctx->duration;

Second in while loop : You can calculate the percent with this formule : int percent = (int)(((double)(cur_time - timer_start) / (double)(duration )) * 100);