FFMPEGを使用して低遅延CMAFビデオストリームを作成しようとしています。そのためには、HLSマニフェストに#EXT-X-PREFETCH
タグを作成するために、ffmpegのlhls
オプションを有効にします。
https://www.ffmpeg.org/ffmpeg-all.html
低遅延HLS(LHLS)を有効にします。 #ext-x-プリフェッチタグを現在の>セグメントのURIに追加します。 Apple LHLSの公式仕様はありません。その間> HLS.JS Playerの人々は、Open LHLS仕様を標準化しようとしています。 >ドラフト仕様は https://github.com/video-dev/hlsjs- > RFCS/BLOB/LHLS-spec/proposals/0001-Lhls.mdこのオプションも試してみます>上記のオープンスペックを遵守するために、AppleのSpecが正式に>をサポートします。ストリーミングとHLS_PLAYLISTオプション>が有効になっている場合にのみ適用されます。これは実験的な機能です。
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
特定の解像度で取得したHLSマニフェストの種類:
#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
...
ご覧のとおり、#EXT-X-PREFETCH
タグが見つからない。
あらゆる助けが高く評価されるでしょう。
次のようにして、Master BranchからFFMPEGをコンパイルしました。
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
残念ながら、#EXT-X-PREFETCH
はまだHLSマニフェストにありません。
私はまた、毎晩ビルドからビルドしようとしました https://ffmpeg.zeranoe.com/builds/ 、同じ結果。
あらゆる助けが高く評価されるでしょう。
@aergistalと@gyanのおかげで、#EXT-X-PREFETCH
タグが私のHLSマニフェストに存在しています。
ここで私が使用しているffmpegコマンド
./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
どうやらMIMEタイプはサーバーに渡されず、FFMPEGは-headers
オプションを無視しているようです。
私はこのスレッドが18ヶ月前であることを知っていますが、FFMPEGでの-LHLSサポートを実験するために使用しています。私はロードマップとして@ medhi.r投稿を使ってテストハーネスを設立しましたが、私は私のマニフェストのext-xプリフェッチを見ていません(彼が上記で解決したように言及されているように)。
該当する設定と同じくらい多くのものを複製しようとしましたが、それでも追加のエントリが表示されていません。
私は本当に答えを持っていませんが、他の人がこれを調査し、私が持っている限り私が得るのを助けた唯一のスレッドのうちの1つに投稿したいと思った。
これはffmpegへの私の議論リストです(私は今朝Gitからの新鮮な引っ張りから構築したもの)。
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
_
私はLHLSを2秒以下の下に追いつくためにLHLSを使うことを望んでいましたが、私はレイテンシの減少を実際には見えません。これは一貫して12~15秒です。これを使用してシステムカメラからビデオを配管しています。