将 Live HLS 投射到 Android TV
Posted
技术标签:
【中文标题】将 Live HLS 投射到 Android TV【英文标题】:Casting Live HLS to Android TV 【发布时间】:2018-03-06 13:24:03 【问题描述】:我正在为我的视频应用(最低 API 16)实施 Google Cast,并使用实时 HLS 流。我按照说明 https://codelabs.developers.google.com/codelabs/cast-videos-android/#5 并在步骤 6 中停止。当我点击投射按钮时,会出现投射对话框,我选择我的 Android TV 设备(测试设备 Mibox 3,Android 6),远程播放器正在尝试加载视频,但是HLS 直播视频 我在电视上看到一个大红色标题 SAMPLE。我决定播放示例视频http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8 并再次看到 SAMPLE。如果我再次点击投射按钮,对话框会显示:未选择媒体文件。在本地,我使用 ExoPlayer 播放 HLS 实时视频没有问题。我试过 MediaInfo.STREAM_TYPE_BUFFERED 和 MediaInfo.STREAM_TYPE_LIVE
代码:
private void setupCastListener()
mSessionManagerListener = new SessionManagerListener<CastSession>()
@Override
public void onSessionEnded(CastSession session, int error)
onApplicationDisconnected();
@Override
public void onSessionResumed(CastSession session, boolean wasSuspended)
onApplicationConnected(session);
@Override
public void onSessionResumeFailed(CastSession session, int error)
onApplicationDisconnected();
@Override
public void onSessionStarted(CastSession session, String sessionId)
onApplicationConnected(session);
@Override
public void onSessionStartFailed(CastSession session, int error)
onApplicationDisconnected();
@Override
public void onSessionStarting(CastSession session)
@Override
public void onSessionEnding(CastSession session)
@Override
public void onSessionResuming(CastSession session, String sessionId)
@Override
public void onSessionSuspended(CastSession session, int reason)
private void onApplicationConnected(CastSession castSession)
mCastSession = castSession;
if (clickedChannel != null)
if (isPlaying())
loadRemoteMedia(true);
private void onApplicationDisconnected()
;
private void loadRemoteMedia(boolean autoPlay)
if (mCastSession == null)
return;
RemoteMediaClient remoteMediaClient = mCastSession.getRemoteMediaClient();
if (remoteMediaClient == null)
return;
remoteMediaClient.load(buildMediaInfo(), autoPlay);
private MediaInfo buildMediaInfo()
MediaMetadata mediaMetadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE);
mediaMetadata.putString(MediaMetadata.KEY_TITLE, clickedChannel.getName());
selectedStreamingURL = "http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8";
return new MediaInfo.Builder(selectedStreamingURL)
.setContentType("application/x-mpegURL")
.setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
.setMetadata(mediaMetadata)
.build();
【问题讨论】:
这可能不是解决方案,但尝试将 MediaInfo 内容类型设置为"video/mp4"
。您还在日志中看到任何警告/错误吗?
在他们使用“videos/mp4”的教程中,没有帮助。没有发现远程播放器的错误。
我尝试在教程的示例项目中播放devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8,同样的问题 - SAMPLE 而不是视频。 Android TV 无法播放 HLS?
尝试在我的应用程序中播放示例 commondatastorage.googleapis.com/gtv-videos-bucket/CastVideos/…,它可以正常工作,但在视频顶部再次带有 SAMPLE 标签。谁添加了这个标签?
尝试失败:return new MediaInfo.Builder("devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8") .setContentType("application/vnd.apple.mpegurl") .setStreamType(MediaInfo.STREAM_TYPE_LIVE) .setMetadata(mediaMetadata) .build ();
【参考方案1】:
问题通过改变这个方法解决了
@Override
public CastOptions getCastOptions(Context context)
return new CastOptions.Builder()
.setReceiverApplicationId(CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID)
.build();
【讨论】:
我有很多异常,这里描述了问题github.com/googlecast/CastVideos-android/issues/35以上是关于将 Live HLS 投射到 Android TV的主要内容,如果未能解决你的问题,请参考以下文章
HTTP Live Streaming (HLS) 在 Android 4 上不自适应?
带有谷歌电视的 Chromecast 是不是需要 Android TV 接收器应用程序才能进行投射?