avcodec генерирует h264 and mp4 видео в два раза быстрей чем оригинальное
От: sergey2b ЮАР  
Дата: 29.03.21 14:19
Оценка:
используяю avcodec и базируясь на примерах encode_video.c и muxing.c
я сделал функции генерирующие видео в h264 или mp4 форматах


но все генерируемые видео в два раза быстрей чем оригинальные

c->time_base = (AVRational){1, 25};

c->framerate = (AVRational){25, 1};


подскажите пожалуйста какие еще параметры могут давать такой эфект
Re: avcodec генерирует h264 and mp4 видео в два раза быстрей чем оригинальное
От: Слава  
Дата: 29.03.21 14:37
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>но все генерируемые видео в два раза быстрей чем оригинальные


c->>time_base = (AVRational){1, 25};

c->>framerate = (AVRational){25, 1};

S>подскажите пожалуйста какие еще параметры могут давать такой эфект


Ускорение и перестройка.
Re: avcodec генерирует h264 and mp4 видео в два раза быстрей чем оригинальное
От: Videoman Россия https://hts.tv/
Дата: 29.03.21 17:21
Оценка: 4 (1)
Здравствуйте, sergey2b, Вы писали:

S>используяю avcodec и базируясь на примерах encode_video.c и muxing.c

S>я сделал функции генерирующие видео в h264 или mp4 форматах


S>но все генерируемые видео в два раза быстрей чем оригинальные


c->>time_base = (AVRational){1, 25};

c->>framerate = (AVRational){25, 1};

S>подскажите пожалуйста какие еще параметры могут давать такой эфект


H264 энкодер, в отличие от старых энкодеров (типа mpeg1/mpeg2) действительно поддерживает раздельные scale для меток времени и частоты кадров. У вас все правильно задано. На самом деле я в свое время долго изучал его потроха и выяснилось что pts и fps ему нужны, по-сути, только для управлением rate-control, что бы определить сколько прошло времени и сколько Mb он уже закодировал. Больше ни для чего эти значения не используются и он сам не может удвоить частоту кадров.

1. Что значит: "все генерируемые видео в два раза быстрей чем оригинальные" — в вашем понимании?
2. Вы уверены что на входе у вас правильные метки?
3. Вы уверены что на входе не 50 fps ?
http://www.gravatar.com/avatar/60560936caa07b944d4c3cecf1c06cc5?s=80&d=identicon
Re[2]: avcodec генерирует h264 and mp4 видео в два раза быст
От: sergey2b ЮАР  
Дата: 29.03.21 18:06
Оценка:
Здравствуйте, Videoman, Вы писали:




V>1. Что значит: "все генерируемые видео в два раза быстрей чем оригинальные" — в вашем понимании?


я могу показать упрощеный мной исходник примера который я использовал как прототип


у меня сделлано тестовое приложение

while (не конец оригинального видео) {
взять текущий фрейм в виде bmp
передать его в encoder
next
}

исходное видео 4:20 мин
сгененрированное видео 2:10 мин
при этом потерь фреймов я не вижу, но все движения в два раза быстрей чем на иcходном видео




V>2. Вы уверены что на входе у вас правильные метки?

V>3. Вы уверены что на входе не 50 fps ?

я сейчас посмотрю и напишу
Отредактировано 29.03.2021 18:10 sergey2b . Предыдущая версия .
Re[3]: avcodec генерирует h264 and mp4 видео в два раза быст
От: Videoman Россия https://hts.tv/
Дата: 29.03.21 18:52
Оценка: 6 (1) +1
Здравствуйте, sergey2b, Вы писали:

S>я могу показать упрощеный мной исходник примера который я использовал как прототип


Да, сжатый пример не помешал бы

S>у меня сделлано тестовое приложение


S>while (не конец оригинального видео) {

S> взять текущий фрейм в виде bmp
S> передать его в encoder
S> next
S>}

Это все не важно. Хотелось бы посмотреть как вы тайм-стемпы генерите.

S>исходное видео 4:20 мин

S>сгененрированное видео 2:10 мин
S>при этом потерь фреймов я не вижу, но все движения в два раза быстрей чем на иcходном видео

Также важно (я бы даже сказал что скорее всего проблема там) как тайм-стемпы генерите когда кладете в контейнер mp4. Дело в том, что энкодер h264 всегда генерирует выход кадр в кадр. Т.е. он физически не может сделать из одного кадра два (есть варинта с interlacing, но я думаю это не ваш случай). Времена ему нужны только для контроля bitrate на выходе. Далее: h264 nalu (поток с декодера), сам по себе, не содержит информации о времени. Там просто нет для этого полей. Метки времени обычно хранятся на уровень выше — в контейнере. Скорее всего проблема уже в AVFormatContext. Там тоже нужно указать правильные настройки.
http://www.gravatar.com/avatar/60560936caa07b944d4c3cecf1c06cc5?s=80&d=identicon
Re[4]: avcodec генерирует h264 and mp4 видео в два раза быст
От: sergey2b ЮАР  
Дата: 29.03.21 19:17
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Да, сжатый пример не помешал бы


это стандартный пример у которого удаленна часть касающая audio (код компилируеться и работает)
в моем тестовом приложение измененна функция fill_yuv_image она вызывает декодер и берет очередной фрейм


http://files.rsdn.org/56990/muxing.zip
Re: avcodec генерирует h264 and mp4 видео в два раза быстрей чем оригинальное
От: alexander_r  
Дата: 29.03.21 20:34
Оценка: 6 (1)
Здравствуйте, sergey2b, Вы писали:

S>используяю avcodec и базируясь на примерах encode_video.c и muxing.c

S>я сделал функции генерирующие видео в h264 или mp4 форматах


S>но все генерируемые видео в два раза быстрей чем оригинальные


c->>time_base = (AVRational){1, 25};

c->>framerate = (AVRational){25, 1};


S>подскажите пожалуйста какие еще параметры могут давать такой эфект


это может происходить если у пакета который передается для записи в файл неправильные временные метки
проверьте у AVPacket pts и dts, перед вызовом av_interleaved_write_frame(...) они должны быть в формате AVStream->time_base и в пересчете идти с интервалом 40 мсек
Re[5]: avcodec генерирует h264 and mp4 видео в два раза быст
От: Videoman Россия https://hts.tv/
Дата: 29.03.21 20:52
Оценка: 6 (1)
Здравствуйте, sergey2b, Вы писали:

S>это стандартный пример у которого удаленна часть касающая audio (код компилируеться и работает)

S>в моем тестовом приложение измененна функция fill_yuv_image она вызывает декодер и берет очередной фрейм

Слишком объемный код. С ходу я не вижу проблем. Посмотрите в дебагере, чему равно значение вот этого поля:
AVCodecContext::ticks_per_frame

В вашем случае должно быть 1, но вдруг это значение равно 2-м.
http://www.gravatar.com/avatar/60560936caa07b944d4c3cecf1c06cc5?s=80&d=identicon
Отредактировано 29.03.2021 21:24 Videoman . Предыдущая версия .
Re[2]: avcodec генерирует h264 and mp4 видео в два раза быстрей чем оригинальное
От: Videoman Россия https://hts.tv/
Дата: 29.03.21 20:56
Оценка:
Здравствуйте, alexander_r, Вы писали:

_>это может происходить если у пакета который передается для записи в файл неправильные временные метки

_>проверьте у AVPacket pts и dts, перед вызовом av_interleaved_write_frame(...) они должны быть в формате AVStream->time_base и в пересчете идти с интервалом 40 мсек

В примере в файл пишутся просто uncompressed фреймы. Метки времени генерируются тривиально:
ost->frame->pts = ost->next_pts++;
http://www.gravatar.com/avatar/60560936caa07b944d4c3cecf1c06cc5?s=80&d=identicon
Re[6]: avcodec генерирует h264 and mp4 видео в два раза быст
От: sergey2b ЮАР  
Дата: 01.04.21 20:02
Оценка:
Здравствуйте, Videoman, Вы писали:

я внес изменения и encode заработал, но _pts _dtsб _time_base и _duration я беру из оригинального видео
я пытался вычислять _pts _но у меня не получилось

    while (ret >= 0) {
        AVPacket pkt = { 0 };

        ret = avcodec_receive_packet(c, &pkt);
        if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
            break;
        else if (ret < 0) {
            //fprintf(stderr, "Error encoding a frame: %s\n", av_err2str(ret));
            exit(1);
        }

        pkt.pts = av_rescale_q_rnd(_pts, _time_base, st->time_base, AVRounding(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
        pkt.dts = av_rescale_q_rnd(_dts, _time_base, st->time_base, AVRounding(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
        pkt.duration = av_rescale_q(_duration, _time_base, st->time_base);

        pkt.stream_index = st->index;

        /* Write the compressed frame to the media file. */
        //log_packet(fmt_ctx, &pkt);
        ret = av_interleaved_write_frame(fmt_ctx, &pkt);
        av_packet_unref(&pkt);
        if (ret < 0) {
            //fprintf(stderr, "Error while writing output packet: %s\n", av_err2str(ret));
            exit(1);
        }
    }
Re[7]: avcodec генерирует h264 and mp4 видео в два раза быст
От: Videoman Россия https://hts.tv/
Дата: 02.04.21 08:35
Оценка: 3 (1)
Здравствуйте, sergey2b, Вы писали:

S>я внес изменения и encode заработал, но _pts _dtsб _time_base и _duration я беру из оригинального видео

S>я пытался вычислять _pts _но у меня не получилось

Отлично! Обычно так и бывает. Лучше все-таки приводить весь проблемный код целиком. Тогда проблема, я уверен, сразу бы обнаружилась.

P.S. В принципе DTS encoder-у абсолютно не нужен, он его никак не использует, и даже сам его генерит на выходе. Вместо DTS можно указать AV_NOPTS_VALUE.
http://www.gravatar.com/avatar/60560936caa07b944d4c3cecf1c06cc5?s=80&d=identicon
Re[8]: avcodec генерирует h264 and mp4 видео в два раза быст
От: sergey2b ЮАР  
Дата: 02.04.21 12:51
Оценка:
подскажите пожалуйста
где можно почитать про pts dts (в викпедии я уже читал)
Re[9]: avcodec генерирует h264 and mp4 видео в два раза быст
От: Videoman Россия https://hts.tv/
Дата: 03.04.21 13:53
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>подскажите пожалуйста

S>где можно почитать про pts dts (в викпедии я уже читал)

Честно, я не видел где-то устаивающее, меня лично, детальное описание что это и зачем. По этому приходилось во всех деталях разбираться самому. Если хотите, можете накидать список вопросов которые вас интересует, а я постараюсь ответить.
Что такое PTS мне кажется, интуитивно, обычно понятно. DTS это просто костыль, который используется при размещении видео пакетов в некоторых контейнерах типа (mov, mp4, dash и т.д.). DTS нужны только для удобства записи в контейнер. PTS потом восстанавливается из DTS, путем добавления смещения. Вот такой вот бред получается: Decoding Time Stamps — по сути нужны только для записи в контейнер и никогда больше .
Вообще корректный (но не оригинальный) DTS всегда можно сгенерировать автоматически зная PTS. Сам я всегда так и делаю.
http://www.gravatar.com/avatar/60560936caa07b944d4c3cecf1c06cc5?s=80&d=identicon
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.