HLS MP4独立细分

时间:2016-08-18 18:56:16

标签: ffmpeg mp4 hls m3u8 fmp4

长话短说:为什么HLS不能一个接一个地播放普通的MP4文件?为什么需要将媒体文件分割成.ts段?

详细信息:

我们将MP4文件分段为迷你MP4段(不是TS),每个段大约需要30秒进行测试。它永远不会在任何HLS播放器中播放,只是加载所有段文件然后没有任何反应。

示例MP4细分信息:

Format                      : MPEG-4
Format profile              : Base Media
Codec ID                    : isom
File size                   : 1.44 MiB
Duration                    : 32s 950ms
Overall bit rate            : 366 Kbps
Writing application         : Lavf56.25.101

Video
ID                          : 1
Format                      : AVC
Format/Info                 : Advanced Video Codec
Format profile              : High@L4.1
Format settings, CABAC      : Yes
Format settings, ReFrames   : 6 frames
Codec ID                    : avc1
Codec ID/Info               : Advanced Video Coding
Duration                    : 32s 950ms
Bit rate                    : 230 Kbps
Width                       : 426 pixels
Height                      : 240 pixels
Display aspect ratio        : 16:9
Original display aspect rat : 16:9
Frame rate mode             : Constant
Frame rate                  : 23.976 fps
Color space                 : YUV
Chroma subsampling          : 4:2:0
Bit depth                   : 8 bits
Scan type                   : Progressive
Bits/(Pixel*Frame)          : 0.094
Stream size                 : 925 KiB (63%)
Writing library             : x264 core 142 r2495 6a301b6

Audio
ID                          : 2
Format                      : AAC
Format/Info                 : Advanced Audio Codec
Format profile              : LC
Codec ID                    : 40
Duration                    : 32s 896ms
Bit rate mode               : Constant
Bit rate                    : 129 Kbps
Channel(s)                  : 2 channels
Channel(s)_Original         : 6 channels
Channel positions           : Front: L C R, Side: L R, LFE
Sampling rate               : 48.0 KHz
Compression mode            : Lossy
Stream size                 : 517 KiB (35%)

Master M3U8:

#EXTM3U
#EXT-X-VERSION:7
#EXT-X-INDEPENDENT-SEGMENTS

#EXT-X-STREAM-INF:RESOLUTION=426x240,BANDWIDTH=370000,CODECS="avc1.640015,mp4a.40.2"
240p.m3u8

#EXT-X-STREAM-INF:RESOLUTION=640x360,BANDWIDTH=580000,CODECS="avc1.640015,mp4a.40.2"
360p.m3u8

#EXT-X-STREAM-INF:RESOLUTION=896x504,BANDWIDTH=900000,CODECS="avc1.640015,mp4a.40.2"
480p.m3u8

#EXT-X-STREAM-INF:RESOLUTION=1280x720,BANDWIDTH=1500000,CODECS="avc1.640015,mp4a.40.2"
720p.m3u8

240p.m3u8

#EXTM3U
#EXT-X-VERSION:7
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-TARGETDURATION:34

#EXTINF:33.033033,
240p000.mp4
#EXTINF:33.533534,
240p001.mp4
#EXTINF:24.941608,
240p002.mp4
#EXTINF:28.611945,
240p003.mp4
#EXT-X-ENDLIST

使用HLS.js测试时,会出现此错误:

  

解析错误:没有与找到的内容匹配的demux,无法恢复,   上次媒体错误恢复失败...

Bitmovin Player:加载所有变体的所有片段,从不播放任何变体。停下来。

在Chrome& Firefox在Windows上,Mac上的Safari,Android和iPad浏览器。永远不要在任何一个上工作。我们做错了吗?!

3 个答案:

答案 0 :(得分:1)

虽然传输流段是自我初始化的,但对于fMP4段,通常/通常不是这种情况。因此,您需要将初始化段添加到清单文件中,这是初始化解码器所必需的。这可以使用#EXT-X-MAP:URI标记来完成,如this blog post的图像和下面的示例所示:

#EXTM3U
#EXT-X-TARGETDURATION:4
#EXT-X-VERSION:7
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MAP:URI="init.mp4"

#EXTINF:4.0
segment_0.m4s
#EXTINF:4.0
segment_1.m4s
...
#EXT-X-ENDLIST

我不确定HLS.js,但这应该至少适用于Bitmovin Player。如果不是,我建议使用Bitmovin的支持。

Apple还提供test page with fMP4 HLS(在浏览器中需要本机HLS支持,例如在Safari中),Bitmovin有demo page with fMP4 HLS可用。

答案 1 :(得分:0)

  

为什么HLS不能一个接一个地播放普通的MP4文件?为什么需要将媒体文件分割成.ts段?

MP4文件有一个你真正不想要或不需要的整个容器。理论上,每个片段都可以包含自己的音频和视频轨道,每个轨道都有自己的格式,帧速率,采样率等。您不需要所有这些,而且还需要将视频片段清晰地粘在一起。因此,首先需要一些东西来干净地编码片段。

答案 2 :(得分:0)

FFMPEG现在支持为HLS生成片段MP4。看看https://trac.ffmpeg.org/ticket/5699