Synchronisierung mehrerer RTSP-Streams gleichzeitig

5

Ich möchte h264-RTSP-Streams von bis zu sechs IP-Kameras gleichzeitig erfassen und in separaten Dateien speichern. Die Kameras sind an einen Gigabit-Switch angeschlossen, der an meinen PC angeschlossen ist. Die ausgegebenen Videos müssen für die weitere Verarbeitung synchronisiert werden: Die Videos müssen dieselbe Dauer, Startzeit, Stoppzeit und Framerate haben. Ich versuche, ffmpeg für diese Aufgabe zu verwenden.

Anscheinend geben meine IP-Kameras eine Ausgabe mit variabler Bildrate aus. Um mehrere Streams gleichzeitig aufzunehmen, plane ich, den Stream zuerst zu kopieren und später auf eine konstante Bildrate umzucodieren. Dies erfordert, dass der erfasste Stream den Zeitstempel jedes Frames trägt.

Mein erster Versuch, Streams für beispielsweise 10 Sekunden aufzuzeichnen, ist:

ffmpeg -loglevel verbose -i rtsp://192.168.1.101 -i rtsp://192.168.1.102 \
-map 0:v -vcodec copy -an -t 10 -y out1.mp4 \
-map 1:v -vcodec copy -an -t 10 -y out2.mp4  

Dies sollte Sekunden von zwei Streams in out1.mp4 und out2.mp4 einsparen, Video kopieren, Audio verwerfen und überschreiben, wenn die Dateien vorhanden sind. Das Ergebnis sind jedoch zwei Videos mit einer unterschiedlichen Länge zwischen 5 und 7 Sekunden, die nicht synchronisiert sind. Außerdem frieren die Videos etwa alle drei Sekunden ein. Die (ausführliche) Protokollausgabe lautet:

ffmpeg version N-50911-g9efcfbe Copyright (c) 2000-2013 the FFmpeg developers
  built on Mar 13 2013 21:26:48 with gcc 4.7.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-av
isynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enab
le-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libg
sm --enable-libilbc --enable-libmp3lame --enable-libopencore-amrnb --enable-libo
pencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-li
bschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-lib
twolame --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enabl
e-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      52. 19.100 / 52. 19.100
  libavcodec     55.  0.100 / 55.  0.100
  libavformat    55.  0.100 / 55.  0.100
  libavdevice    54.  4.100 / 54.  4.100
  libavfilter     3. 45.103 /  3. 45.103
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
[rtsp @ 027698e0] SDP:
v=0
o=StreamingServer 3331435948 1116907222000 IN IP4 192.168.1.101
s=h264.mp4
c=IN IP4 0.0.0.0
t=0 0
a=control:*
m=video 0 RTP/AVP 96
a=control:trackID=0
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z0KAKNoB4AiTAWoEBARgQAAF9eE
AAC+vCve+Eg==,aM48gA==
m=application 0 RTP/AVP 107
a=control:trackID=2
a=rtpmap:107 vnd.onvif.metadata/90000


[h264 @ 0276c520] Current profile doesn't provide more RBSP data in PPS, skippin
g
[rtsp @ 027698e0] Estimating duration from bitrate, this may be inaccurate
Input #0, rtsp, from 'rtsp://192.168.1.101':
  Metadata:
    title           : h264.mp4
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: h264 (Baseline), yuv420p, 1920x1088 [SAR 1:1 DAR 30:17],
 30.17 tbr, 90k tbn, 180k tbc
    Stream #0:1: Data: none
[rtsp @ 027682a0] SDP:
v=0
o=StreamingServer 3331435948 1116907222000 IN IP4 192.168.1.102
s=h264.mp4
c=IN IP4 0.0.0.0
t=0 0
a=control:*
m=video 0 RTP/AVP 96
a=control:trackID=0
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z0KAKNoB4AiTAWoEBARgQAB9AAA
DARlAve+EgA==,aM48gA==
m=application 0 RTP/AVP 107
a=control:trackID=2
a=rtpmap:107 vnd.onvif.metadata/90000


[h264 @ 0495b420] Current profile doesn't provide more RBSP data in PPS, skippin
g
[rtsp @ 027682a0] Estimating duration from bitrate, this may be inaccurate
Input #1, rtsp, from 'rtsp://192.168.1.102':
  Metadata:
    title           : h264.mp4
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #1:0: Video: h264 (Baseline), yuv420p, 1920x1088 [SAR 1:1 DAR 30:17],
 30.17 tbr, 90k tbn, 180k tbc
    Stream #1:1: Data: none
Output #0, mp4, to 'out1.mp4':
  Metadata:
    title           : h264.mp4
    encoder         : Lavf55.0.100
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1920x1088 [SAR 1
:1 DAR 30:17], q=2-31, 90k tbn, 90k tbc
Output #1, mp4, to 'out2.mp4':
  Metadata:
    title           : h264.mp4
    encoder         : Lavf55.0.100
    Stream #1:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1920x1088 [SAR 1
:1 DAR 30:17], q=2-31, 90k tbn, 90k tbc
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #1:0 -> #1:0 (copy)
Press [q] to stop, [?] for help
[NULL @ 0495b420] Current profile doesn't provide more RBSP data in PPS, skippin
g
[NULL @ 0276c520] RTP: missed 362 packets
[NULL @ 0276c520] Current profile doesn't provide more RBSP data in PPS, skippin
g
    Last message repeated 1 times
frame=   44 fps=0.0 q=-1.0 q=-1.0 size=     560kB time=00:00:03.24 bitrate=1412.
frame=   60 fps= 59 q=-1.0 q=-1.0 size=     622kB time=00:00:03.77 bitrate=1350.
Current profile doesn't provide more RBSP data in PPS, skipping
[NULL @ 0276c520] Current profile doesn't provide more RBSP data in PPS, skippin
g
frame=   75 fps= 49 q=-1.0 q=-1.0 size=     813kB time=00:00:04.27 bitrate=1559.
frame=   90 fps= 45 q=-1.0 q=-1.0 size=     877kB time=00:00:04.76 bitrate=1507.
Current profile doesn't provide more RBSP data in PPS, skipping
[NULL @ 0276c520] Current profile doesn't provide more RBSP data in PPS, skippin
g
frame=  106 fps= 42 q=-1.0 q=-1.0 size=    1080kB time=00:00:05.29 bitrate=1669.
frame=  121 fps= 40 q=-1.0 q=-1.0 size=    1142kB time=00:00:05.79 bitrate=1613.
Current profile doesn't provide more RBSP data in PPS, skipping
[NULL @ 0276c520] Current profile doesn't provide more RBSP data in PPS, skippin
g
frame=  136 fps= 38 q=-1.0 q=-1.0 size=    1327kB time=00:00:06.29 bitrate=1727.
Current profile doesn't provide more RBSP data in PPS, skipping
frame=  151 fps= 37 q=-1.0 q=-1.0 size=    1382kB time=00:00:06.78 bitrate=1667.
Current profile doesn't provide more RBSP data in PPS, skipping
frame=  166 fps= 36 q=-1.0 q=-1.0 size=    1574kB time=00:00:07.28 bitrate=1770.
Current profile doesn't provide more RBSP data in PPS, skipping
frame=  182 fps= 36 q=-1.0 q=-1.0 size=    1643kB time=00:00:07.81 bitrate=1722.
Current profile doesn't provide more RBSP data in PPS, skipping
frame=  183 fps= 33 q=-1.0 q=-1.0 size=    1647kB time=00:00:06.49 bitrate=2078.
Current profile doesn't provide more RBSP data in PPS, skipping
frame=  183 fps= 30 q=-1.0 q=-1.0 size=    1647kB time=00:00:06.98 bitrate=1931.
frame=  183 fps= 28 q=-1.0 q=-1.0 size=    1647kB time=00:00:07.48 bitrate=1803.
Current profile doesn't provide more RBSP data in PPS, skipping
frame=  183 fps= 26 q=-1.0 q=-1.0 size=    1647kB time=00:00:07.98 bitrate=1690.
No more output streams to write to, finishing.
frame=  183 fps= 26 q=-1.0 Lq=-1.0 size=    1649kB time=00:00:08.01 bitrate=1685
.8kbits/s
video:3803kB audio:0kB subtitle:0 global headers:0kB muxing overhead -56.630223%

Wie kann ich diese Streams synchronisieren?

MartinKS
quelle

Antworten:

1

Ich bin auch mit diesem Problem konfrontiert.

Die Asynchronität ergibt sich aus der unterschiedlichen Verbindungszeit zu den Kameras.

Die Lösung, an der ich arbeite, besteht darin, ffserver zu verwenden, um die Streams kontinuierlich abzufangen und auf localhost zu verbreiten. Dann können Sie ffmpeg verwenden, um ohne Verbindungsverzögerung auf die Streams zuzugreifen.

PiK
quelle
Wenn Sie das zum Laufen bringen, würde ich gerne ein Beispiel sehen. Leider ist ffserver unter Windows nicht verfügbar. Die VLM-Übertragung von VLC bietet möglicherweise eine ähnliche Lösung.
MartinKS