LINUX.ORG.RU

Два входа - два выхода - проблемы со звуком

 


0

1

Хочу
rtsp + aac ==> rtmp + image every 5 sec (упростил до минимума)

aac добавляю потому что 1) Хочу 2) Без звука rtmp не заводится вообще

Проблемка в том, что если картинка пишется раз в 5 минут, то rtmp не проигрывается

ffplay пишет ошибку (после задумывания около минуты) при проигрывании rtmp, но после этого все равно начинает играть

Could not find codec parameters for stream 0 (Audio: aac, 44100 Hz, stereo, 127 kb/s): unspecified sample format


Если картинка пишется 1 раз в сек - то нормально

Так не работает
ffmpeg -i rtsp:// -i sample.aac -c:v copy -c:a copy -f flv rtmp://  -vf select='eq(pict_type,I)',fps=1/300' -update 1 -f image2 \tmp\key.jpg

Так работает
ffmpeg -i rtsp:// -i sample.aac -c:v copy -c:a copy -f flv rtmp://  -vf select='eq(pict_type,I)',fps=1' -update 1 -f image2 \tmp\key.jpg


Точнее работает и так и так, но в первом варианте - с большой задумкой - висит около минуты, потом играет, но потом снова задумывается

изгуглился уже весь, гении помогите



Input #0, rtsp, from 'rtsp://x.x.x.x:554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif':
  Metadata:
    title           : RTSP Session/2.0
  Duration: N/A, start: 0.730000, bitrate: N/A
  Stream #0:0: Video: h264 (Baseline), yuv420p(progressive), 1280x720, 10 fps, 100 tbr, 90k tbn, start 0.730000
  Stream #0:1: Data: none
[aac @ 000001cdfe470340] Estimating duration from bitrate, this may be inaccurate
Input #1, aac, from 'sample.aac':
  Duration: 00:04:14.81, bitrate: 127 kb/s
  Stream #1:0: Audio: aac (LC), 44100 Hz, stereo, fltp, 127 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #1:0 -> #0:1 (copy)
  Stream #0:0 -> #1:0 (h264 (native) -> mjpeg (native))
Output #0, flv, to 'rtmp://x.x.x.x/live':
  Metadata:
    title           : RTSP Session/2.0
    encoder         : Lavf62.3.100
  Stream #0:0: Video: h264 (Baseline) ([7][0][0][0] / 0x0007), yuv420p(progressive), 1280x720, q=2-31, 10 fps, 100 tbr, 1k tbn
  Stream #0:1: Audio: aac (LC) ([10][0][0][0] / 0x000A), 44100 Hz, stereo, fltp, 127 kb/s
Press [q] to stop, [?] for help


[aist#1:0/aac @ 000002674d0f0dc0] Resumed reading at pts 0.000 with rate 1.050 after a lag of 0.500s
[vist#0:0/h264 @ 000002674ceeed80] Resumed reading at pts 2.080 with rate 1.050 after a lag of 0.500s
[vost#0:0/copy @ 000002674ceb9b00] Non-monotonic DTS; previous: 9200, current: 9150; changing to 9200. This may result in incorrect timestamps in the output file.
[vost#0:0/copy @ 000002674ceb9b00] Non-monotonic DTS; previous: 49210, current: 49160; changing to 49210. This may result in incorrect timestamps in the output file.
[vist#0:0/h264 @ 000002674ceeed80] Resumed reading at pts 80.000 with rate 1.050 after a lag of 1.012s
[vost#0:0/copy @ 000002674ceb9b00] Non-monotonic DTS; previous: 94210, current: 94150; changing to 94210. This may result in incorrect timestamps in the output file.
[mjpeg @ 000002674ce3dcc0] bitrate tolerance 4000000 too small for bitrate 200000, overriding

ТУТ пауза где то 2 минуты

Output #1, image2, to '\tmp\key.jpg':
  Metadata:
    title           : RTSP Session/2.0
    encoder         : Lavf62.3.100
  Stream #1:0: Video: mjpeg, yuv420p(pc, progressive), 1280x720, q=2-31, 200 kb/s, 0.0033 fps, 0.0033 tbn
    Metadata:
      encoder         : Lavc62.11.100 mjpeg
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A

★★★★

Последнее исправление: gobot (всего исправлений: 9)

Ты бы не гуглил, а ИИ вопрошал:

Ты уткнулся не в «магическую» проблему RTMP, а в таймстемпы и разреженные кадры. Когда делаешь fps=1/300 (1 кадр раз в 5 минут), для стрима это выглядит как огромные дыры во времени, и ffmpeg/плееры начинают:

  • ждать данные (буферизоваться)
  • пытаться «догадаться» параметры потока
  • ловить non-monotonic DTS
  • в итоге висеть минуту+ перед стартом

А RTMP вообще плохо переносит такие «редкие» видеопакеты — он ожидает более-менее регулярный поток.


🚨 Главная проблема

Вот эта часть:

-vf select='eq(pict_type,I)',fps=1/300

Ты:

  • сначала выбираешь I-фреймы
  • потом душишь fps до 1 кадра в 300 секунд

👉 В результате:

  • видео поток практически «замирает»
  • таймстемпы прыгают
  • RTMP думает, что поток умер

⚠️ Почему с fps=1 работает

Потому что:

  • поток становится регулярным (1 fps)
  • тайминги нормальные
  • RTMP и ffplay счастливы

💡 Как правильно сделать

Тебе нужно разделить задачи, а не пытаться сделать всё одним фильтром.


✅ Правильный подход

1. RTMP стрим — нормальный, непрерывный

Не трогай fps вообще:

ffmpeg -i rtsp:// -i sample.aac \
-c:v copy -c:a aac -shortest \
-f flv rtmp://

👉 Важно:

  • лучше не copy AAC, а перекодировать (-c:a aac)

  • это уберёт ошибки типа:

    Could not find codec parameters
    

2. Снимок раз в 5 минут — отдельно

ffmpeg -i rtsp:// \
-vf fps=1/300 \
-update 1 -q:v 2 \
\tmp\key.jpg

🔥 Или в одном процессе (правильно через tee)

ffmpeg -i rtsp:// -i sample.aac \
-filter_complex "[0:v]split=2[v1][v2];[v2]fps=1/300" \
-map "[v1]" -map 1:a -c:v copy -c:a aac -f flv rtmp:// \
-map "[v2]" -q:v 2 -update 1 -f image2 \tmp\key.jpg

👉 Здесь:

  • [v1] — нормальный поток → RTMP
  • [v2] — редкие кадры → JPG
  • никаких лагов

⚠️ Важный момент про -c:v copy

Ты сейчас копируешь видео:

-c:v copy

Но при этом используешь фильтры (-vf или -filter_complex) — это конфликт.

👉 Если есть фильтр → будет перекодирование, даже если ты написал copy.


💣 Почему у тебя ещё DTS ошибки

Non-monotonic DTS

Это из-за:

  • RTSP (неровные таймстемпы)
    • редкие кадры
    • merge с AAC

Можно стабилизировать:

-fflags +genpts
-use_wallclock_as_timestamps 1

🧠 Итог

Проблема не в:

  • AAC
  • RTMP
  • ffplay

Проблема в том, что ты: 👉 сделал поток с fps ≈ 0.0033

А RTMP — это live streaming протокол, а не «раз в 5 минут кадр».


✔️ Коротко решение

👉 Не души fps в основном потоке 👉 Делай снимки отдельной веткой (split)


Если хочешь, могу собрать тебе:

  • ultra-stable команду для продакшена
  • или вариант с минимальной задержкой (low latency RTMP)
anonymous
()
Ответ на: комментарий от anonymous

Спасибо дорогой, такой подход я встречал уже в ИИ, но мне было лень все эти «[0:v]split=2[v1][v2];[v2]fps=1/300» абракадабру делать. Я думал что ЭТО дублирование выходов и что они друг на друга не влияют. Попробую сделать так. Вообще tee я делал уже, но в этом случае подумал что он не нужен, потому что там 1 поток кодирования, а если(вдруг?) я захочу rtmp кодировать h265, делать картинки и ещё + mp4+aac, тогда tee не подойдет

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

Опа! А я еще удивился, какой аноним заботливый, столько написал много и еще помощь предложил в конце

Lol rolf

НО в целом полезно, годно

gobot ★★★★
() автор топика

Так не работает

fps=1/300

А оно вообще должно? В смысле, в математику в принципе. Сколько ffmpeg пользовался, даже и не знал, что он так умеет… Если написать fps=0.00333, тоже не работает?

\tmp\key.jpg

А это что вообще за жесть…

upd:

Хочу
rtsp + aac ==> rtmp + image every 5 sec (упростил до минимума)

Ну так image every 5 sec — это 1/5 (fps=0.2), а не 1/300. Откуда взялось 1/300? Это every 5 min.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 3)
Ответ на: комментарий от CrX

Откуда взялось 1/300

1/60 * 5

Вот - отсюда. В минуте 60 секунд, умножаем ещё на 5 - получается 5 минут, потом делим 1 секунду на 300 - получается нужный FPS

Сколько ffmpeg пользовался, даже и не знал, что он так умеет

Он много чего умеет и делить и умножать и всякие функции min\max есть

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

Дробные fps умеет, да. Это действительно необходимо. Даже в случае автора: между с fps=1/300 12-й кадр будет ровно на 1 часе, а с fps=0.00333 он будет на 1:00:03.6, что весьма заметное расхождение и может оказаться не тем, что надо. Можно, конечно, написать 0.0033333, но это будет громоздко, некрасиво, а ошибка, хоть и отодвинется на более позднее время, но всё равно останется. А с 1/300 сразу всё хорошо. Хотя конкретно автору, возможно, это и несущественно, но бывают случаи когда один видеопоток у тебя уже есть и тебе надо к нему сгенерировать второй, и надо чтобы таймстампы кадров шли строго синхронно - и если у тебя не будет возможности точно задать частоту, они будут рассинхронизироваться спустя какое-то время.

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

Вот - отсюда. В минуте 60 секунд, умножаем ещё на 5 - получается 5 минут

Это я и так написал. Мой вопрос в том, откуда взялись «5 минут», если в начале ты сам пишешь «Хочу […] every 5 sec».

CrX ★★★★★
()