ffmpeg выводит, что первый кадр видео 25fps показывает только 1 мс - PullRequest
0 голосов
/ 13 апреля 2019

Я использую ffmpeg для разделения видео по кадрам. Для видео со скоростью 25 кадров в секунду я ожидал бы, что в нем будет показан кадр 0 для 40 мс, а затем будет показан кадр 1 для 40 мс и т. Д. Однако, когда я использую ffmepg для анализа видео, это не то, что я получаю.

Я вытащил кадры из видео, используя следующие команды:

ffmpeg -i original.mp4 -ss 00:00:00.000 -vframes 1 0.000.png
ffmpeg -i original.mp4 -ss 00:00:00.001 -vframes 1 0.001.png
ffmpeg -i original.mp4 -ss 00:00:00.040 -vframes 1 0.040.png
ffmpeg -i original.mp4 -ss 00:00:00.041 -vframes 1 0.041.png

В этом случае я бы ожидал, что 0.000.png и 0.001.png будут одним и тем же кадром, но в результате pngs будут другими. Однако, с другой стороны, 0.001.png и 0.040.png - это один и тот же кадр, тогда как 0.040.png и 0.041.png - это разные кадры. Кажется, что кадр 0.000.png отображается только в течение 1 мс. Я проверял это на нескольких разных видео, с постоянными результатами. Кто-нибудь может объяснить, почему это так или почему мои ожидания потенциально неверны?

В качестве примечания: при загрузке того же видео в тег HTML5 в браузерах при воспроизведении видео первый кадр отображается в течение 64 миллисекунд, а все остальные кадры - в течение 40 миллисекунд. Я могу проверить это, сравнив кадры для следующих команд:

player.currentTime = 0
player.currentTime = .063 // same frame as 0
player.currentTime = .064 // different frame than .063
player.currentTime = .103 // same frame as .064
player.currentTime = .104 // different frame than .103

Это также не соответствует ожиданиям и делает сопоставление кадров / времени для видео между видео ffmpeg и html5 еще более раздражающим. Кто-нибудь знает, что здесь происходит?

Если это полезно, вот метаданные из видео:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'original.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.17.101
  Duration: 01:36:16.20, start: 0.000000, bitrate: 2301 kb/s
    Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 2200 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 96 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

1 Ответ

1 голос
/ 13 апреля 2019

-ss будет соответствовать первому кадру при или после указанной временной отметки.

Что касается длительности первого кадра и последующих временных рамок видеокадра, ваш файлимеет звуковую дорожку AAC, которая имеет пример заполнения , и похоже, что браузер / проигрыватель не пропускает пример заполнения и смещает временные метки видео для сохранения синхронизации.

...