{"type":"rich","version":"1.0","provider_name":"phorkie","provider_url":"https:\/\/p.cweiske.de\/","title":"Android\/Lineage OS and Screen mirroring (\"Cast\")","author_name":"Christian Weiske","cache_age":86400,"width":900,"height":900,"html":"<!-- embedding all files of https:\/\/p.cweiske.de\/669 -->\n<link rel=\"stylesheet\" href=\"https:\/\/p.cweiske.de\/css\/embed.css\"\/>\n<div class=\"phork\" id=\"669\">\n    <div class=\"phork-file\">\n <div class=\"phork-content\">\n  \n<div class=\"document\">\n\n\n<p>Android has native screen mirroring capabilities (when pulling down the status bar, there is a &quot;cast&quot; icon).<\/p>\n<p>It uses for two technologies:<\/p>\n<ul class=\"simple\">\n<li>Miracast (WiFi Display)<\/li>\n<li>Google Cast (Chromecast protocols CASTv1 and CASTv2)<\/li>\n<\/ul>\n<p><a class=\"reference external\" href=\"https:\/\/en.wikipedia.org\/wiki\/Miracast\">Miracast<\/a> is an open standard, Google Cast is proprietary.<\/p>\n<p>Google Cast requires &quot;gapps&quot; on LineageOS. (proprietary google library)<\/p>\n<div class=\"section\" id=\"id1\">\n<h1>Miracast<\/h1>\n<ul class=\"simple\">\n<li>Android 4.4 (2013) introduced support for Miracast<\/li>\n<li>Android 6 (2015) already removed support for Miracast on some Nexus devices<\/li>\n<li>Android 9 (2018) (Android Pie) has no more source code for Miracast since Google removed support for it<ul>\n<li><a class=\"reference external\" href=\"https:\/\/www.reddit.com\/r\/LineageOS\/comments\/bqh9na\/opo_on_pie_casten_does_not_work_anymore\/eo4oyhd\/\">https:\/\/www.reddit.com\/r\/LineageOS\/comments\/bqh9na\/opo_on_pie_casten_does_not_work_anymore\/eo4oyhd\/<\/a><\/li>\n<li><a class=\"reference external\" href=\"https:\/\/www.reddit.com\/r\/LineageOS\/comments\/dkswr3\/cast_not_working_anymore_with_windows_10_connect\/f4jkxym\/\">https:\/\/www.reddit.com\/r\/LineageOS\/comments\/dkswr3\/cast_not_working_anymore_with_windows_10_connect\/f4jkxym\/<\/a><\/li>\n<li><a class=\"reference external\" href=\"https:\/\/www.reddit.com\/r\/LineageOS\/comments\/bdcl2v\/unbale_to_cast_screen_to_tv_in_lineage_os_16_bacon\/\">https:\/\/www.reddit.com\/r\/LineageOS\/comments\/bdcl2v\/unbale_to_cast_screen_to_tv_in_lineage_os_16_bacon\/<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Linux implementations<\/p>\n<ul class=\"simple\">\n<li>2014: <a class=\"reference external\" href=\"https:\/\/github.com\/albfan\/miraclecast\">https:\/\/github.com\/albfan\/miraclecast<\/a><ul>\n<li>blog post: <a class=\"reference external\" href=\"https:\/\/dvdhrm.wordpress.com\/2014\/02\/17\/on-wifi-democratic-republics-and-miracles\/\">https:\/\/dvdhrm.wordpress.com\/2014\/02\/17\/on-wifi-democratic-republics-and-miracles\/<\/a><\/li>\n<\/ul>\n<\/li>\n<li>2019-12: <a class=\"reference external\" href=\"https:\/\/blogs.gnome.org\/benzea\/2019\/01\/30\/gnome-screencast\/\">https:\/\/blogs.gnome.org\/benzea\/2019\/01\/30\/gnome-screencast\/<\/a><\/li>\n<\/ul>\n<p>List of applications: <a class=\"reference external\" href=\"https:\/\/wiki.thingsandstuff.org\/Networked_media#Miracast\">https:\/\/wiki.thingsandstuff.org\/Networked_media#Miracast<\/a><\/p>\n<\/div>\n<div class=\"section\" id=\"google-cast\">\n<h1>Google Cast<\/h1>\n<ul class=\"simple\">\n<li>Disable Google Cast Receiver Signature Verification in Google Play Services with an XPosed module: <a class=\"reference external\" href=\"https:\/\/cryptographybuzz.com\/reverse-engineering-google-cast\/\">https:\/\/cryptographybuzz.com\/reverse-engineering-google-cast\/<\/a><\/li>\n<\/ul>\n<div class=\"section\" id=\"protocol-v1\">\n<h2>Protocol v1<\/h2>\n<p>Uses DIAL (<a class=\"reference external\" href=\"http:\/\/www.dial-multiscreen.org\">http:\/\/www.dial-multiscreen.org<\/a>, <a class=\"reference external\" href=\"https:\/\/en.wikipedia.org\/wiki\/Discovery_and_Launch\">https:\/\/en.wikipedia.org\/wiki\/Discovery_and_Launch<\/a>)<\/p>\n<ul class=\"simple\">\n<li>How Chromecast Works, Chromecast Protocol Explained (2013) <a class=\"reference external\" href=\"http:\/\/geeknizer.com\/how-chromecast-works-chromecast-protocol-explained\/\">http:\/\/geeknizer.com\/how-chromecast-works-chromecast-protocol-explained\/<\/a><\/li>\n<li>Chromecast Implementation Documentation WIP <a class=\"reference external\" href=\"https:\/\/github.com\/jloutsenhizer\/CR-Cast\/wiki\/Chromecast-Implementation-Documentation-WIP\">https:\/\/github.com\/jloutsenhizer\/CR-Cast\/wiki\/Chromecast-Implementation-Documentation-WIP<\/a><\/li>\n<li>RAMP <a class=\"reference external\" href=\"https:\/\/github.com\/entertailion\/Fling\">https:\/\/github.com\/entertailion\/Fling<\/a><\/li>\n<\/ul>\n<p>CASTv1 receiver implementations<\/p>\n<ul class=\"simple\">\n<li>leapcast: <a class=\"reference external\" href=\"https:\/\/github.com\/dz0ny\/leapcast\">https:\/\/github.com\/dz0ny\/leapcast<\/a><\/li>\n<li>cheapcast: <a class=\"reference external\" href=\"https:\/\/github.com\/mauimauer\/cheapcast\">https:\/\/github.com\/mauimauer\/cheapcast<\/a><\/li>\n<li>plaincast: audio-only receiver, <a class=\"reference external\" href=\"https:\/\/github.com\/aykevl\/plaincast\">https:\/\/github.com\/aykevl\/plaincast<\/a><ul>\n<li>plaincast for Dreambox satellite receiver: <a class=\"reference external\" href=\"https:\/\/dreambox.de\/board\/index.php?thread\/22590-youtube-videos-auf-die-dreambox-casten-plaincast\/&amp;postID=175993\">https:\/\/dreambox.de\/board\/index.php?thread\/22590-youtube-videos-auf-die-dreambox-casten-plaincast\/&amp;postID=175993<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Senders:<\/p>\n<ul class=\"simple\">\n<li>aircast (simulates airplay server, sends to chromecast)<ul>\n<li><a class=\"reference external\" href=\"https:\/\/github.com\/ains\/aircast\">https:\/\/github.com\/ains\/aircast<\/a><\/li>\n<\/ul>\n<\/li>\n<li>RemoteCast: control chromecast (audio volume, play\/pause) (unavailable since 2015)<ul>\n<li><a class=\"reference external\" href=\"https:\/\/forum.xda-developers.com\/showthread.php?t=2384624\">https:\/\/forum.xda-developers.com\/showthread.php?t=2384624<\/a><\/li>\n<\/ul>\n<\/li>\n<li>pulseaudio-dlna: Send Linux sound to Chromecast (sink). Unclear if v1 or v2<ul>\n<li><a class=\"reference external\" href=\"https:\/\/github.com\/masmu\/pulseaudio-dlna\">https:\/\/github.com\/masmu\/pulseaudio-dlna<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<div class=\"section\" id=\"howto\">\n<h3>Howto<\/h3>\n<p>Control it with curl:<\/p>\n<ul class=\"simple\">\n<li><a class=\"reference external\" href=\"https:\/\/fiquett.com\/2013\/07\/chromecast-traffic-sniffing\/\">https:\/\/fiquett.com\/2013\/07\/chromecast-traffic-sniffing\/<\/a><\/li>\n<li><a class=\"reference external\" href=\"https:\/\/coderwall.com\/p\/jvuzdg\/play-youtube-video-from-terminal-to-chromecast\">https:\/\/coderwall.com\/p\/jvuzdg\/play-youtube-video-from-terminal-to-chromecast<\/a><\/li>\n<\/ul>\n<p>Find receivers:<\/p>\n<pre class=\"literal-block\">\n$ gssdp-discover --timeout=3 -t urn:dial-multiscreen-org:device:dialreceiver:1\n<\/pre>\n<p>Run a youtube video:<\/p>\n<pre class=\"literal-block\">\n$ curl -X POST -d &quot;v=zjR_AhxPnVM&quot; http:\/\/dreambox:8008\/apps\/YouTube\n<\/pre>\n<\/div>\n<\/div>\n<div class=\"section\" id=\"protocol-analysis-for-v2\">\n<h2>Protocol analysis for v2<\/h2>\n<p>Custom protocol<\/p>\n<ul class=\"simple\">\n<li>Google Cast Protocol: Overview <a class=\"reference external\" href=\"https:\/\/blog.oakbits.com\/google-cast-protocol-overview.html\">https:\/\/blog.oakbits.com\/google-cast-protocol-overview.html<\/a><\/li>\n<li>Google Cast Protocol: Discovery And Connection <a class=\"reference external\" href=\"https:\/\/blog.oakbits.com\/google-cast-protocol-discovery-and-connection.html\">https:\/\/blog.oakbits.com\/google-cast-protocol-discovery-and-connection.html<\/a><\/li>\n<li>Google Cast Protocol: Receiver Authentication <a class=\"reference external\" href=\"https:\/\/blog.oakbits.com\/google-cast-protocol-receiver-authentication.html\">https:\/\/blog.oakbits.com\/google-cast-protocol-receiver-authentication.html<\/a><\/li>\n<li>Chromecast Wireless Protocols Part-I: Setup <a class=\"reference external\" href=\"http:\/\/jhshi.me\/2016\/10\/24\/chromecast-wireless-protocols-part-i-setup\/index.html\">http:\/\/jhshi.me\/2016\/10\/24\/chromecast-wireless-protocols-part-i-setup\/index.html<\/a><\/li>\n<li>Chromecast Wireless Protocols Part-II: Cast <a class=\"reference external\" href=\"http:\/\/jhshi.me\/2016\/10\/24\/chromecast-wireless-protocols-part-ii-cast\/index.html\">http:\/\/jhshi.me\/2016\/10\/24\/chromecast-wireless-protocols-part-ii-cast\/index.html<\/a><\/li>\n<\/ul>\n<p>CASTv2 Receiver implementations<\/p>\n<ul class=\"simple\">\n<li>javascript: <a class=\"reference external\" href=\"https:\/\/github.com\/thibauts\/node-castv2\">https:\/\/github.com\/thibauts\/node-castv2<\/a><\/li>\n<li>java: <a class=\"reference external\" href=\"https:\/\/github.com\/vitalidze\/chromecast-java-api-v2\">https:\/\/github.com\/vitalidze\/chromecast-java-api-v2<\/a><\/li>\n<li>python: <a class=\"reference external\" href=\"https:\/\/github.com\/huaiyuangu\/chromecast-receiver-emulator\">https:\/\/github.com\/huaiyuangu\/chromecast-receiver-emulator<\/a><\/li>\n<\/ul>\n<p>CAST v2 senders<\/p>\n<ul class=\"simple\">\n<li>php: <a class=\"reference external\" href=\"https:\/\/github.com\/ChrisRidings\/CastV2inPHP\">https:\/\/github.com\/ChrisRidings\/CastV2inPHP<\/a><\/li>\n<li>fx_cast: Firefox Extension to cast videos on websites to Chromecast <a class=\"reference external\" href=\"https:\/\/github.com\/hensm\/fx_cast\">https:\/\/github.com\/hensm\/fx_cast<\/a><\/li>\n<\/ul>\n<p>List of applications: <a class=\"reference external\" href=\"https:\/\/wiki.thingsandstuff.org\/Networked_media#Google_Cast_.2F_Chromecast\">https:\/\/wiki.thingsandstuff.org\/Networked_media#Google_Cast_.2F_Chromecast<\/a><\/p>\n<\/div>\n<\/div>\n<div class=\"section\" id=\"open-screen-protocol\">\n<h1>Open Screen Protocol<\/h1>\n<ul class=\"simple\">\n<li>2019-12 by some googler <a class=\"reference external\" href=\"https:\/\/w3c.github.io\/openscreenprotocol\/\">https:\/\/w3c.github.io\/openscreenprotocol\/<\/a><ul>\n<li><a class=\"reference external\" href=\"https:\/\/github.com\/w3c\/openscreenprotocol\">https:\/\/github.com\/w3c\/openscreenprotocol<\/a><\/li>\n<li><a class=\"reference external\" href=\"https:\/\/github.com\/bbc\/device-discovery-pairing\/blob\/master\/document.md\">https:\/\/github.com\/bbc\/device-discovery-pairing\/blob\/master\/document.md<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/div>\n<div class=\"section\" id=\"upnp-multiscreen\">\n<h1>UPnP Multiscreen<\/h1>\n<ul class=\"simple\">\n<li><a class=\"reference external\" href=\"https:\/\/openconnectivity.org\/developer\/specifications\/upnp-resources\/upnp\/multiscreen2\/\">https:\/\/openconnectivity.org\/developer\/specifications\/upnp-resources\/upnp\/multiscreen2\/<\/a><\/li>\n<\/ul>\n<\/div>\n<div class=\"section\" id=\"other\">\n<h1>Other<\/h1>\n<ul class=\"simple\">\n<li><a class=\"reference external\" href=\"https:\/\/elatov.github.io\/2017\/01\/media-casting-and-streaming-options\/\">https:\/\/elatov.github.io\/2017\/01\/media-casting-and-streaming-options\/<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n\n <\/div>\n <div class=\"phork-meta\">\n  <a href=\"https:\/\/p.cweiske.de\/669\/rev-raw\/c9b90c965a0c1d69a0e8965cbff99006e9b87fe6\/README.rst\" style=\"float: right\">view raw source<\/a>\n  <a href=\"https:\/\/p.cweiske.de\/669#README.rst\">README.rst<\/a>\n <\/div>\n<\/div>\n    <div class=\"phork-file\">\n <div class=\"phork-content\">\n  <div class=\"image\"><img src=\"669\/rev-raw\/c9b90c965a0c1d69a0e8965cbff99006e9b87fe6\/cast-icon.png\" alt=\"cast-icon.png\"\/><\/div>\n <\/div>\n <div class=\"phork-meta\">\n  <a href=\"https:\/\/p.cweiske.de\/669\/rev-raw\/c9b90c965a0c1d69a0e8965cbff99006e9b87fe6\/cast-icon.png\" style=\"float: right\">view raw source<\/a>\n  <a href=\"https:\/\/p.cweiske.de\/669#cast-icon.png\">cast-icon.png<\/a>\n <\/div>\n<\/div>\n    <div class=\"phork-file\">\n <div class=\"phork-content\">\n  <div class=\"image\"><img src=\"669\/rev-raw\/c9b90c965a0c1d69a0e8965cbff99006e9b87fe6\/no-cast-devices-found.png\" alt=\"no-cast-devices-found.png\"\/><\/div>\n <\/div>\n <div class=\"phork-meta\">\n  <a href=\"https:\/\/p.cweiske.de\/669\/rev-raw\/c9b90c965a0c1d69a0e8965cbff99006e9b87fe6\/no-cast-devices-found.png\" style=\"float: right\">view raw source<\/a>\n  <a href=\"https:\/\/p.cweiske.de\/669#no-cast-devices-found.png\">no-cast-devices-found.png<\/a>\n <\/div>\n<\/div>\n<\/div>\n"}
