android - Exoplayer HLS 无限缓冲
问题描述
我在播放流时遇到问题,这是来自 EventLogger 的数据:
D/EventLogger: tracks [eventTime=16.68, mediaPos=5.04, window=0, period=0
2020-12-15 14:26:21.803 D/EventLogger: MediaCodecVideoRenderer [
2020-12-15 14:26:21.803 D/EventLogger: Group:0, adaptive_supported=N/A [
2020-12-15 14:26:21.804 D/EventLogger: [X] Track:0, id=0, mimeType=video/avc, bitrate=1470000, codecs=avc1.4D401E, res=720x576, fps=25.0, supported=YES
2020-12-15 14:26:21.804 D/EventLogger: ]
2020-12-15 14:26:21.804 D/EventLogger: Metadata [
2020-12-15 14:26:21.804 D/EventLogger: HlsTrackMetadataEntry
2020-12-15 14:26:21.804 D/EventLogger: ]
2020-12-15 14:26:21.804 D/EventLogger: ]
2020-12-15 14:26:21.804 D/EventLogger: FfmpegAudioRenderer [
2020-12-15 14:26:21.804 D/EventLogger: Group:0, adaptive_supported=N/A [
2020-12-15 14:26:21.804 D/EventLogger: [X] Track:0, id=6128/4, mimeType=audio/mpeg-L2, channels=2, sample_rate=48000, language=srb, supported=YES
2020-12-15 14:26:21.804 D/EventLogger: ]
2020-12-15 14:26:21.804 D/EventLogger: ]
2020-12-15 14:26:21.804 D/EventLogger: MediaCodecAudioRenderer []
2020-12-15 14:26:21.804 D/EventLogger: TextRenderer []
2020-12-15 14:26:21.804 D/EventLogger: MetadataRenderer [
2020-12-15 14:26:21.804 D/EventLogger: Group:0, adaptive_supported=N/A [
2020-12-15 14:26:21.804 D/EventLogger: [X] Track:0, id=null, mimeType=application/id3, supported=YES
2020-12-15 14:26:21.804 D/EventLogger: ]
2020-12-15 14:26:21.804 D/EventLogger: ]
2020-12-15 14:26:21.804 D/EventLogger: CameraMotionRenderer []
2020-12-15 14:26:21.804 D/EventLogger: ]
2020-12-15 14:26:21.808 D/EventLogger: downstreamFormat [eventTime=16.69, mediaPos=5.04, window=0, period=0, id=0, mimeType=null, bitrate=1470000, res=1048x576, fps=25.0]
2020-12-15 14:26:21.808 D/EventLogger: videoInputFormat [eventTime=16.69, mediaPos=5.04, window=0, period=0, id=0, mimeType=video/avc, bitrate=1470000, codecs=avc1.4D401E, res=720x576, fps=25.0]
2020-12-15 14:26:21.823 D/EventLogger: audioDecoderInitialized [eventTime=16.70, mediaPos=5.04, window=0, period=0, ffmpegLavc58.54.100-mp3]
2020-12-15 14:26:21.823 D/EventLogger: audioInputFormat [eventTime=16.70, mediaPos=5.04, window=0, period=0, id=6128/4, mimeType=audio/mpeg-L2, channels=2, sample_rate=48000, language=srb]
2020-12-15 14:26:21.832 D/EventLogger: audioSessionId [eventTime=16.71, mediaPos=5.04, window=0, period=0, 1857]
2020-12-15 14:26:21.997 D/EventLogger: loading [eventTime=16.88, mediaPos=5.04, window=0, period=0, false]
2020-12-15 14:26:27.782 D/EventLogger: timeline [eventTime=22.66, mediaPos=0.04, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE
2020-12-15 14:26:27.782 D/EventLogger: period [?]
2020-12-15 14:26:27.782 D/EventLogger: window [21.24, true, true]
2020-12-15 14:26:27.782 D/EventLogger: ]
2020-12-15 14:26:33.827 D/EventLogger: timeline [eventTime=28.71, mediaPos=-4.96, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE
2020-12-15 14:26:33.827 D/EventLogger: period [?]
2020-12-15 14:26:33.827 D/EventLogger: window [21.48, true, true]
2020-12-15 14:26:33.827 D/EventLogger: ]
2020-12-15 14:26:39.872 D/EventLogger: timeline [eventTime=34.75, mediaPos=-9.96, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE
2020-12-15 14:26:39.872 D/EventLogger: period [?]
2020-12-15 14:26:39.872 D/EventLogger: window [21.44, true, true]
2020-12-15 14:26:39.872 D/EventLogger: ]
以下是播放器的设置方式:
DataSource.Factory dataSourceFactory = Tools.createDataSourceFactory(getActivity(), Util.getUserAgent(getActivity(), getActivity().getPackageName()));
DefaultRenderersFactory defaultRenderersFactory = new DefaultRenderersFactory(getActivity())
.setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER);
DefaultTrackSelector defaultTrackSelector = new DefaultTrackSelector(getActivity());
factory = new HlsMediaSource.Factory(dataSourceFactory)
.setAllowChunklessPreparation(true);
player = new SimpleExoPlayer
.Builder(getActivity(), defaultRenderersFactory)
.setTrackSelector(defaultTrackSelector)
.build();
player.addAnalyticsListener(new EventLogger(defaultTrackSelector));
binding.playerView.setPlayer(player);
public static DefaultDataSourceFactory createDataSourceFactory(Context context, String
userAgent) {
// Default parameters, except allowCrossProtocolRedirects is true
DefaultHttpDataSourceFactory httpDataSourceFactory = new DefaultHttpDataSourceFactory(
userAgent,
null,
DefaultHttpDataSource.DEFAULT_CONNECT_TIMEOUT_MILLIS,
DefaultHttpDataSource.DEFAULT_READ_TIMEOUT_MILLIS,
true /* allowCrossProtocolRedirects */
);
return new DefaultDataSourceFactory(
context,
null,
httpDataSourceFactory
);
}
我发现这个和另一个在同一个播放器中工作的具有相同编解码器(avc + mpeg L2 音频)的流之间的唯一区别是“mediaPos”在这个流中是负的,并且逐渐减少而不是增加。
相同的流适用于 VLC,还有另一个使用 ExoPlayer 的应用程序(我没有源代码)。
我试过禁用 ffmpeg 扩展 - 它没有任何改变。
我正在使用 ExoPlayer 2.12.2 版本。
它在 ExoPlayer 演示应用程序中也不起作用。
解决方案
推荐阅读
- javascript - 模式以允许 2 个字母数字之间的可选连字符并限制空格
- ruby - XLS 抛出 java.lang.ClassNotFoundException:org.apache.poi.hssf.util.HSSFColor$BLACK
- sql - 根据逗号分隔的字符串列将一行拆分为多行
- javascript - 在 Maven 中编写脚本以设置项目属性
- r - 使用百分位数和相应值在 R 中绘制分布
- sql - SQL在使用pivot后添加多个计算行
- java - 格式化输出到文件
- java - 使用 swagger-code-gen-cli jar 生成 pojo 类时,扩展类中的字段丢失
- php - 无法使用 Imagemagick 读取 pdf 文件
- botframework - 如何在 PromptAttribute 文本中添加换行符?