【问题标题】:Android - Chromecast subtitles NanoHttpdAndroid - Chromecast 字幕 NanoHttpd
【发布时间】:2016-09-11 15:48:40
【问题描述】:

我成功地将带有 NanoHttpd 的视频从我的 Android 应用程序流式传输到本地 IP 以在 chromecast 上播放。 现在我想添加字幕,我的 sdcard 上有本地 .vtt 文件,我也试图在不同端口上的 NanoHttpd 上对其进行蒸汽处理。 反正我看不到字幕。我在视频和字幕本地 ips 上正确实现了 CORS。 如果我在浏览器上键入字幕 ip,vtt 文件将成功显示。

当我在 MediaInfo 上设置字幕时,我的代码被剪掉了:

  MediaTrack englishSubtitle = new MediaTrack.Builder(1 /* ID */,
                MediaTrack.TYPE_TEXT)
                .setName("English Subtitle")
                .setSubtype(MediaTrack.SUBTYPE_SUBTITLES)
                .setContentId(ipdeviceForSubs)
                .setLanguage("en-US")
                .build();

        MediaMetadata mediaMetadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE);
        mediaMetadata.putString(MediaMetadata.KEY_TITLE, contentUri.getLastPathSegment());

        mSelectedMedia = new MediaInfo.Builder(ipdeviceForVideo != null ? ipdeviceForVideo : contentUri.toString())
                .setContentType("video/*")
                .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
                .setMetadata(mediaMetadata)
                .setMediaTracks(Arrays.asList(englishSubtitle))
                .build();

这是我的 NanoHttpd 字幕网络服务器实现

  public class WebserverSubtitles extends NanoHTTPD {
    public WebserverSubtitles() throws IOException {

        super(8081);
    }


    @Override
    @SuppressWarnings("deprecation")
    public NanoHTTPD.Response serve(String uri, Method method, Map<String, String> headers, Map<String, String> parms, Map<String, String> files) {
        try {         
            FileInputStream localFileInputStream = new FileInputStream("/sdcard/Download/v.vtt");
            NanoHTTPD.Response localResponse = new NanoHTTPD.Response(NanoHTTPD.Response.Status.OK, "text/vtt", localFileInputStream);
            localResponse.addHeader("Access-Control-Allow-Origin", "*");
            localResponse.addHeader("content-type", "text/vtt");
            return localResponse;
        } catch (Exception localException) {
            localException.getMessage();
        }
        return null;
    }

}

感谢任何帮助,谢谢

【问题讨论】:

  • 在接收器上开启登录后,在控制台看到什么?
  • 我目前正在使用默认接收器,无法查看日志
  • 如果我使用它作为我的 mediatrack 字幕的 contentId 工作正常:commondatastorage.googleapis.com/gtv-videos-bucket/CastVideos/… 我在我的 sd 上复制了完全相同的文件,使用具有 CORS 支持的 NanoHttpd 进行流式传输,什么都没有.. NanoHttpd 网络服务的服务方法不是事件调用。如果我在浏览器中打开相同的本地地址,vtt 文件会正确显示并调用服务方法。看起来本地字幕地址从未被 cast api 调用。
  • 我怀疑这两个问题之一可能是问题:CORS 没有正确实现(curl -v 为视频和轨道的标题说明了什么)?或者在将曲目添加到混音中时它可能需要 https 的其他可能性(然后在您的场景中会失败)。您可以注册一个样式接收器以查看日志,这应该有助于识别问题。
  • 我试过 curl -v MYURL 并且我得到了这个标题: * 重建 URL 到:192.168.1.101:8081/ * 尝试 192.168.1.101... * 连接到 192.168.1.101 (192.168.1.101)端口 8081 (#0) > GET / HTTP/1.1 > 主机:192.168.1.101:8081 > 用户代理:curl/7.43.0 > 接受:/ >

标签: android casting cors


【解决方案1】:
resp= newFixedLengthResponse(Response.Status.OK, MIME_PLAINTEXT ,"success");
        resp.addHeader("Access-Control-Allow-Origin", "*");
        resp.addHeader("Access-Control-Max-Age", "3628800");
        resp.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, OPTIONS");
        resp.addHeader("Access-Control-Allow-Headers", "X-Requested-With");
        resp.addHeader("Access-Control-Allow-Headers", "Authorization");




        resp.setChunkedTransfer(true);
return resp;

你必须像上面那样在 NanoHttpd 服务器上添加 cors 支持

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 2014-05-31
    • 2016-03-22
    • 1970-01-01
    • 2019-09-12
    • 2013-10-09
    • 1970-01-01
    相关资源
    最近更新 更多