ffmpeg在没有#EXT-X-DISCNTINUITY标记的情况下将段附加到m3u8文件



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

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

有没有办法告诉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

相关内容

最新更新