独立的fmp4片段的HLS播放列表

问题描述

我正在研究一个VMS,它以MPEGTS格式存储10秒长的视频片段。然后可以使用HLS流式传输这些片段,其播放列表如下所示:

#EXTM3U
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:11
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-START:TIME-OFFSET=1.0,PRECISE=YES
#EXTINF:10,1602816779831000000.ts
#EXTINF:10,1602816789831000000.ts
#EXT-X-ENDLIST

只要这些文件以h.264编码,此方法就很好用。但是,如果我尝试使用h.265段创建类似的播放列表,则该播放列表仅适用于我们的Android客户端,Apple和hls.js已决定仅使用片段MP4支持h.265 HLS。

“直接”通过直接存储fmp4文件来支持h.265的“本机”对我来说不是一个选择,因此我想按需将那些MPEGTS文件打包为fmp4。

所以我试图做的是,改而返回此播放列表(仅更改文件扩展名):

#EXTM3U
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:11
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-START:TIME-OFFSET=1.0,1602816779831000000.mp4
#EXTINF:10,1602816789831000000.mp4
#EXT-X-ENDLIST

,然后在收到请求时,使用FFMPEG将这些MPEGTS文件懒惰地打包为fmp4:

ffmpeg -i 1602816779831000000.ts -c copy -movflags frag_keyframe+empty_moov+default_base_moof 1602816779831000000.mp4
ffmpeg -i 1602816789831000000.ts -c copy -movflags frag_keyframe+empty_moov+default_base_moof 1602816789831000000.mp4

不幸的是,这似乎仅适用于具有单个片段的播放列表(这意味着最长10秒)。当我有2个以上的文件时,它将不起作用,并且行为会根据我使用的客户端而改变:有些会播放第一个文件,然后停止,有些会快进到最后一个文件,然后播放这个文件相反,有些根本不会玩...

我了解通过HLS进行fmp4流式传输的“常规”方法是使用“媒体初始化”段,并将其放入每个段的#EXT-X-MAP标头中,然后通常将其编码为* .m4s文件而不是* .mp4。但是,是否可以使fmp4在具有独立段的HLS上工作,类似于我们对MPEGTS所做的工作?由于只有一个条目的播放列表似乎支持这一点,所以我认为可能有一种方法。

此外,我知道Apple在HLS规范的这一部分以及从this is possible in MPEG-DASH的角度出发,都受到MPEG-DASH的启发。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...