Вот реализация алгоритма Витерби , который я "открыл" недавно. Целью здесь является определение оптимального распределения типов кадров при кодировании видео. Самого Витерби иногда немного сложно понять, поэтому я думаю, что лучший метод - это на примере.
В этом примере максимальное количество последовательных B-кадров равно 2. Все пути должны заканчиваться P-кадром.
Длина пути 1 дает нам P
как наш лучший путь, так как все пути должны заканчиваться в P-кадре, другого выбора нет.
Длина пути 2 дает нам BP
и _P
. "_"
- лучший путь длины 1.
Это дает нам BP
и PP
. Теперь мы рассчитаем фактические затраты.
Скажем, ради этого примера, что BP - лучший.
Длина пути 3 дает нам BBP
и _B
P и __P
. "__"
- лучший путь длины 2.
Это дает нам BBP
и PBP
и BPP
. Теперь мы рассчитаем фактические затраты.
Скажем, ради этого примера, что BBP является лучшим.
Длина пути 4 дает нам _BBP
и __BP
и ___P
. "___"
- лучший путь длины 3.
Это дает нам PBBP и BPBP и BBPP. Теперь мы рассчитаем фактические затраты.
Скажем, ради этого примера, что BPBP является лучшим.
Длина пути 4 дает нам __BBP
и ___BP
и ____P
. "____"
- лучший путь длины 4.
Это дает нам BPBBP
и BBPBP
и BPBPP
.
Теперь - подождите минуту - все пути согласуются с тем, что первый кадр - B
! Итак, первый кадр это B
.
Процесс повторяется до тех пор, пока они не согласятся, какой кадр является первым P-кадром, и затем начнется кодирование.
Этот алгоритм может быть адаптирован к огромному количеству задач во многих областях; Это также тот же алгоритм, который я упоминал в этом посте .