

Http Live Streamingのマニフェストファイルで例えば

[code]

    http://184.72.239.149/vod/smil:BigBuckBunny.smil/playlist.m3u8
    
[/code]

の中の記述で

[code]

    #EXT-X-TARGETDURATION:7
    
[/code]

と

[code]

    #EXTINF:6.25,
    
[/code]

があります。

EXT-X-TARGETDURATIONは各セグメントのターゲット秒数を示しているのかと推察しますが、EXTINFはセグメントの実際の  
秒数なのでしょうか？また6.25と中途半端な数字なのはどういった理由でしょうか？

質問の意図としては、この#EXT-X-
TARGETDURATIONと#EXTINFときっちり10秒にしたライブ配信を行った試験をしていますが、なぜか途中で止まります（不定期で）。実は、この中途半端な秒数に解決の糸口があるのではと思い質問させていただきました。

ご存知の方はご教示お願いします。


CC BY-SA 3.0
2017-07-19T14:55:21.897
36506
2017-07-19T16:31:42.770
8593
question
hls
Http Live Streamingのマニフェストファイル(m3u8)の#EXT-X-TARGETDURATIONと#EXTINFについて


[仕様](https://datatracker.ietf.org/doc/html/draft-pantos-http-live-
streaming-23#section-4.3.2.1)によれば、

> ### [4.3.2.1. EXTINF](https://datatracker.ietf.org/doc/html/draft-pantos-
> http-live-streaming-23#section-4.3.2.1)
>
> The EXTINF tag specifies the duration of a Media Segment. It applies  
>  only to the next Media Segment. This tag is REQUIRED for each Media  
>  Segment.

> ### [4.3.3.1. EXT-X-
> TARGETDURATION](https://datatracker.ietf.org/doc/html/draft-pantos-http-
> live-streaming-23#section-4.3.3.1)
>
> The EXT-X-TARGETDURATION tag specifies _**the maximum Media Segment  
>  duration**_. The EXTINF duration of each Media Segment in the Playlist  
>  file, when rounded to the nearest integer, MUST be less than or equal  
>  to the target duration; _**longer segments can trigger playback stalls  
>  or other errors**_.

ということで、概略すれば`EXTINF`はセグメントの実時間、`EXT-X-TARGETDURATION`はセグメントの実時間の最大値を示します。

一般的に言って、動画コーデックが任意の動画を指定の時間できっちり分割できるとは限りません。たとえば、10秒のセグメントと指定したとして、コーデックあるいはエンコーダの都合上、セグメントに含まれる長さは10.00000....秒とはならずに、たとえば10.001秒とかになったりするわけです。  
例として[ffmpegで動画セグメントを生成する処理を`-segment_time 10`](https://ffmpeg.org/ffmpeg-
formats.html#segment_002c-stream_005fsegment_002c-ssegment)で実行すると、segment
listは以下のようになります。

[code]

    #EXTM3U
    #EXT-X-VERSION:3
    #EXT-X-MEDIA-SEQUENCE:0
    #EXT-X-ALLOW-CACHE:YES
    #EXT-X-TARGETDURATION:12
    #EXTINF:10.010000,
    test.000.ts
    #EXTINF:10.610600,
    test.001.ts
    #EXTINF:5.343667,
    test.002.ts
    #EXT-X-ENDLIST
    
[/code]

各セグメントに含まれる動画の時間は、前述の理由により指定値である10秒より多少 **前後**
します。ffmpegは安全策として、指定値10に対して`EXT-X-
TARGETDURATION`を12としている意味は、引用のとおりこれがセグメントの最大長を示すものだからです。対して`EXTINF`は実際のセグメントの長さを示しており、プレイヤーはこれに基づき動画を取得/再生するものとされています。

結論としては、もし

> この#EXT-X-TARGETDURATIONと#EXTINFときっちり10秒にしたライブ配信

が本当にできているならば、すなわちセグメントの長さがまったく完全に10秒に正しく分割されているならば、仕様上では問題が起こりません。しかしながら、たとえば動画末尾のセグメントを考えてみると、これが10秒にきっちりなる場合というのは、動画全体の長さがきっちり10の倍数秒である場合に限られます。そういうシステムであればいいのですが、一般的にいってこれを仮定して（あるいは仕様として）設計することは無意味に条件がついて面倒です。

> なぜか途中で止まります

というのも原因はこれではないかと思われます。もし`EXT-X-
TARGETDURATION`が10とされているならば、各セグメントは少なくとも10秒以下でなければなりません。しかし、10秒を指定して分割した場合、繰り返しになりますが10秒を超えるセグメントも存在しうるわけです。このとき、
_longer segments can trigger playback stalls or other errors_ に該当することになります。


CC BY-SA 3.0
2017-07-19T16:31:42.770
36508
2017-07-19T16:31:42.770
2021-10-07T07:24:50.413
-1
36506
answer