android - Trouble getting WebVTT captions/subtitles working on Chromecast -


i'm working on chromecast app android, , trying webvtt captions/subtitles working.

i instantiate mediatrack object follows:

            mediatrack track = new mediatrack.builder(0, mediatrack.type_text)                 .setcontentid("http://www.example.com/example.vtt")                 .setsubtype(mediatrack.subtype_subtitles)                 .setcontenttype("iso-8859-1")                 .setlanguage(locale.english)                 .setname("english")                 .build(); 

and add list.

i instantiate mediainfo using builder, , include reference list of tracks using .setmediatracks method:

mediainfo.builder builder = new mediainfo.builder("http://www.example.com/example.m3u8")                 .setstreamtype(mediainfo.stream_type_buffered)                 .setcontenttype("application/vnd.apple.mpegurl")                 .setmetadata(moviemetadata)                 .setmediatracks(mediatracks).build(); 

in app start castcontrolleractivity comes companion library:

mcastmanager.startcastcontrolleractivity(this, mselectedmedia, position, autoplay); 

after i've done set active media track (only 1 in case), , text track style:

long [] activetracks = new long[1]; activetracks[0] = 0l; mcastmanager.getremotemediaplayer()         .setactivemediatracks(mcastmanager.getgoogleapiclient(), activetracks)         .setresultcallback(new mediaresultcallback()); mcastmanager.getremotemediaplayer().settexttrackstyle(         mcastmanager.getgoogleapiclient(),         texttrackstyle.fromsystemsettings(getbasecontext())); 

when playing clip containing subtitles console shows following:

[775.223s] [cast.receiver.mediamanager] many track ids cast_receiver.js:18 [775.232s] [cast.receiver.mediamanager] invalid track ids cast_receiver.js:18 [775.238s] [cast.receiver.mediamanager] sending error: invalid_request invalid_params  

and status code in returned resultcallback service_missing - though google play services 5.0.89 installed on both android 4.4 devices i'm using when developing. subtitles hosted cors headers.

any ideas or pointers?

this due fact ccl has not yet been updated handle tracks (it upcoming feature). ccl builds bundle mediainfo , uses bundle when firing castcontrolleractivity pass mediainfo (mediainfo not parcelable, hence have use wrapper , bundle 1 solution). in exiting ccl, when creates bundle, doesn't consider tracks, hence bundle doesn't have tracks info. result, practically loading media (since happens in castcontrolleractivity) doesn't have tracks info, hence error see.

till tracks support gets added ccl, can following. in utils class, update 2 methods frommediainfo() , tomediainfo() following codes in ccl itself:

private static final string key_track_id = "track-id"; private static final string key_track_content_id = "track-custom-id"; private static final string key_track_name = "track-name"; private static final string key_track_type = "track-type"; private static final string key_track_subtype = "track-subtype"; private static final string key_track_language = "track-language"; private static final string key_track_custom_data = "track-custom-data"; private static final string key_tracks_data = "track-data";  public static bundle frommediainfo(mediainfo info) {     if (null == info) {         return null;     }      mediametadata md = info.getmetadata();     bundle wrapper = new bundle();     wrapper.putstring(mediametadata.key_title, md.getstring(mediametadata.key_title));     wrapper.putstring(mediametadata.key_subtitle, md.getstring(mediametadata.key_subtitle));     wrapper.putstring(key_url, info.getcontentid());     wrapper.putstring(mediametadata.key_studio, md.getstring(mediametadata.key_studio));     wrapper.putstring(key_content_type, info.getcontenttype());     wrapper.putint(key_stream_type, info.getstreamtype());     if (!md.getimages().isempty()) {         arraylist<string> urls = new arraylist<string>();         (webimage img : md.getimages()) {             urls.add(img.geturl().tostring());         }         wrapper.putstringarraylist(key_images, urls);     }     jsonobject customdata = info.getcustomdata();     if (null != customdata) {         wrapper.putstring(key_custom_data, customdata.tostring());     }      if (null != info.getmediatracks() && !info.getmediatracks().isempty()) {         try {             jsonarray jsonarray = new jsonarray();             (mediatrack mt : info.getmediatracks()) {                 jsonobject jsonobject = new jsonobject();                 jsonobject.put(key_track_name, mt.getname());                 jsonobject.put(key_track_content_id, mt.getcontentid());                 jsonobject.put(key_track_id, mt.getid());                 jsonobject.put(key_track_language, mt.getlanguage());                 jsonobject.put(key_track_type, mt.gettype());                 jsonobject.put(key_track_subtype, mt.getsubtype());                 if (null != mt.getcustomdata()) {                     jsonobject.put(key_track_custom_data, mt.getcustomdata().tostring());                 }                 jsonarray.put(jsonobject);             }             wrapper.putstring(key_tracks_data, jsonarray.tostring());         } catch (jsonexception e) {             loge(tag, "frommediainfo(): failed convert tracks data json", e);         }     }      return wrapper; }  public static mediainfo tomediainfo(bundle wrapper) {     if (null == wrapper) {         return null;     }      mediametadata metadata = new mediametadata(mediametadata.media_type_movie);      metadata.putstring(mediametadata.key_subtitle,             wrapper.getstring(mediametadata.key_subtitle));     metadata.putstring(mediametadata.key_title, wrapper.getstring(mediametadata.key_title));     metadata.putstring(mediametadata.key_studio, wrapper.getstring(mediametadata.key_studio));     arraylist<string> images = wrapper.getstringarraylist(key_images);     if (null != images && !images.isempty()) {         (string url : images) {             uri uri = uri.parse(url);             metadata.addimage(new webimage(uri));         }     }     string customdatastr = wrapper.getstring(key_custom_data);     jsonobject customdata = null;     if (!textutils.isempty(customdatastr)) {         try {             customdata = new jsonobject(customdatastr);         } catch (jsonexception e) {             loge(tag, "failed deserialize custom data string: custom data= "                     + customdatastr, e);         }     }     list<mediatrack> mediatracks = null;     if (null != wrapper.getstring(key_tracks_data)) {         try {             jsonarray jsonarray = new jsonarray(wrapper.getstring(key_tracks_data));             mediatracks = new arraylist<mediatrack>();             if (null != jsonarray && jsonarray.length() > 0) {                 (int = 0; < jsonarray.length(); i++) {                     jsonobject jsonobj = (jsonobject) jsonarray.get(i);                     mediatrack.builder builder = new mediatrack.builder(                             jsonobj.getlong(key_track_id), jsonobj.getint(key_track_type));                     if (jsonobj.has(key_track_name)) {                         builder.setname(jsonobj.getstring(key_track_name));                     }                     if (jsonobj.has(key_track_subtype)) {                         builder.setsubtype(jsonobj.getint(key_track_subtype));                     }                     if (jsonobj.has(key_track_content_id)) {                         builder.setcontentid(jsonobj.getstring(key_track_content_id));                     }                     if (jsonobj.has(key_track_language)) {                         builder.setlanguage(jsonobj.getstring(key_track_language));                     }                     if (jsonobj.has(key_tracks_data)) {                         builder.setcustomdata(                                 new jsonobject(jsonobj.getstring(key_tracks_data)));                     }                     mediatracks.add(builder.build());                 }             }         } catch (jsonexception e) {             loge(tag, "failed build media tracks wrapper bundle", e);         }     }     return new mediainfo.builder(wrapper.getstring(key_url))             .setstreamtype(wrapper.getint(key_stream_type))             .setcontenttype(wrapper.getstring(key_content_type))             .setmetadata(metadata)             .setcustomdata(customdata)             .setmediatracks(mediatracks)             .build(); } 

this should solve issue.


Comments

Popular posts from this blog

javascript - Jquery show_hide, what to add in order to make the page scroll to the bottom of the hidden field once button is clicked -

javascript - Highcharts multi-color line -

javascript - Enter key does not work in search box -