как измерить битрейт видео с течением времени

Учитывая закодированный видеофайл с непостоянным битрейтом, как можно анализировать битрейт с течением времени? Пока что я нашел одну старую программу, которая создает график битрейта, но ни одна из них не может предоставить необработанные данные закодированных кадров.

Я думаю, что данные битрейта должны генерироваться путем усреднения размера набора кадров, охватывающих 1 секунду, т. е. кадров с DTS, принадлежащих этому интервалу. Таким образом, 10-секундное видео будет иметь 10 точек данных, описывающих входной битрейт кодировщика. Хотя мне любопытно услышать альтернативные способы расчета битрейта.

Есть ли способ получить размер каждого (закодированного) кадра? желательно с программным обеспечением Windows. Я знаю, что это тривиально просто для несжатого источника (разрешение * битовая глубина * время).

Размер закодированного кадра не имеет смысла для предсказанных кадров. Я дам ответ позже в тот же день, но основной способ - сегментировать видео, а затем запускать ffprobe для каждого из сегментов и выводить эти данные в файл.
о, хорошая идея, я должен был подумать об этом. Нужно больше кофе.
Ах @Mulvya, но когда вы сегментируете видео на сегменты по ключевым кадрам, вы: 1) не должны перекодировать 2) нужен источник с (разумно) равномерно расположенными ключевыми кадрами
№ 1, очевидно, верен, если вы хотите измерить исходный битрейт. См. ответ № 2.

Ответы (1)

Говорить о размере кодированного кадра в интеркодированном видеопотоке, характерном для MPEG- Xвидео, не имеет смысла. I-кадры являются автономными, но P- и B-кадры являются предсказанными кадрами, и окончательный результат декодирования использует данные из различных входных данных. С другой стороны, размер одной группы изображений (GOP) может быть значимой мерой.

Сегментатор FFmpeg в сочетании с совместимым демультиплексором может разбивать видеопоток на границы GOP. Указав сверхмалое время для размера сегмента, вы можете гарантировать, что каждый сегмент будет содержать 1 GOP. Затем запуск ffprobe для каждого сегмента предоставит битрейт для этой GOP.

Я протестировал приведенную ниже команду на MP4, которые имели 1) GOP переменного размера, 2) схему с внутренним кодированием и 3) фиксированную GOP необычной длины (11 кадров), и каждый вывод имел ожидаемый результат.

ffmpeg -i input.mp4 -an -c:v copy -segment_time 0.00001 -f segment i%0d.mp4

Каждый сегмент содержал ровно 1 I-кадр (всего каждый сегмент интра-входа содержал ровно 1 кадр).

Запуск ffprobe для каждого сегмента дает показания битрейта:

Duration: 00:00:00.37, start: 4.466016, bitrate: 1539 kb/s
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p,
1280x720 [SAR 1:1 DAR 16:9], 1520 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)

Приведенный выше снимок взят из 11-кадровой GOP и имеет битрейт 1520 кбит/с.

поэтому, если у вас есть 1 источник с GOP 1-2 секунды и другие GOP около 250 миллисекунд, ваш результирующий график будет иметь ошибочные точки данных на временной шкале. Что было бы хорошим обходным путем для этого случая? Я полагаю, что я бы сгруппировал GOP в более крупные ячейки, т.е. в среднем по 3-5 GOP.
Просто постройте график скорости передачи данных (Y) в зависимости от времени начала (X) вместо продолжительности. Y остается неизменным с момента начала до времени начала следующего сегмента. Если вы хотите избавиться от вида ступенчатой ​​функции, в вашем программном обеспечении для построения графиков будет функция сглаживания/интерполяции.