Restreaming eines HLS-Streams in einen RTMP-Stream mit FFMPEG

Restreaming eines HLS-Streams in einen RTMP-Stream mit FFMPEG

Ich versuche, einen HLS-Stream mit FFMPeg in einen RTMP-Stream umzuwandeln:

zum Beispiel :

ffmpeg -loglevel debug -re \
  -i "https://hddn01.skylinewebcams.com/live.m3u8?a=c6kekc4h116t1m5jbtei273bq0" \
  -bufsize 4000k -preset ultrafast -vcodec libx264 -tune zerolatency \
  -b:v 900k -an -f flv rtmp://127.0.0.1/live/stream.flv

Der Stream ist auf der Website verfügbar: https://www.skylinewebcams.com/en/webcam/malta/malta/traffic/traffic-cam2.html

Das Problem besteht darin, dass der Eingabewert fpssehr niedrig und qder Wert sehr hoch oder meistens -1 ist.

Bitte werfen Sie einen Blick auf das folgende Protokoll:

ffmpeg version 3.4.2-1~16.04.york0.2 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.9) 20160609
  configuration: --prefix=/usr --extra-version='1~16.04.york0.2' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avi
synth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --e
nable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --e
nable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi
 --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
  libavutil      55. 78.100 / 55. 78.100
  libavcodec     57.107.100 / 57.107.100
  libavformat    57. 83.100 / 57. 83.100
  libavdevice    57. 10.100 / 57. 10.100
  libavfilter     6.107.100 /  6.107.100
  libavresample   3.  7.  0 /  3.  7.  0
  libswscale      4.  8.100 /  4.  8.100
  libswresample   2.  9.100 /  2.  9.100
  libpostproc    54.  7.100 / 54.  7.100
[hls,applehttp @ 0x5649bd7463e0] Opening 'https://hddn01.skylinewebcams.com/03042101ANC5-1544185331502.ts' for reading
[hls,applehttp @ 0x5649bd7463e0] Could not find codec parameters for stream 1 (Audio: aac ([15][0][0][0] / 0x000F), 0 channels, fltp): unspecified sample rate
Consider increasing the value for the 'analyzeduration' and 'probesize' options
Input #0, hls,applehttp, from 'https://hddn01.skylinewebcams.com/live.m3u8?a=c6kekc4h116t1m5jbtei273bq0':
  Duration: N/A, start: 22431.033000, bitrate: N/A
  Program 0 
    Metadata:
      variant_bitrate : 0
    Stream #0:0: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 1280x1024, 12 fps, 12 tbr, 90k tbn, 180k tbc
    Metadata:
      variant_bitrate : 0
    Stream #0:1: Audio: aac ([15][0][0][0] / 0x000F), 0 channels, fltp
    Metadata:
      variant_bitrate : 0
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
Press [q] to stop, [?] for help
[libx264 @ 0x5649bdc1ba80] VBV maxrate unspecified, assuming CBR
[libx264 @ 0x5649bdc1ba80] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 0x5649bdc1ba80] profile Constrained Baseline, level 3.2
[libx264 @ 0x5649bdc1ba80] 264 - core 152 r2854 e9a5903 - H.264/MPEG-4 AVC codec - Copyleft 2003-2017 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=4 lookahead_threads=4 sliced_threads=1 slices=4 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=12 scenecut=0 intra_refresh=0 rc_lookahead=0 rc=cbr mbtree=0 bitrate=900 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 vbv_maxrate=900 vbv_bufsize=4000 nal_hrd=none filler=0 ip_ratio=1.40 aq=0
Output #0, flv, to 'rtmp://127.0.0.1/live/dhruv.flv':
  Metadata:
    encoder         : Lavf57.83.100
    Stream #0:0: Video: h264 (libx264) ([7][0][0][0] / 0x0007), yuv420p, 1280x1024, q=-1--1, 900 kb/s, 12 fps, 1k tbn, 12 tbc
    Metadata:
      variant_bitrate : 0
      encoder         : Lavc57.107.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/900000 buffer size: 4000000 vbv_delay: -1
[hls,applehttp @ 0x5649bd7463e0] Opening 'https://hddn01.skylinewebcams.com/03042101ANC5-1544185339480.ts' for reading
[hls,applehttp @ 0x5649bd7463e0] Opening 'https://hddn01.skylinewebcams.com/03042101ANC5-1544185347525.ts' for reading
[hls,applehttp @ 0x5649bd7463e0] Opening 'https://hddn01.skylinewebcams.com/03042101ANC5-1544185355483.ts' for reading
[hls,applehttp @ 0x5649bd7463e0] Opening 'https://hddn01.skylinewebcams.com/03042101ANC5-1544185363466.ts' for reading
[hls,applehttp @ 0x5649bd7463e0] Opening 'https://hddn01.skylinewebcams.com/03042101ANC5-1544185371496.ts' for reading
[flv @ 0x5649bdc1aae0] Failed to update header with correct duration.939.0kbits/s speed=0.991x    
[flv @ 0x5649bdc1aae0] Failed to update header with correct filesize.
frame=  552 fps= 12 q=33.0 Lsize=    5261kB time=00:00:45.91 bitrate= 938.6kbits/s speed=0.992x    
  • Weiß jemand, wie man in Echtzeit streamt?

Antwort1

Dieser dynamisch generierte HLS-Stream verwendet ein JS-basiertes DRM-System: Nur solange die Seite geöffnet ist und Heartbeats sendet, wird das m3u8 aktualisiert (und damit der Stream abgespielt). Wenn diese Heartbeats aufhören, wird die m3u8-Datei statisch und die FPS-Zahl nimmt mit der Zeit immer weiter ab.

Ich gehe davon aus, dass dieses Schema eingesetzt wird, um das erneute Streamen des Bildes zu erschweren.

Antwort2

Versuchen Sie es ohne das -reFlag. Es erzwingt ffmpegdas Lesen einer Eingabe in Echtzeitgeschwindigkeit, wodurch verhindert wird, dass ffmpegein bevorstehendes Segment im Voraus heruntergeladen wird, was zu unerwünschten Verzögerungen führt.

Sie können auch versuchen, das -thread_queue_sizeFlag zu setzen, wodurch ffmpegdas Herunterladen von Segmenten in einem separaten Thread erzwungen wird, sobald diese verfügbar sind.

Antwort3

Dies funktioniert perfekt mit HLS-Streaming über eine günstige Buffalo-Webcam (UVC). Und überprüfen Sie alle lokalen VLCs (könnte der VLC Ihres PCs sein).

  • Erstellen Sie [ein] Verzeichnis, um m3u8-Dateien und TS-Dateien vorab abzulegen, um dieses Bash-Skript auszuführen
#!/bin/bash
HTTPDIR=/localhost #(might be /var/www/.....)
cd $HTTPDIR
sudo ffmpeg -f alsa -thread_queue_size 3524 -i hw:1 -i /dev/video0 -video_size 1280x720 -f rtsp -input_format YUY2 -video_size 1280x720 -vf fps=100 -vcodec libx264 -video_track_timescale 100 -subq 6 -me_range 16 -b:v 2500k -g 24 -c:a aac -ab 1840 -bufsize 512k -f hls -hls_time 7 -hls_list_size 8 -hls_allow_cache 0 -hls_segment_filename $HTTPDIR/one/stream_%d.ts -hls_flags delete_segments $HTTPDIR/oen/playlist.m3u8

Das funktioniert auch ohne Optionen von-video_track_timescale 100 -subq 6 -me_range 16

Wenn Sie-ab 1840(Audio-Bitrate) zu niedrig, etwa 124, dann ist der Ton abgehackt.

Überprüfen Sie die-video_sizeUnd-input_format, durch Eingabe vonffprobe /dev/video0.

Geben Sie dann dasselbe in den ffmpeg-Befehl ein.

Alles erledigt. Hoffe, das hilft allen, die von der Sache mit ffmpeg genervt sind !!(OvOY

verwandte Informationen