Используя FFMPEG, как вы можете разбить видео на сегменты равной длины, которые МОГУТ ИЛИ МОГУТ НЕ запускаться на ключевых кадрах?
Предполагая, что вы знакомы с форматом сегмента и опцией break_non_keyframes , FFMPEG, кажется, НЕ делает то, что я ожидал (из того, что я прочитал ... больше не могу найти ссылки).
ffmpeg -i ... -f segment -break_non_keyframes 1 -segment_time 2 -c copy 2secs%03d.ts
А именно, создайте сегмент, который на самом деле может быть длиннее желаемого сегмента, включая всю GOP по мере необходимости.
Например, предположим, что 3-кадровая GOP с глупой частотой кадров 1 FPS со следующей глупой каденцией IBP:
01 02 03 11 12 13 21 22 23 31 32 33
I B P I B P I B P I B P
Если я хочу разбить его на 2-секундные сегменты, можно ожидать, что будут генерироваться следующие сегменты (кадры в скобках не должны отображаться в этом сегменте):
01 02 03 (03 not displayed in this segment, only used for decoding)
01 02 03 11 (... 01 and 02)
11 12 13 (... 11 )
21 22 23 (... 23)
21 22 23 31 (...21 22)
31 32 33 (... 31)
Как вы можете видеть, в каждом сегменте будут дополнительные кадры, но с учетом начального PTS и, наконец, конечного PTS, вы ВСЕГДА можете воспроизводить / транскодировать только сегмент самостоятельно.
Это действительно расточительное пространство (сумма сегментов будет НАМНОГО больше, чем первоначальный актив), но здесь дело не в этом. Дело в том, чтобы иметь автономные сегменты без транскодирования.