Это может быть слишком общий вопрос, но каков общий подход для поиска в медиафайлах (видео или аудио любого вида / формата), если данные имеют переменную скорость передачи данных (VBR)?
Кажется, что это легко сделать, если поток имеет постоянный битрейт (CBR). Например. если вы знаете, что это 256 кбит / с, и вы хотите искать вперед / назад на 30 секунд, просто подсчитайте, сколько (приблизительно) битов, конвертируйте их в байты и ищите столько байтов вперед / назад в файле. Наконец, продолжайте чтение и анализ до следующего заголовка / block-start / keyframe / чего бы то ни было и продолжайте воспроизведение оттуда.
Хорошо, но что вы будете делать, если битрейт сильно варьируется? Например. это может быть что-нибудь от 32 до 512 кбит / с и постоянно меняется? Я знаю, что это может зависеть от аудио / видео формата. Некоторые форматы файлов имеют индексные таблицы в начале / конце, которые вы можете использовать, а некоторые файлы содержат указатели в потоке, сколько байтов пропустить для пропуска следующих X секунд. В этом случае вы можете работать с этой информацией, однако, что если в формате нет такой таблицы или указателей?
Самый наивный подход, который я могу придумать, это просто оценить битрейт как можно лучше (например, посмотрев на средний битрейт за последние пару секунд воспроизведения), прыгнув туда, где вы думаете, что он может быть правильным в соответствии с предполагаемый битрейт, и посмотрите, как далеко вы действительно прыгнули. Если вы прыгнули слишком много, попробуйте немного отскочить назад. Если вы прыгнули слишком мало, попробуйте прыгнуть немного вперед. Возможно, продолжайте прыгать в одном направлении, пока вы снова не прыгнете слишком далеко, теперь снова измените направление и размер шага (аналогично алгоритму двоичного поиска). Каждый раз, когда вы прыгаете слишком далеко, вы меняете направление и уменьшаете размер шага. Вы будете становиться все ближе и ближе к правильной точке, и если вы достаточно близко (ниже некоторой выбранной дельты), просто начните играть снова (ведь прыжок не должен быть точным с точностью до миллисекунды).
Хотя приведенный выше алгоритм может работать, он звучит довольно плохо и, вероятно, очень медленно на практике. Так как это на самом деле сделано? Кто-нибудь когда-нибудь писал медиаплеер / плеер-плагин какого-то рода? Или просто так, что каждый «приличный» формат, поддерживающий VBR, должен иметь какие-то индексные таблицы или указатели пропуска в потоке, если он ожидает, что программное обеспечение будет корректно искать, а не просто воспроизводить от начала до конца?