ffmpeg将段附加到没有#EXT-X-DISCONTINUITY标签的m3u8文件中

问题描述

每隔几秒钟,我就会收到来自服务器的一段长音频文件。我想分割这些块并创建一个m3u8播放列表,以在浏览器中播放音频

我可以创建m3u8文件,并每隔几秒钟向其添加片段,直到收到最后一个块,然后可以在浏览器中播放该文件。问题是ffmpeg将#EXT-X-disCONTINUITY标签添加到m3u8文件中,这会给音频添加较短的静音期,并且浏览器中的播放听起来不流畅。

是否可以告诉ffmpeg我所有的独立文件实际上都属于同一文件(相同的源代码和编码),并停止添加#EXT-X-disCONTINUITY标签?还是有办法避免此标签添加的较短的静音期?还是有其他方法可以尝试从独立文件创建流畅的音频流?

我最后的m3u8文件

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:EVENT
#EXTINF:1.792000,http://localhost:9000/aacf6dc4-9f3e-4f76-86b6-3e0f01a65d88000000.ts
#EXT-X-disCONTINUITY
#EXTINF:1.792000,http://localhost:9000/aacf6dc4-9f3e-4f76-86b6-3e0f01a65d88000001.ts
...
#EXT-X-disCONTINUITY
#EXTINF:1.792000,http://localhost:9000/aacf6dc4-9f3e-4f76-86b6-3e0f01a65d88000006.ts
#EXT-X-ENDLIST

我的ffmpeg命令:

# create the playlist
ffmpeg -y -i <chunk.flac> -hls_playlist_type event -hls_base_url http://localhost:9000/ -hls_segment_filename <segment> -hls_time 2 -hls_flags omit_endlist playlist.m3u8 

# append to playlist
ffmpeg -y -i <chunk.flac> -hls_playlist_type event -hls_base_url http://localhost:9000/ -hls_segment_filename <segment> -hls_time 2 -hls_flags omit_endlist+append_list playlist.m3u8

# finish the playlist
ffmpeg -y -i <chunk.flac> -hls_playlist_type event -hls_base_url http://localhost:9000/ -hls_segment_filename <segment> -hls_time 2 -hls_flags append_list playlist.m3u8

解决方法

我查看了libavformat/hlsenc.c的代码:

if (hls->flags & HLS_APPEND_LIST) {
            parse_playlist(s,vs->m3u8_name,vs);
            vs->discontinuity = 1;

一旦您使用append_list,就会插入一个间断。除非您添加一个选项并为ffmpeg打补丁-我认为您不能避免使用#EXT-X-DISCONTINUITY标签。

但是您可以使用简单的命令行后处理播放列表:

grep -v "#EXT-X-DISCONTINUITY" playlist.m3u8 > temp; mv temp playlist.m3u8