使用 ffmpeg 将 hls 流重新流式传输为 rtmp 流

使用 ffmpeg 将 hls 流重新流式传输为 rtmp 流

我正在尝试使用 ffmpeg 将 hls 流重新流式传输为 rtmp 流:

例如:

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

该流媒体可在网站上观看: https://www.skylinewebcams.com/en/webcam/malta/malta/traffic/traffic-cam2.html

问题是输入fps值非常低,而q值大多数时候非常高或为 -1。

请查看以下日志:

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    
  • 有人知道如何实时流式传输吗?

答案1

此动态生成的 HLS 流使用基于 JS 的 DRM 系统:只要页面处于打开状态并发送心跳,m3u8 才会刷新(从而播放流)。如果这些心跳停止,m3u8 文件将变为静态,因此 FPS 计数将随着时间的推移而不断减少。

我认为采用这个方案是为了使图像的重新流式传输变得更加困难。

答案2

尝试不使用该-re标志。它会强制ffmpeg以实时速度读取输入,从而防止ffmpeg提前下载即将到来的片段而导致不必要的延迟。

您也可以尝试设置标志,一旦片段可用,-thread_queue_size它将强制在单独的线程中下载片段。ffmpeg

答案3

这与廉价的 buffalo webcam(UVC) 流式 HLS 完美兼容。并检查任何本地 VLC(可能是您 PC 的 VLC)。

  • 提前创建 [一个] 目录以放置 m3u8 文件和 ts 文件,以运行此 bash 脚本
#!/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

这也像魅力一样,没有选择-video_track_timescale 100 -subq 6 -me_range 16

如果你设置-ab 1840(音频比特率)太低(例如 124)则声音不连贯。

检查你的网络摄像头-video_size-input_format,输入ffprobe /dev/video0

然后将其放入 ffmpeg 命令中。

全部完成。希望这可以帮助所有被 ffmpeg 困扰的人!(OvOY)

相关内容