ffmpeg - HLS MP4 独立段

标签 ffmpeg mp4 http-live-streaming 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              : <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="074f6e606f474b332936" rel="noreferrer noopener nofollow">[email protected]</a>
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 进行测试时,出现以下错误:

Parsing Error:no demux matching with content found,cannot recover, last media error recovery failed ...

Bitmovin Player:加载所有变体的所有片段,并且从不播放其中任何一个。停下来吧。

在 Windows 上的 Chrome 和 Firefox、Mac 上的 Safari、Android 和 iPad 浏览器上进行了测试。对它们中的任何一个都不起作用。我们做错了什么吗?!

最佳答案

虽然传输流段是自初始化的,但 fMP4 段通常/经常不是这种情况。因此,您需要将初始化段添加到 list 文件中,这是初始化解码器所需的。这可以使用 #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 播放器。如果没有,我建议使用 Bitmovin 的支持。

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

关于ffmpeg - HLS MP4 独立段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39025603/

相关文章:

ios - 暂停实时 HLS 流

ffmpeg - 使用 FFmpeg 实现 HLS

ffmpeg - 如何选择段序起始号?

ios - 从 ffmpeg 创建的 Mp4 文件可以在模拟器/PC 浏览器上播放,但不能在真实设备中的 iOS 应用程序/safari 上播放

Android ffmpeg 简单的 JNI 包装器

swift - 使用 AVMutableComposition 和 AVAssetExportSession 创建的 MP4 视频在 Quicktime 中工作,但在所有其他视频工具中显示损坏

ffmpeg - 如何使用 FFmpeg 连接两个 MP4 文件?

android - Galaxy S3 上的 HLS 流式传输

ffmpeg - 输出文件为空,未编码任何内容(如果使用,请检查 -ss/-t/-frames 参数)

ubuntu - 将 3gp moov atom 从一个文件复制到另一个文件