J'essaie de créer un flux vidéo CAFA à faible latence à l'aide de FFMPEG. Pour ce faire, je voudrais activer l'option lhls
dans FFMPEG afin d'avoir le #EXT-X-PREFETCH
tag écrit dans le manifeste hls.
https://www.fmpeg.org/ffmpeg-all.html
Activer la latence HLS (LHL). Ajoute une étiquette # Ext-X-Prefetch avec URI actuel> SEGMENT. Apple n'a pas de spécification officielle pour les LHLS. Pendant ce temps> Les gens du lecteur HLS.JS tentent de normaliser une spécification LHLS ouverte. Le projet Spec est disponible dans HTTPS://github.com/video-dev/hlsjs- >Rfcs/blob/lhls-spec/proposals/0001-lhls.md Cette option va également essayer> à se conformer à la spécification Open ci-dessus, tandis que les spécifications d'Apple officiellement> Soutien IT. Applicable uniquement lors de la diffusion des options de streaming et hls_playlist> sont activées. Ceci est une fonctionnalité expérimentale.
ffmpeg -re -i ~/Documents/videos/BigBuckBunny.mp4 \
-map 0 -map 0 -map 0 -c:a aac -c:v libx264 -tune zerolatency \
-b:v:0 2000k -s:v:0 1280x720 -profile:v:0 high \
-b:v:1 1500k -s:v:1 640x340 -profile:v:1 main \
-b:v:2 500k -s:v:2 320x170 -profile:v:2 baseline \
-bf 1 \
-keyint_min 24 -g 24 -sc_threshold 0 -b_strategy 0 -ar:a:1 22050 -use_timeline 1 -use_template 1 \
-window_size 5 -adaptation_sets "id=0,streams=v id=1,streams=a" \
-hls_playlist 1 -seg_duration 1 -streaming 1 -strict experimental -lhls 1 -remove_at_exit 1 \
-f dash manifest.mpd
Le type de manifeste HLS que j'ai obtenu pour une résolution spécifique:
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:1
#EXT-X-MEDIA-SEQUENCE:8
#EXT-X-MAP:URI="init-stream0.mp4"
#EXTINF:0.998458,
#EXT-X-PROGRAM-DATE-TIME:2019-06-21T18:13:56.966+0900
chunk-stream0-00008.mp4
#EXTINF:0.998458,
#EXT-X-PROGRAM-DATE-TIME:2019-06-21T18:13:57.964+0900
chunk-stream0-00009.mp4
#EXTINF:0.998458,
#EXT-X-PROGRAM-DATE-TIME:2019-06-21T18:13:58.963+0900
chunk-stream0-00010.mp4
#EXTINF:0.998458,
#EXT-X-PROGRAM-DATE-TIME:2019-06-21T18:13:59.961+0900
chunk-stream0-00011.mp4
#EXTINF:1.021678,
#EXT-X-PROGRAM-DATE-TIME:2019-06-21T18:14:00.960+0900
chunk-stream0-00012.mp4
...
Comme vous pouvez voir le #EXT-X-PREFETCH
Tag est manquant .
Toute aide serait très appréciée.
J'ai également compilé FFMPEG de sa branche principale en procédant comme suit:
Sudo apt-get install nasm mingw-w64
Sudo apt-get install libx265-dev libnuma-dev libx264-dev libvpx-dev libfdk-aac-dev libmp3lame-dev libopus-dev
mkdir lhls
cd lhls
git init
git clone https://github.com/FFmpeg/FFmpeg.git
cd FFmpeg
git checkout master
git -C aom pull 2> /dev/null || git clone --depth 1 https://aomedia.googlesource.com/aom && \
mkdir -p aom_build && \
cd aom_build && \
PATH="$HOME/bin:$PATH" cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED=off -DENABLE_NASM=on ../aom && \
PATH="$HOME/bin:$PATH" make && \
make install
cd..
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \
--prefix="$HOME/ffmpeg_build" \
--pkg-config-flags="--static" \
--extra-cflags="-I$HOME/ffmpeg_build/include" \
--extra-ldflags="-L$HOME/ffmpeg_build/lib" \
--extra-libs="-lpthread -lm" \
--bindir="$HOME/bin" \
--enable-gpl \
--enable-libaom \
--enable-libass \
--enable-libfdk-aac \
--enable-libfreetype \
--enable-libmp3lame \
--enable-libopus \
--enable-libvorbis \
--enable-libvpx \
--enable-libx264 \
--enable-libx265 \
--enable-nonfree && \
PATH="$HOME/bin:$PATH" make
Malheureusement, le #EXT-X-PREFETCH
est toujours manquant dans le manifeste HLS.
J'ai aussi essayé la nuit à partir de - https://ffmpeg.zerano.com/builds/ , même résultat.
Toute aide serait très appréciée.
Merci à @Aergistal et @gyan, le #EXT-X-PREFETCH
tag est maintenant présent dans mon manifeste HLS.
Ici la commande FFMPEG que j'utilise:
./ffmpeg -re -i ~/videos/BigBuckBunny.mp4 -loglevel debug \
-map 0 -map 0 -map 0 -c:a aac -c:v libx264 -tune zerolatency \
-b:v:0 2000k -s:v:0 1280x720 -profile:v:0 high -b:v:1 1500k -s:v:1 640x340 -profile:v:1 main -b:v:2 500k -s:v:2 320x170 -profile:v:2 baseline -bf 1 \
-keyint_min 24 -g 24 -sc_threshold 0 -b_strategy 0 -ar:a:1 22050 -use_timeline 1 -use_template 1 -window_size 5 \
-adaptation_sets "id=0,streams=v id=1,streams=a" -hls_playlist 1 -seg_duration 3 -streaming 1 \
-strict experimental -lhls 1 -remove_at_exit 0 -master_m3u8_publish_rate 3 \
-f dash -method PUT -http_persistent 1 https://example.com/manifest.mpd
Apparemment, les types MIME ne sont pas transmis au serveur et FFMPEG semble ignorer le -headers
option.
Je sais que ce fil est âgé de 18 mois, mais je l'utilise pour expérimenter le support -LHLS à FFMPEG. J'ai mis en place un harnais de test à l'aide de @ Medhi.r Post sous forme de feuille de route, mais je ne vois pas la préfetchère ext-x-x-Prefetch dans mon manifeste (comme il mentionne qu'il résolue ci-dessus).
J'ai essayé de dupliquer autant que les paramètres applicables, mais je ne vois toujours pas l'entrée supplémentaire.
Je n'ai pas vraiment de réponse, mais je pensais que les autres pourraient enquêter sur cela et je voulais poster sur l'un des seuls threads qui m'ont aidé à obtenir aussi loin que moi.
Voici ma liste d'arguments à FFMPEG (que j'ai construite à partir d'une extraction fraîche de Git ce matin):
ffmpeg -r 25 -re -i pipe:0 -y -an -vcodec copy \
-seg_duration 3 -window_size 5 -init_seg_name init.m4s \
-media_seg_name '$Time$-$Number$.m4s' \
-strict experimental -streaming 1 -hls_playlist 1 -tune zerolatency -lhls 1 -master_m3u8_publish_rate 3 \
-f dash -method PUT -http_persistent 1 http://192.168.xx.xx:yyyy/camera/manifest.mpd
J'espérais utiliser des LHL pour conduire la latence en dessous de 2 secondes environ, mais je ne vois pas vraiment de réduction de la latence, ce qui est toujours d'environ 12 à 15 secondes. J'utilise cela pour pipe la vidéo de la caméra système.