web-dev-qa-db-fra.com

Comment activer les LHLS dans FFMPEG 4.1?

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.

De la DOC FFMPEG:

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.

J'utilise la commande suivante avec FFMPEG 4.1:

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.

Éditer

J'ai également compilé FFMPEG de sa branche principale en procédant comme suit:

nasm

Sudo apt-get install nasm mingw-w64

Codecs

Sudo apt-get install libx265-dev libnuma-dev libx264-dev libvpx-dev libfdk-aac-dev libmp3lame-dev libopus-dev

Ffmpeg

mkdir lhls
cd lhls 
git init 
git clone https://github.com/FFmpeg/FFmpeg.git
cd FFmpeg 
git checkout master

AOM (à l'intérieur de FFMPEG DIR)

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..

Compilation

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.

Edit 2: Résolu

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.

7
mehdi.r

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.

2
JohnL