Как правильно сделать петлю видео? - PullRequest
0 голосов
/ 26 мая 2019

Я хочу воспроизвести это видео в цикле https://www.nicovideo.jp/watch/sm16617386. Я хочу воспроизвести файл mp4 таким образом, чтобы всякий раз, когда он достигал какой-либо точки в видео (скажем, 30,3 секунды), он возвращался назад (например, до 5,85 секунды).

Я пытался добавить этот код в ffplay.c, он работал недостаточно хорошо, я слышу переход. Я думаю, что поиск не достаточно быстрый, или аудио должно быть каким-то образом зациклено.

static void video_refresh(void *opaque, double *remaining_time)
{
   (original code here...)
    time = get_master_clock(is);
    if (isnan(time))
        time = (double)is->seek_pos / AV_TIME_BASE;
    if (time > jump_when) {
        stream_seek(is, (int64_t)(6.0 * AV_TIME_BASE), (int64_t)(0.0 * AV_TIME_BASE), 0);
    }
}

Мой текущий план состоит в том, чтобы просто покопаться в ffmpeg, понять, как работают видео и аудио декодеры, и сохранить / загрузить состояние декодеров.

1 Ответ

1 голос
/ 28 мая 2019
  • "Я хочу воспроизвести файл 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 не могут быть декодированы только самими собой (поскольку они не являются полными данными изображения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...