将 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 接收器应用程序才能进行投射?

我是不是需要注册 Android TV 才能接收投射?

将 Google Cast 集成到 Android TV 应用中

业余 - 直播源

将视频转换为 HLS(HTTP Live Streaming) 协议格式文件