Exoplayer作为谷歌官方推出的替代MediaPlayer播放器,功能强大,可拓展性强,被广泛用于各种音视频使用场景,支持各种常见的格式和场景。Exoplayer支持多种资源读取方式,以MediaSource 的子类开放给开发者使用。
我们常用的有ProgressiveMediaSource、DashMediaSource、HlsMediaSource、ClippingMediaSoutce (片段流)、RtspMediaSource、MergingMediaSource等。那么它们都有什么区别,各自适用什么场景呢?
1. ProgressiveMediaSource
-
特点:用于播放常规的媒体文件,如MP4、WebM等封装格式的文件。
-
使用场景:适用于本地文件播放或通过HTTP/HTTPS协议直接下载播放的视频。
2. DashMediaSource
-
特点:用于播放DASH(Dynamic Adaptive Streaming over HTTP)格式的流媒体。DASH支持自适应码率,可以根据网络状况动态调整视频质量。
-
使用场景:适合需要支持自适应码率的流媒体播放,例如在线视频平台。
3. HlsMediaSource
-
特点:用于播放HLS(HTTP Live Streaming)格式的流媒体。HLS同样支持自适应码率,并且广泛应用于直播和点播场景。
-
使用场景:适用于直播流或需要自适应码率的点播内容。
4. ClippingMediaSource
-
特点:用于剪辑媒体资源,仅播放指定时间段的内容。可以通过设置开始时间和结束时间来实现视频片段的播放。
-
使用场景:适用于需要播放视频片段的场景,例如播放视频的精彩片段。
5. RtspMediaSource
-
特点:用于播放RTSP(Real Time Streaming Protocol)协议的流媒体。RTSP常用于实时视频监控等场景。
-
使用场景:适用于视频监控、实时会议等需要低延迟的实时流媒体。
6. MergingMediaSource
-
特点:用于将多个媒体资源合并播放。例如可以将视频文件和外挂字幕文件合并播放,或者将多个视频流合并。
-
使用场景:适用于需要同时播放视频和字幕,或者需要合并多个媒体流的场景。
7. 其他功能性MediaSource
-
ConcatenatingMediaSource:用于按顺序播放多个
MediaSource
,支持动态添加或删除播放列表中的媒体。 -
LoopingMediaSource:用于循环播放某个媒体资源,可以设置循环次数。
通过这些MediaSource
子类,ExoPlayer能够满足各种复杂的播放需求,开发者可以根据具体场景选择合适的实现方式。
以下是ExoPlayer中常见MediaSource
子类的使用代码示例:
1. ProgressiveMediaSource
用于播放常规的媒体文件(如MP4、WebM等)。
Uri videoUri = Uri.parse("https://example.com/video.mp4");
MediaSource mediaSource = new ExtractorMediaSource.Factory(dataSourceFactory)
.createMediaSource(videoUri);
2. DashMediaSource
用于播放DASH格式的流媒体。
Uri dashUri = Uri.parse("https://example.com/manifest.mpd");
MediaSource mediaSource = new DashMediaSource.Factory(
new DefaultDashChunkSource.Factory(dataSourceFactory),
dataSourceFactory)
.createMediaSource(dashUri);
3. HlsMediaSource
用于播放HLS格式的流媒体。
Uri hlsUri = Uri.parse("https://example.com/playlist.m3u8");
MediaSource mediaSource = new HlsMediaSource.Factory(dataSourceFactory)
.createMediaSource(hlsUri);
4. RtspMediaSource
用于播放RTSP协议的流媒体。
Uri rtspUri = Uri.parse("rtsp://example.com/stream");
MediaSource mediaSource = new RtspMediaSource.Factory()
.createMediaSource(rtspUri);
5. MergingMediaSource
用于将多个媒体资源合并播放,例如视频和外挂字幕。
Uri videoUri = Uri.parse("https://example.com/video.mp4");
Uri subtitleUri = Uri.parse("https://example.com/subtitles.srt");
MediaSource videoSource = new ExtractorMediaSource.Factory(dataSourceFactory)
.createMediaSource(videoUri);
MediaSource subtitleSource = new SingleSampleMediaSource.Factory(dataSourceFactory)
.createMediaSource(subtitleUri, Format.createTextSampleFormat(
"subs", MimeTypes.TEXT_SUBRIP, C.SELECTION_FLAG_DEFAULT, "en"));
MediaSource mergedSource = new MergingMediaSource(videoSource, subtitleSource);
6. ConcatenatingMediaSource
用于按顺序播放多个媒体资源。
Uri firstVideoUri = Uri.parse("https://example.com/video1.mp4");
Uri secondVideoUri = Uri.parse("https://example.com/video2.mp4");
MediaSource firstSource = new ExtractorMediaSource.Factory(dataSourceFactory)
.createMediaSource(firstVideoUri);
MediaSource secondSource = new ExtractorMediaSource.Factory(dataSourceFactory)
.createMediaSource(secondVideoUri);
MediaSource concatenatedSource = new ConcatenatingMediaSource(firstSource, secondSource);
7. LoopingMediaSource
用于循环播放某个媒体资源。
Uri videoUri = Uri.parse("https://example.com/video.mp4");
MediaSource source = new ExtractorMediaSource.Factory(dataSourceFactory)
.createMediaSource(videoUri);
MediaSource loopingSource = new LoopingMediaSource(source); // 无限循环
// 或指定循环次数
MediaSource loopingSourceWithCount = new LoopingMediaSource(source, 3); // 循环3次
8. ClippingMediaSource
用于播放指定时间段的媒体资源。
Uri videoUri = Uri.parse("https://example.com/video.mp4");
MediaSource source = new ExtractorMediaSource.Factory(dataSourceFactory)
.createMediaSource(videoUri);
MediaSource clippedSource = new ClippingMediaSource(source, 10_000_000, 30_000_000); // 播放从10秒到30秒的内容