У меня есть камера 4K (Sony SNC-VB770), передающая RTSP.
Я пытаюсь записать поток в файлы (каждый имеет удобную длину, скажем, 1 час), используя простой скрипт для многократного запускаffmpeg (версия 4.1):
while : ; do
# (set $url and $outfile, and then)
ffmpeg -rtsp_transport tcp -t 3600 -y -i $url -c copy -map 0:0 -b:v 16000k $outfile
done
Если я запускаю скрипт на локальном ПК, напрямую подключенном к камере, он работает (по крайней мере, дольше недели).Однако если я сделаю то же самое на сервере, расположенном в центре обработки данных, произойдет сбой случайно, без сообщения об ошибке.Иногда он работает в течение нескольких дней, иногда он умирает за одну минуту.
Типичный вывод выглядит следующим образом:
# devname: snc-vb770
# url: rtsp://10.40.35.90/media/video1
# vb: 16000k
# datefmt %d%H
# addtimestamp 0
no timestamp
ffmpeg version 4.1 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-18)
configuration: --prefix=/usr/local/ffmpeg-4.1 --enable-openssl --enable-gpl --enable-version3 --enable-nonfree --enable-shared --enable-libx264 --enable-libvorbis --enable-filter=drawtext --enable-libfreetype --enable-libfribidi --enable-fontconfig
libavutil 56. 22.100 / 56. 22.100
libavcodec 58. 35.100 / 58. 35.100
libavformat 58. 20.100 / 58. 20.100
libavdevice 58. 5.100 / 58. 5.100
libavfilter 7. 40.101 / 7. 40.101
libswscale 5. 3.100 / 5. 3.100
libswresample 3. 3.100 / 3. 3.100
libpostproc 55. 3.100 / 55. 3.100
Input #0, rtsp, from 'rtsp://10.40.35.90/media/video1':
Metadata:
title : Sony RTSP Server
Duration: N/A, start: 0.066667, bitrate: N/A
Stream #0:0: Video: h264 (High), yuv420p(tv, bt709, progressive), 3840x2160 [SAR 1:1 DAR 16:9], 14.99 fps, 14.99 tbr, 90k tbn, 29.97 tbc
Output #0, mp4, to './2811.mp4':
Metadata:
title : Sony RTSP Server
encoder : Lavf58.20.100
Stream #0:0: Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 3840x2160 [SAR 1:1 DAR 16:9], q=2-31, 16000 kb/s, 14.99 fps, 14.99 tbr, 90k tbn, 90k tbc
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
[mp4 @ 0x24e4ec0] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
[mp4 @ 0x24e4ec0] pts has no value
[mp4 @ 0x24e4ec0] Non-monotonous DTS in output stream 0:0; previous: 0, current: 0; changing to 1. This may result in incorrect timestamps in the output file.
frame= 33 fps=0.0 q=-1.0 size= 1792kB time=00:00:02.00 bitrate=7332.9kbits/s speed=3.57x
...
frame= 104 fps=8.4 q=-1.0 Lsize= 6532kB time=00:00:06.74 bitrate=7939.6kbits/s speed=0.548x
video:6531kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.023506%
Я посмотрел пакет RTSP и обнаружил "RTSP /1.0 501 Не реализовано "отправлено из ffmpeg на камеру.После этого камера в конце концов отправила обратно «RTSP / 1.0 505 RTSP Version не поддерживается», а затем ffmpeg вскоре завершил работу.
Кажется, что пакет «501» сгенерирован libavformat / rtsp.c: ff_rtsp_read_reply (), когдаffmpeg получает искаженный пакет RTSP с методом = (null), status_code = 0.Я не знаю, почему такие пакеты поступают в случайное время и кто не прав (может быть, камера, может быть, любой из сетевых коммутаторов или маршрутизаторов в середине сетевого пути от камеры до сервера).Но в любом случае, я не хочу, чтобы запись была остановлена из-за этих искаженных пакетов.
Есть ли обходной путь, чтобы ffmpeg игнорировал недопустимые пакеты RTSP и просто продолжал запись?
Дополнительная информация:
Я проверил запись с ffmpeg ver4.1 и 2.8.4, и различий не наблюдалось.
Различий не наблюдалось применьшее разрешение или меньший битрейт.
У меня 3 камеры разных производителей в одной сетевой среде.Все трое работают без проблем более месяца.Только Sony SNC-VB770 демонстрирует странное поведение.