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
相关产品推荐
相关产品推荐

