我正在尝试使用FFMPEG创建一个低延迟的CMAF视频流。为此,我希望在FFMPEG中启用lhls选项,以便在HLS清单中写入#EXT-X-PREFETCH标记。
来自FFMPEG文档:
https://www.ffmpeg.org/ffmpeg-all.html
启用低延迟HLS(LHLS)。使用当前>段的URI添加#EXT-标记.苹果没有LHLS的官方规范。同时,>hls.js播放器的人们正在试图标准化一个开放的LHLS规范。该>草案规范可在https://github.com/video-dev/hlsjs->rfcs/blob/lhls-spec/proposals/0001-lhls.md中使用,此选项也将尝试>遵守上述开放规范,直到苹果的规范正式>支持它。仅在启用流和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:
nasm
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-devFFmpeg
mkdir lhls
cd lhls
git init
git clone https://github.com/FFmpeg/FFmpeg.git
cd FFmpeg
git checkout masterAOM (内部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..编撰
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选项。
发布于 2019-06-24 09:16:50
在当前实现中,lhls选项不适用于文件输出。如果您使用另一种协议(如HTTP),它将工作:
-f dash -method PUT http://example.com/live/manifest.mpd见dash_write_packet in dashenc.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);
}发布于 2020-12-27 22:09:08
我知道这个线程已经有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秒左右。我用这个来从系统摄像机上播放视频。
https://stackoverflow.com/questions/56700705
复制相似问题