Купил дешевую IP камеру Escam QF002 с выводом в RTSP. Я хотел бы защитить его с помощью потока RTMP или HLS, обслуживаемого nginx с модулем nginx-rtmp.
Для этого я бы скопировал видеопоток (h264) и перекодировал аудио (pcm_alaw -> aac), используя:
/usr/bin/ffmpeg -loglevel debug \
-i 'rtsp://192.168.1.2:554/user=admin&password=******&channel=0&stream=0.sdp?real_stream--rtp-caching=100' \
-vcodec copy -acodec aac -f flv "rtmp://localhost/escam/stream"
Через ~260 секунд (каждый раз одно и то же значение) успешного потока корректный вывод больше не производится, и сообщение рассылается спамом:
Delay between the first packet and last packet in the muxing queue is 10020000 > 10000000: forcing output
Кажется, это происходит только тогда, когда камера находится в «ночном/инфракрасном» режиме. Некоторые различия могут быть зарегистрированы:
Ночной режим: заявленная частота кадров достигает 13 кадров в секунду, а исходные кадры передаются с разрешением 488 DTS.
...
[flv @ 0x1d53710] Non-monotonous DTS in output stream 0:0; previous: 488, current: 385; changing to 488. This may result in incorrect timestamps in the output file.
....
frame= 1451 fps= 13 q=-1.0 size= 5357kB time=00:02:11.84 bitrate= 332.8kbits/s speed=1.16x
Дневной режим: заявленная частота кадров сходится к 20 кадрам в секунду, а начальные кадры передаются с 300 DTS.
Но каждый раз входной поток определяется как:
Stream #0:0, 0, 1/1000: Video: h264 (Main), 1 reference frame ([7][0][0][0] / 0x0007), yuvj420p(pc, bt709, progressive, left), 1280x720 (0x0), 0/1, q=2-31, 20 fps, 13 tbr, 1k tbn, 90k tbc
Stream #0:1, 0, 1/1000: Audio: pcm_alaw ([7][0][0][0] / 0x0007), 8000 Hz, mono, 64 kb/s
Пока что только отключение аудиопотока -an
позволяет осуществлять непрерывную потоковую передачу. Копирование потока без перекодирования аудио ( -acodec copy
) или записи в файл приводит к той же ошибке.
В чем может быть проблема? Почему это относится только к ночному режиму?
РЕДАКТИРОВАТЬ: я думаю, мне нужно опубликовать это как другую тему, так как это оказывается проблемой XY.
Я предполагаю, что проблема связана с неправильным PTS/DTS для видеокадров, возвращаемых RTP. FFmpeg сообщает, что видеовход имеет 20 кадров в секунду, хотя на самом деле он возвращает ~ 13 кадров в секунду (tbr):
Stream #0:0: Video: h264 (Main), yuvj420p(pc, bt709, progressive), 1280x720, 20 fps, 13 tbr, 90k tbn, 40 tbc
Проверка входных кадров с помощью ffprobe -show_frames -read_intervals %+100 'rtsp://host/stream'
дает следующую информацию для видеокадров:
PTS/DTS нужно каким-то образом пересчитать из значения по умолчанию 0,05 (я не уверен, что это делается с помощью ffmpeg или самого источника). Однако этот интервал слишком мал по сравнению с аудиопотоком, как показано на графике ниже. Это приводит к тому, что видео ремультируется быстрее, чем аудио.
Вопросов:
Я решил проблему, восстановив временные метки с нуля с помощью -use_wallclock_as_timestamps 1
и -fflags +genpts
.
/usr/bin/ffmpeg -use_wallclock_as_timestamps 1 -i "rtsp://${source}" -fflags +genpts -vcodec copy -acodec aac -f flv "rtmp://${dest}"
Это лишь частичное решение, а точнее обходной путь, так как мне до сих пор неясно, что вызывает такое поведение.
Гьян
mjktfw
-re
опцией не работает, так как это приводит к отбрасыванию нескольких пакетов.