HLS: multivariant playlist with `FRAME-RATE=0.000` fails with IllegalArgumentException since Format.frameRate must be positive

オープン 初心者向け
#3,540 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 4 日以内に返信

まだ誰も着手していません。

評価

難易度
2/5
見積もり時間
1〜3時間
初心者へのやさしさ
78/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
android, java
領域
api, backend

調査の方向性

issueで示されているFRAME-RATEの解析経路にあるHlsPlaylistParser.parseMultivariantPlaylistから始め、issue #3399で説明されている正でないフレームレートの正規化と比較してください。FRAME-RATE=0.000を設定する提供済みのプレイリストで再現し、その後、HLSパーサーのテストでマルチバリアントプレイリストのカバレッジを確認してください。この値がFormat.NO_VALUEとして扱われ、解析時に例外が発生しなくなれば完了です。

索引モデルが issue の本文から書いたものです。

説明

Version

Media3 1.11.1

More version details

Regression: the same stream plays with Media3 1.5.1. The check was added in 3ae59501e ("Enforce that Format.frameRate is positive"). HlsPlaylistParser on main still passes the raw FRAME-RATE attribute value to Format.Builder.setFrameRate.

Devices that reproduce the issue

Samsung SM-A556E, Android 16. Not device-specific: the failure is in manifest parsing.

Devices that do not reproduce the issue

None known.

Reproducible in the demo app?

Yes (demo app built from the 1.11.1 tag)

Reproduction steps
  1. Play https://player-culturafm.stream.uol.com.br/live/culturafm.m3u8, e.g.
    adb shell am start -a androidx.media3.demo.main.action.VIEW -d "https://player-culturafm.stream.uol.com.br/live/culturafm.m3u8" -n androidx.media3.demo.main/.PlayerActivity
  2. The multivariant playlist loads with HTTP 200 and parsing throws.

The playlist:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=716800,RESOLUTION=960x540,FRAME-RATE=0.000
culturafm_luhd.m3u8?vhost=player-culturafm.stream.uol.com.br
Expected result

The stream plays, with a non-positive FRAME-RATE treated as unknown (Format.NO_VALUE), as it did before 3ae59501e. Other players (web browsers, cliamp on macOS) play this stream.

Actual result

Playback fails with a source error:

E LoadTask: Unexpected exception loading stream
E LoadTask:   java.lang.IllegalArgumentException
E LoadTask:       at com.google.common.base.Preconditions.checkArgument(Preconditions.java:129)
E LoadTask:       at androidx.media3.common.Format$Builder.setFrameRate(Format.java:693)
E LoadTask:       at androidx.media3.exoplayer.hls.playlist.HlsPlaylistParser.parseMultivariantPlaylist(HlsPlaylistParser.java:620)
E LoadTask:       at androidx.media3.exoplayer.hls.playlist.HlsPlaylistParser.parse(HlsPlaylistParser.java:358)
E LoadTask:       at androidx.media3.exoplayer.hls.playlist.HlsPlaylistParser.parse(HlsPlaylistParser.java:77)
E LoadTask:       at androidx.media3.exoplayer.upstream.ParsingLoadable.load(ParsingLoadable.java:225)
E LoadTask:       at androidx.media3.exoplayer.upstream.Loader$LoadTask.run(Loader.java:453)
E ExoPlayerImplInternal: Playback error
E ExoPlayerImplInternal:   androidx.media3.exoplayer.ExoPlaybackException: Source error
E ExoPlayerImplInternal:   Caused by: androidx.media3.exoplayer.upstream.Loader$UnexpectedLoaderException: Unexpected IllegalArgumentException

This is the same class of regression as #3399, which was fixed for decoder output formats by normalizing non-positive frame rates (d582c49ee), but the HLS parser was not covered. A possible fix is to map frameRate <= 0 to Format.NO_VALUE in HlsPlaylistParser.parseMultivariantPlaylist.

Real-world report: armanmaurya/InternetRadio#268.

Media

https://player-culturafm.stream.uol.com.br/live/culturafm.m3u8 (public live radio stream)

Bug Report

Not sent: the failure is deterministic and reproducible from the playlist text above.

主要言語
Java
スター
3.1k
フォーク
1k
平均マージ
8日 8時間
マージ済み PR(30日)
4

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

androidx/media のほかの issue

androidx/media の issue をすべて見る

似ている issue

Java の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。