"Я хочу воспроизвести файл mp4 таким образом, чтобы всякий раз, когда он достигает какой-либо точки в видео (например, 30,3 секунды), он возвращался к более раннему времени (например, 5,85). секунд) ".
"Я слышу переход. Я думаю, что поиск не достаточно быстрый, или аудио нужно каким-то образом зациклить."
Ваше связанное видео имеет ключевой кадр каждые 2 секунды (точно 2,023).
Таким образом, вы можете искать только секунды, такие как 2,023, 4,023, 6,023, 8,023 и т. Д.
Если вам нужно 5,850 секунд. Сначала необходимо выполнить поиск ключевого кадра через 4 секунды, а затем декодировать каждый следующий следующий кадр до требуемой отметки времени 5,850. В этот момент вы можете отобразить видео.
Решение, которое я использовал в прошлом, состояло в том, чтобы просто настроить временные метки ( PTS ) кадров P / B, чтобы они совпадали с ключевыми кадрами, прежде чем передавать их байты в декодер H264. (Таким образом, декодер вынужден перемотать видео вперед, чтобы сохранить синхронизацию). Я использовал FFmpeg только в командной строке, поэтому не уверен, как вы можете изменить время отображения в показанном вами коде.
Почему :
При сжатии MPEG вы можете искать только ключевые кадры . Каждый аудио кадр является ключевым кадром, но видео имеет 3 типа кадров: I
(который является ключевым кадром или полным изображением), есть также P
и B
кадры (которые имеют лишь небольшие отличия от основного изображения во времени ). Для этих P / B-кадров требуется ближайший предыдущий ключевой кадр для декодирования first , поэтому у них тоже есть данные пикселей для отображения. Кадры P / B не могут быть декодированы только самими собой (поскольку они не являются полными данными изображения).