You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ExoPlayer/Media3播放HLS直播时音视频无法同时加载求助

HLS直播流随机仅加载音频或视频问题排查求助

我长期无法正常播放HLS直播流,未找到同类案例。加载直播流后随机仅显示音频或视频,无法同时加载。

已尝试多种修复方式,但均无效:

  • 使用MergeDatasource处理单个URL(仅mime类型不同);
  • 设置TrackSelector参数:
    setAllowMultipleAdaptiveSelections(true)
    setAllowVideoMixedMimeTypeAdaptiveness(true)
    setAllowAudioMixedMimeTypeAdaptiveness(true)
    
  • 重写逻辑手动选择音轨;

以下为详细过程:

直播流信息

获取的直播流URL:
https://xyz.abc.com/hls-aes/event/1120190/3/0/livepkgr_e208/230622_1008S415_0345_XYZ/280-450-825/pl.m3u8?pcode=c115&uh=3cc49d68fb4c9b05cec31627a8c0f6ef&base=c115-live-geo900-xyz-hls.secure.footprint.net%2fhls-live&etime=20230622203703&grs=g111&key=ABCDEF

获取到的manifest内容类型为application/vnd.apple.mpegurl,内容如下:

#EXTM3U
#EXT-X-MEDIA-SEQUENCE:30435
#EXT-X-ALLOW-CACHE:NO
#EXT-X-VERSION:2
#EXT-X-TARGETDURATION:2
#EXT-X-KEY:METHOD=AES-128,URI="https://abc.xyz.com/hls-aes/key/1120190/3/0/101/key.bin",IV=ABCDEFGH
#EXTINF:2,
Num30435.ts
#EXTINF:2,
Num30436.ts
#EXTINF:2,
Num30437.ts
#EXTINF:2,
Num30438.ts
#EXTINF:2,
Num30439.ts

下载的Num30435.ts内容类型为video/MP2T。

异常日志

仅加载音频时的日志

timeline `[eventTime=0.69, mediaPos=4.00, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE] period [?] window [10.00, seekable=true, dynamic=true]`

audioEnabled `[eventTime=0.91, mediaPos=4.00, window=0, period=0]`
tracks `[eventTime=0.91, mediaPos=4.00, window=0, period=0]`

group
- [X] Track:0, id=0, mimeType=audio/mp4a-latm, bitrate=280000, channels=1, sample_rate=22050, supported=YES
- [X] Track:1, id=1, mimeType=audio/mp4a-latm, bitrate=450000, channels=1, sample_rate=22050, supported=YES
- [X] Track:2, id=2, mimeType=audio/mp4a-latm, bitrate=825000, channels=1, sample_rate=22050, supported=YES

group
- [X] Track:0, id=null, mimeType=application/id3, supported=YES

Metadata
- HlsTrackMetadataEntry
downstreamFormat `[eventTime=1.12, mediaPos=4.00, window=0, period=0, id=2, mimeType=null, bitrate=825000]`
audioDecoderInitialized `[eventTime=1.34, mediaPos=4.00, window=0, period=0, c2.android.aac.decoder]`
audioInputFormat `[eventTime=1.34, mediaPos=4.00, window=0, period=0, id=2, mimeType=audio/mp4a-latm, bitrate=825000, codecs=mp4a.40.2, channels=1, sample_rate=22050]`
state `[eventTime=1.59, mediaPos=4.00, window=0, period=0, READY]`
isPlaying `[eventTime=1.60, mediaPos=4.00, window=0, period=0, true]`
timeline `[eventTime=3.27, mediaPos=3.55, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE]`
- period [?]
- window [10.00, seekable=true, dynamic=true]

仅加载视频时的日志

videoEnabled `[eventTime=0.53, mediaPos=4.00, window=0, period=0]`
tracks `[eventTime=0.53, mediaPos=4.00, window=0, period=0]`

group
- [X] Track:0, id=0, mimeType=video/avc, bitrate=280000, supported=YES
- [X] Track:1, id=1, mimeType=video/avc, bitrate=450000, supported=YES
- [X] Track:2, id=2, mimeType=video/avc, bitrate=825000, supported=YES

group
- [ ] Track:0, id=1/8219, mimeType=application/cea-608, supported=YES

group
- [X] Track:0, id=null, mimeType=application/id3, supported=YES

Metadata
- HlsTrackMetadataEntry
downstreamFormat `[eventTime=0.71, mediaPos=4.00, window=0, period=0, id=2, mimeType=null, bitrate=825000]`
videoDecoderInitialized `[eventTime=1.07, mediaPos=4.00, window=0, period=0, c2.qti.avc.decoder]`
videoInputFormat `[eventTime=1.08, mediaPos=4.00, window=0, period=0, id=2, mimeType=video/avc, bitrate=825000, codecs=avc1.4D401F, res=1024x576]`
videoSize `[eventTime=1.11, mediaPos=4.00, window=0, period=0, 1024, 576]`
renderedFirstFrame `[eventTime=1.11, mediaPos=4.00, window=0, period=0, Surface(name=null)/@0xda67faf]`
state `[eventTime=1.18, mediaPos=4.00, window=0, period=0, READY]`
isPlaying `[eventTime=1.18, mediaPos=4.00, window=0, period=0, true]`

相关代码

val trackSelector = DefaultTrackSelector(this@VideoPlayerActivity).apply {
    setParameters(buildUponParameters()
        .setAllowMultipleAdaptiveSelections(true)
        .setAllowVideoMixedMimeTypeAdaptiveness(true)
        .setAllowAudioMixedMimeTypeAdaptiveness(true)
    )
}
player = ExoPlayer.Builder(this@VideoPlayerActivity).apply {
    setSeekBackIncrementMs(durationInMs)
    setSeekForwardIncrementMs(durationInMs)
    setTrackSelector(trackSelector)
}.build().apply {
    playerExo.player = this
    addAnalyticsListener(EventLogger())
    addListener(playerListener)
    playWhenReady = isPlayerPlaying
    seekTo(currentWindow, playbackPosition)
    stream?.let {
        val mediaDataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory().apply {
            setUserAgent(
                Util.getUserAgent(
                    this@VideoPlayerActivity,
                    "MY_APP_NAME"
                )
            )
            val bandwidthMeter = DefaultBandwidthMeter.Builder(this@VideoPlayerActivity)
                .setResetOnNetworkTypeChange(false)
                .build()
            setTransferListener(bandwidthMeter)
        }
        val hlsOtherExtractorFactory: HlsExtractorFactory = DefaultHlsExtractorFactory(
            DefaultTsPayloadReaderFactory.FLAG_ALLOW_NON_IDR_KEYFRAMES, true
        )

        val mediaSource: MediaSource = HlsMediaSource.Factory(mediaDataSourceFactory)
            .setAllowChunklessPreparation(false)
            .setExtractorFactory(hlsOtherExtractorFactory)
            .createMediaSource(
                MediaItem.Builder()
                    .setUri(it)
                    .setMimeType(MimeTypes.APPLICATION_M3U8)
                    //.setMimeType(MimeTypes.VIDEO_MP2T)
                    .build()
            )

        setMediaSource(mediaSource)
        prepare()
    }
}

环境信息

  • 依赖版本:ExoPlayer 2.18.7、Media3 1.0.2,均出现相同问题
  • 测试设备:Huawei P9、One Plus 10T、Samsung M12 Galaxy
  • 对比情况:旧系统VideoView可正常播放该直播流

内容的提问来源于stack exchange,提问作者Sivik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 09:27:03