video - 如何在 FFMPEG 4.1 中启用 LHLS?

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

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

来自 FFMPEG 文档:

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

Enable Low-latency HLS(LHLS). Adds #EXT-X-PREFETCH tag with current >segment’s URI. Apple doesn’t have an official spec for LHLS. Meanwhile >hls.js player folks are trying to standardize a open LHLS spec. The >draft spec is available in https://github.com/video-dev/hlsjs->rfcs/blob/lhls-spec/proposals/0001-lhls.md This option will also try >to comply with the above open spec, till Apple’s spec officially >supports it. Applicable only when streaming and hls_playlist options >are enabled. This is an experimental feature.

我在 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 list 类型:

#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 分支编译了 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 

不幸的是,HLS list 中仍然缺少 #EXT-X-PREFETCH

我还尝试了 https://ffmpeg.zeranoe.com/builds/ 的夜间构建, 结果相同。

如有任何帮助,我们将不胜感激。

编辑 2:已解决

感谢@aergistal 和@Gyan,#EXT-X-PREFETCH 标签现在出现在我的 HLS list 中。

这里是我使用的 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 选项。

最佳答案

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

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

参见dashenc.c中的dash_write_packet:

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);
}

关于video - 如何在 FFMPEG 4.1 中启用 LHLS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56700705/

相关文章:

java - vlcj应用优化

delphi - 如何获取已安装的显卡(Delphi)

FFMPEG DNxHR 与 Alpha 到 Webm

iOS:HTTP Live Streaming 到应用程序,视频无法播放

android - 如何使用ffmpeg在android中播放rtsp流

jquery - 如何在响应式 fancyBox 中显示没有黑条的视频/使 iframe 适合视频内容?

opencv - FFMpeg、AVFrame 和 AVBuffer

iphone - 如何从视频中提取方向信息?

amazon-web-services - 使用 Wowza 3.5 在 Amazon CloudFront 中缓存 HLS/HDS 流

ffmpeg 流延迟削减暂停,当我更改 crf qmin refs 等时,延迟仍然存在