长话短说:为什么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%)
The 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
240 p.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 &Windows上的Firefox, Mac上的Safari, Android和iPad上的浏览器。对它们都不起作用。我们做错什么了吗?!
虽然传输流段是自初始化的,但这通常/经常不是fMP4段的情况。因此,您需要将初始化段添加到清单文件中,这是初始化解码器所需的。这可以使用#EXT-X-MAP:URI标签来完成,如下面的示例所示:
#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播放器。如果没有,我建议使用Bitmovin的支持。
Apple还提供了一个带有fMP4 HLS的测试页面(需要浏览器支持本地HLS,例如在Safari中),Bitmovin有一个带有fMP4 HLS的演示页面。
为什么HLS不能一个接一个地播放普通的MP4文件?为什么需要将媒体文件分割成。ts段?
MP4文件有一个你并不真正想要或需要的整个容器。从理论上讲,每个片段都可以包含自己数量的音频和视频轨道,每个都有自己的格式、帧率、采样率等。你不需要所有这些,你还需要把视频片段清晰地粘在一起。因此,首先需要一些东西来清晰地编码片段。
FFMPEG现在支持生成HLS的片段MP4。看看https://trac.ffmpeg.org/ticket/5699