LINUX.ORG.RU

ffmpeg задержка

 , ,


0

1

Хочу выдернуть 1 кадр(png) из rtmp потока с помощью ffmpeg. Работает нормально, но на некоторых стримах есть большая задержка около 5-8 сек., а хотелось бы ее исключить и сократить до обычных 2 сек. Заметил, что задержка после avformat_find_stream_info(), после идет много вывода «type:18, size:362, dts:0 pos:60» и как раз на это 90% времени уходит и заканчивается после «All info found». Что за инфу ищет? Я подозреваю, что key frames или ещё что-то в формате mp4, типа синхронизации. Как можно снизить эту задержку?

Запускаю так

ffmpeg -y  -loglevel trace -i "rtmp://127.0.0.1/live/test" -an -f image2 -vframes 1 t.png


Вывод
Probing flv score:100 size:2048
Probing mp3 score:1 size:2048
Probing mpegts score:-1094995529 size:2048
Probing msnwctcp score:-1 size:2048
[flv @ 0x3fb13a0] Format flv probed with size=2048 and score=100
[flv @ 0x3fb13a0] Before avformat_find_stream_info() pos: 13 bytes read:25166 seeks:0
[flv @ 0x3fb13a0] type:18, size:24, dts:0 pos:21
[flv @ 0x3fb13a0] Unknown type |RtmpSampleAccess

[flv @ 0x3fb13a0] type:18, size:362, dts:0 pos:60
[flv @ 0x3fb13a0] type:9, size:45, dts:0 pos:437
[flv @ 0x3fb13a0] 0 17 0
[flv @ 0x3fb13a0] type:9, size:24662, dts:0 pos:497
[flv @ 0x3fb13a0] 0 17 0
[flv @ 0x3fb13a0] type:8, size:18, dts:0 pos:25174
[flv @ 0x3fb13a0] 1 AF 0
[flv @ 0x3fb13a0] type:8, size:280, dts:0 pos:25207
[flv @ 0x3fb13a0] 1 AF 0
[flv @ 0x3fb13a0] type:8, size:281, dts:23 pos:25502
[flv @ 0x3fb13a0] 1 AF 0
[flv @ 0x3fb13a0] type:8, size:280, dts:46 pos:25798
[flv @ 0x3fb13a0] 1 AF 0
[flv @ 0x3fb13a0] type:8, size:281, dts:70 pos:26093
[flv @ 0x3fb13a0] 1 AF 0
[flv @ 0x3fb13a0] type:8, size:281, dts:93 pos:26389
[flv @ 0x3fb13a0] 1 AF 0
[flv @ 0x3fb13a0] type:8, size:280, dts:116 pos:26685
[flv @ 0x3fb13a0] 1 AF 0
[flv @ 0x3fb13a0] type:8, size:281, dts:139 pos:26980
[flv @ 0x3fb13a0] 1 AF 0
[flv @ 0x3fb13a0] type:8, size:281, dts:163 pos:27276
[flv @ 0x3fb13a0] 1 AF 0
[flv @ 0x3fb13a0] type:9, size:43, dts:6667 pos:140848
...тут много ещё подобного вывода...
[flv @ 0x3fb13a0] 0 27 0
[flv @ 0x3fb13a0] All info found
[flv @ 0x3fb13a0] rfps: 6.000000 0.000003
[flv @ 0x3fb13a0] rfps: 12.000000 0.000011
[flv @ 0x3fb13a0] rfps: 18.000000 0.000024
[flv @ 0x3fb13a0] rfps: 24.000000 0.000043
[flv @ 0x3fb13a0] rfps: 30.000000 0.000067
[flv @ 0x3fb13a0] rfps: 48.000000 0.000173
[flv @ 0x3fb13a0] rfps: 60.000000 0.000270
[flv @ 0x3fb13a0] rfps: 120.000000 0.001079
[flv @ 0x3fb13a0] rfps: 240.000000 0.004316
[flv @ 0x3fb13a0] rfps: 23.976024 0.002160
[flv @ 0x3fb13a0] rfps: 29.970030 0.003376
[flv @ 0x3fb13a0] rfps: 59.940060 0.013503
[flv @ 0x3fb13a0] rfps: 11.988012 0.000540
[flv @ 0x3fb13a0] rfps: 47.952048 0.008642
[flv @ 0x3fb13a0] 0: start_time: 0.000 duration: -9223372036854.775
[flv @ 0x3fb13a0] 1: start_time: 0.000 duration: -9223372036854.775
[flv @ 0x3fb13a0] stream: start_time: 0.000 duration: 0.000 bitrate=0 kb/s
[flv @ 0x3fb13a0] After avformat_find_stream_info() pos: 140898 bytes read:140898 seeks:0 frames:329

Влияет на задержку опция -analyzeduration, по умолчанию макс. 5000000=5 сек. Если установить меньше 3 сек., то пишет

Could not find codec parameters for stream 0 (Video: none, 1 reference frame, none, 43 kb/s): unknown codec
Consider increasing the value for the 'analyzeduration' and 'probesize' options

★★★

Никак, без ключевого кадра невозможно построить картинку

hizel ★★★★★ ()
Ответ на: комментарий от hizel

А почему в других видео задержка меньше? Размер кадра влияет или битрейд?

gobot ★★★ ()
Ответ на: комментарий от gobot

А почему в других видео задержка меньше?

gop жирный, на узких каналах любят задрать gop и ключевой кадр приходит раз в вечность

Размер кадра влияет или битрейд?

не пони вопроса

hizel ★★★★★ ()
Ответ на: комментарий от hizel

то есть наоборот, чем чаще ключевой кадр тем, очевидно, быстрее сможете в любой случайный момент времени получить полную картинку

hizel ★★★★★ ()
Ответ на: комментарий от hizel

Размер кадра, 640х480 например и 1920х1280. Во втором случае задержка будет больше - так? Или не от этого зависит. Т.е. грубо говоря чтобы содрать кадр нужно для начала посмотреть 5 секунд видео? Мне кажется это очень много, неужели ключевой кадр может быть раз в 5 сек?

gobot ★★★ ()
Ответ на: комментарий от gobot

неужели ключевой кадр может быть раз в 5 сек?

Да, предел частоте ключевых кадров большой.

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от hizel

Мне удалось уменьшить задержку до с помощью установки -probesize 40000. Теперь вместо 7 секунд задержка 2-3 сек. Но работает на грани, т.е. может найти стрим, а может и не найти(иногда не хватает данных для анализа)

probesize integer
Set probing size in bytes, i.e. the size of the data to analyze to get stream information

Но что такое «analyze to get stream information», это и есть поиск ключевого кадра?
Could not find codec parameters for stream 0 (Video: none, 1 reference frame, none, 43 kb/s): unknown codec
Consider increasing the value for the 'analyzeduration' and 'probesize' options

Как я понимаю, ffmpeg сначала анализирует данные и определяет кодек, fps и т.д. Но если эти параметры указать вручную может быть быстрее пойдет дело.
Но, когда я указываю
-c:v h264

То вообще ничего не находит, пишет
[flv @ 0x30e03e0] type:8, size:295, dts:20248 pos:85726
[h264 @ 0x30e38e0] no frame!

Хотя стрим в h264 идет в контейнере flv... Почему то не находит h264 фрейма

gobot ★★★ ()

Через mplayer не пробовал скрин сделать?

cnupm ()
Ответ на: комментарий от anonymous

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

cnupm ()
Ответ на: комментарий от gobot

Потому что это ты указал выходные параметры, которые тут фиолетово, т.к. он копается во входе.

deep-purple ★★★★★ ()
Ответ на: комментарий от deep-purple

Нет, я указывал параметры по входе(перед -i), ставил -c:v h264 и не находил фреймов...

gobot ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.