问题描述
每隔几秒钟,我就会收到来自服务器的一段长音频文件。我想分割这些块并创建一个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