【问题标题】:How to enable LHLS in FFMPEG 4.1?如何在 FFMPEG 4.1 中启用 LHLS?
【发布时间】:2019-11-04 03:26:43
【问题描述】:

我正在尝试使用 FFMPEG 创建低延迟 CMAF 视频流。 为此,我想在 FFMPEG 中启用 lhls 选项,以便在 HLS 清单中写入 #EXT-X-PREFETCH 标签。

来自 FFMPEG 文档:

https://www.ffmpeg.org/ffmpeg-all.html

启用低延迟 HLS(LHLS)。添加 #EXT-X-PREFETCH 标记和当前 >segment 的 URI。 Apple 没有 LHLS 的官方规范。同时 >hls.js 播放器正在尝试标准化开放的 LHLS 规范。 >draft spec 在https://github.com/video-dev/hlsjs->rfcs/blob/lhls-spec/proposals/0001-lhls.md 这个选项也将尝试>遵守上面的开放规范,直到Apple的规范正式>支持它。仅在启用流和 hls_playlist 选项> 时适用。这是一个实验性功能。

我在 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

我为特定分辨率获得的 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 标签不见了

任何帮助将不胜感激。

编辑

我还通过执行以下操作从其主分支编译了 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

FFmpeg

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

AOM(在 FFmpeg 目录内)

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/ 进行夜间构建,结果相同。

任何帮助将不胜感激。

编辑 2:已解决

感谢@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 选项。

【问题讨论】:

  • 你需要一个 git build。目前没有任何版本。
  • 谢谢,你知道去哪个分店结账吗?主控还是发布?
  • 主分支。获取预编译的二进制文件。
  • 非常感谢。我会尝试并在这里发布我的结果。
  • @Gyan 我使用从其主分支编译 FFmpeg 的步骤编辑了我的问题。我还尝试了夜间构建。不幸的是,我无法启用 lhls。

标签: video ffmpeg http-live-streaming mpeg-dash low-latency


【解决方案1】:

在当前实现中,lhls 选项不适用于文件输出。如果您使用 HTTP 等其他协议,它会起作用:

-f dash -method PUT http://example.com/live/manifest.mpd

dash_write_packetdashenc.c

int use_rename = proto && !strcmp(proto, "file");
...
if (c->lhls) {
    char *prefetch_url = use_rename ? NULL : os->filename;
    write_hls_media_playlist(os, s, pkt->stream_index, 0, prefetch_url);
}

【讨论】:

  • 非常感谢。我将在明天之前发布我的结果。我仍在尝试为 http 上传找到正确的选项。我还没有看到#EXT-X-PREFETCH
  • @mehdi.r 您还可以添加另一个格式选项来提供服务器 URL 和文件输出路径。只需几行代码。
【解决方案2】:

我知道这个帖子有 18 个月的历史,但我一直在用它来试验 ffmpeg 中的 -lhls 支持。我已经使用@medhi.r 帖子作为路线图设置了一个测试工具,但我没有在我的清单中看到 EXT-X-PREFETCH(正如他在上面提到的那样)。

我已尝试复制尽可能多的适用设置,但仍然没有看到额外的条目。

我真的没有答案,但我认为其他人可能正在对此进行调查,并想在唯一能帮助我做到这一点的线程之一上发帖。

这是我对 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 秒左右,但我并没有真正看到延迟有任何减少,一直在 12-15 秒左右。我正在使用它来传输来自系统摄像头的视频。

【讨论】:

  • 您好,据我了解EXT-X-PREFETCH 是视频开发团队的提议,并非来自 Apple。最近苹果更新了它的文档:developer.apple.com/documentation/http_live_streaming/…Hls.js 已经在实现它:github.com/video-dev/hls.js/search?q=EXT-X-PRELOAD-HINT。但对不起,我不知道如何用 ffmpeg 输出新的EXT-X-PRELOAD-HINT TAG。
  • 您找到解决方案了吗? - 尽管有 1 秒的块,我们也遇到了类似的问题,并且也看到了大约 15 秒的延迟。
  • 这是一篇很棒的文章,我对发布低延迟流媒体非常感兴趣。我正在尝试实施但无法使 http/s PUT 工作。终端说它可以很好地放置文件,但这并没有真正发生。如果我更改为-f dash manifest.mpd,则会创建文件,但 HLS 清单中没有EXT-X-PREFETCH...
  • @mehdi.r 支持 EXT-X-PRELOAD-HINT 容易吗?我希望将 Apple 的 LL-HLS 与 FFMPEG 一起使用
  • @Alexander 据我了解,目前,ffmpeg 的 lhls 与 Apple 的 ll-hls 不同。请在以下页面中查找术语“lhls”:ffmpeg.org/ffmpeg-formats.html
猜你喜欢
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
相关资源
最近更新 更多