iOSDC Japan 2022 day2, 20min Talk
https://fortee.jp/iosdc-japan-2022/proposal/c922031a-84b2-45de-9cac-3a05998978a9
• AirPlayとはAppleのデバイスから同一ネットワーク内の他の機器でメディアを再生する機能 • 歴史 • 直感的な操作の裏で行われていること、データの流れ • アプリへの組み込み方
AirPlayͷཪߦ ઍय़ʢͳΊ͖ ͪΔʣTwitter, GitHub @RidwyStreaming Client Team, גࣜձࣾ AbemaTViOSDC JAPAN 2022, day2 (9/12)
View Slide
• ΠϯλʔωοτςϨϏہʢ2015։ہʣ• ৽͍͠ະདྷͷςϨϏʮABEMAʯStreaming Client TeamABEMAͷ֤ରԠσόΠεͷ ࠶ੜػೳΛ୲ݱࡏWഋʹ͚ͯฃಆதશ64ࢼ߹ແྉੜதܧʂגࣜձࣾAbemaTViPhone, iPad, Apple TV, Android, Android TV,Web, IPTV, Switch, Chromecast, …
AirPlayͱʁAppleͷσόΠε (iPhone, iPad, iPod touch, Mac)͔ΒಉҰωοτϫʔΫʹ͋ΔଞͷػثͰԻָ, ࣸਅ, ಈըΛ࠶ੜ͢ΔػೳϛϥʔϦϯά֎෦σΟεϓϨΠɾεϐʔΧʔͱͯ͠ͷར༻Մೳ
ද͔Βݟ͍͖ͯ·͠ΐ͏
iPhone͔ΒApple TVͰۂΛ࠶ੜ
AirPlayͷϚʔΫΛλοϓͯ͠ग़ྗઌΛબͿ͚ͩ
iPhone͔Β2ͷεϐʔΧʔͰಉ͡ۂΛ࠶ੜ
MacʹAirPlayΛઃఆmacOS MontereyҎ߱ɺMacʹAirPlayՄೳʂ
• ϚϧνϧʔϜ࠶ੜ• ෳͷεϐʔΧʔͰಉ͡ۂΛ࠶ੜಉظͯ͠࠶ੜ͞ΕΔͷͰɺ͍෦͍ͬͺ͍ʹԻָΛ͔͚Δ͜ͱ͕Ͱ͖Δ• ֤෦ͰผͷۂΛ࠶ੜ• HomePod mini 2ͰεςϨΦϖΞΛ࡞ΕΔ• SiriHome Kitͱͷ૬ੑྑ͍Hey, Siri. ϦϏϯάϧʔϜͰ Upbeat Funk Pop Λ࠶ੜͯ͠.VTJDΞϓϦͷػೳΛϑϧͰ͏ʹ"QQMF.VTJDʹՃೖ͢͠
iPhone͔ΒApple TVͰಈըΛ࠶ੜ
• iPhoneͰΞϓϦΛόοΫάϥϯυʹͨ͠Γɺଞͷૢ࡞Λͯ͠ AirPlay࠶ੜ͕ଓ͘ • ಈըͷ߹ Sender ͱ Receiver 1 : 1ෳͷػثΛબͿͱεϐʔΧʔͱͯ͠ͷར༻ʹͳΔAirPlayಈը࠶ੜͷಛ
iPhoneͷࣸਅΛେը໘Ͱʂ
ը໘ϛϥʔϦϯάɾը໘֦ுԆ͕ؾʹͳΔਓʹ༗ઢωοτϫʔΫ͕͓͢͢Ί
AirPlayͷཪ
ྺ࢙
2002 Mac OS X v10.2 Jaguar ϦϦʔεAppleʹΑΔZero Configuration Networkingٕज़ɺRendezvous (ϥϯσϒʔ)ΛࡌZero Configuration Networkingٕज़ͱ• ෳࡶͳωοτϫʔΫઃఆͳ͠ʢ= Zero ConfigurationʣͰ ಉҰωοτϫʔΫ্ʹ͋ΔಛఆͷσόΠεΛൃݟͰ͖Δٕज़• ଞʹϚΠΫϩιϑτͷUPnPͳͲ
2004 AirMac Express ൃച• iTunesͷۂΛωοτϫʔΫܦ༝ͰετϦʔϛϯά࠶ੜ͢ΔAirTunesػೳ• σόΠεݕग़ʹ Rendezvous Λར༻ (༷ඇެ։)˞ຊҎ֎Ͱ"JS1PSU&YQSFTT
2005 Mac OS X v10.4 Tiger ϦϦʔε• Rendezvous → Bonjour ʹ໊শมߋ 2010 Apple TV ୈ̎ੈ ൃച• ಈը࠶ੜʹରԠ͠ɺAirTunes → AirPlay ʹʂ
2017 AirPlay 2 ൃද• Apple TV͚ͩͰͳ͘ରԠεϚʔτTVͰಈը࠶ੜ͕Մೳʹ• tvOS 11.4Ҏ߱• ϚϧνϧʔϜ࠶ੜػೳ• 4K, HDR, αϥϯυαϯυʹରԠಉ࣌ظʹApple TV 4Kൃച
ରԠσόΠε (Receiver)• Apple TV ୈ̎ੈʙ• ରԠSmartTV• Mac2018͝ΖͷϞσϧҎ߱, macOS Monterey• HomePod• ରԠεϐʔΧʔຊͰ Sony, LG͕ରԠTVΛग़͍ͯ͠Δ͜ͷϚʔΫ͕ҹʂ
SmartTVͰͷಈըετϦʔϛϯάͷ੍• SharePlay ະαϙʔτ• HLSͷཁ݅• VariantؒͰηάϝϯτڥքΛ߹ΘͤΔ• ηάϝϯτIϑϨʔϜ͔Β࢝ΊΔ• ్தͰνϟϯωϧϨΠΞτCODECͷมߋෆՄ• ϑϨʔϜϨʔτ͘͠ഒͷΓସ͑ͷΈՄৄࡉ WWDC19 507 HLS Authoring for AirPlay 2 Video Λࢀর
ײతͳૢ࡞ͷཪͰͲΜͳ͜ͱ͕͓͜ͳΘΕ͍ͯΔͷ͔ʁ
1. σόΠεͷൃݟBonjourʹΑΔAirPlayରԠσόΠεͷൃݟ2. ར༻4ͭͷར༻γφϦΦ• ࣸਅΛදࣔ• ۂΛ࠶ੜ• ಈըΛ࠶ੜ• ը໘ϛϥʔϦϯάɾը໘֦ுAirPlay Λߦ͏ྲྀΕ※ γφϦΦ͝ͱʹ࣮ݱํ๏ҟͳΔ
σόΠεͷൃݟ
Bonjourෳࡶͳઃఆͳ͠ʹɺϩʔΧϧωοτϫʔΫͰతͷػೳʢαʔϏεʣΛఏڙ͢ΔΠϯελϯεΛݕग़͢ΔΈϋʔυΣΞ͕ෳͷαʔϏεΛఏڙ͢ΔࣄΑ͋͘ΔͷͰɺσόΠεͰͳ͘ʮػೳΛఏڙ͢ΔΠϯελϯεʯͱ͍͏୯ҐͰѻ͏
AirPlayͷαʔϏε_airplay._tcp_raop._tcp• RAOP = AirTunes Remote Audio Output Protocol• AirTunesͱͷޓੑ, ָۂ࠶ੜͷΈ
Multicast DNS (mDNS)ͷϨίʔυΛ׆༻mDNS• খ͞ͳωοτϫʔΫͰɺDNSͷΘΓʹϗετ໊͔ΒIPΞυϨεΛղܾ• ֤σόΠε্ͰϨεϙϯμʔ্ཱ͕͕͓ͪͬͯΓɺϚϧνΩϟετͰΓͱΓ͢Δ mDNSͷϨίʔυʹΠϯελϯεͱαʔϏεͷϚοϐϯάΛొ (Publication)
AirPlay SenderAirPlayͰ͖Δਓʙʂ🙋 ŰŖŘ🙋 ŰŖŘLocal Network※ ݫີͰ͋Γ·ͤΜ͕͜ΜͳΠϝʔδͰ͢
Bonjourݕग़αʔϏε _airplay._tcp Λఏڙ͍ͯ͠ΔΠϯελϯε͍ΔʁNiceSpeaker._airplay._tcp.localݕग़໊લղܾNiceSpeaker._airplay._tcp.local ͷϗετ໊, ϙʔτNiceSpeaker._airplay._tcp.localϗετ໊: NiceSpeaker.localϙʔτ: 1010NiceSpeaker.local, 1010NiceSpeaker.localͷIPΞυϨεAirPlay Sender
ར༻γφϦΦຖͷཪଆ⚠ UNDOCUMENTEDϦόʔεΤϯδχΞϦϯά͞Ε͍ͯΔॳظͷ༷Λݩʹ͍ͯ͠·͢
ࣸਅΛAirPlayHTTPαʔόPUT /photoࣸਅΞϓϦը૾ϑΝΠϧ※ ͜ͷػೳ3rd Partyʹެ։͞Ε͍ͯͳ͍
ۂΛAirPlayRTSPReal Time Streaming ProtocolApple LosslessͰΦʔσΟόοϑΝΛѹॖAudio PacketsDACPDigital Audio Control Protocolplay , pause, stop, …
ಈըΛAirPlayίϯςϯπ࠶ੜঢ়ଶCDNPOST /playwith Video URLHTTPαʔό• SenderಈըͷURLΛReceiverʹ͠ɺReceiverଆͰϑΝΠϧΛऔಘͯ͠࠶ੜ͢Δ• ίϯςϯπ͕҉߸Խ͞Ε͍ͯΔ߹ɺSenderΛ௨ͯ͡伴ͷॲཧΛߦ͏
ϛϥʔϦϯάɾը໘֦ுը໘ɾԻΛ HWΤϯίʔμͰѹॖPackets
ΞϓϦʹAirPlayΛΈࠐΉ
࣮ AVPlayer WebView Λ͍ͬͯΕԿ͠ͳͯ͘AirPlay͞ΕΔʂग़ྗܦ࿏ͷཧOSͷࣄ
εϓϥογϡϓϨϏϡʔಈըͳͲɺखݩͷͷUIͷதͰ࠶ੜ͞Εͯཉ͍͠ͷϑϥάΛ false ʹ• AVPlayer allowsExternalPlayback• WKWebView allowsAirPlayForMediaPlaybackΉ͠ΖɺAirPlay͠ͳ͍ͨΊͷϑϥά͕͋Δ
ΑΓྑ͍ମݧͷͨΊͷνϡʔχϯά
AirPlayઌͷબը໘Λදࣔ AVRoutePickerView Λදࣔlet routePickerView = AVRoutePickerView()// ಈը࠶ੜՄೳͳσόΠεΛ༏ઌ͢Δ iOS 13Ҏ߱routePickerView.prioritizesVideoDevices = true
ΞϓϦΛดͯ͡࠶ੜΛଓ͚ΔInfo.plistͰόοΫάϥϯυ࠶ੜΛ༗ޮԽ
ΞϓϦ֎͔Βͷૢ࡞ΛՄೳʹϩοΫը໘ίϯτϩʔϧηϯλʔɺAirPlayઌ …MPRemoteCommandCenter ͰΠϕϯτΛड͚औͬͯ࠶ੜΛ੍ޚ
࠶ੜதͷۂಈըͷใΛදࣔϝλσʔλΛ MPNowPlayingInfoCenter ʹఏڙlet nowPlayingInfoCenter = MPNowPlayingInfoCenter.default()var nowPlayingInfo = nowPlayingInfoCenter.nowPlayingInfo ?? [String: Any]()nowPlayingInfo[MPMediaItemPropertyTitle] = metadata.titlenowPlayingInfo[MPMediaItemPropertyArtwork] = metadata.artworknowPlayingInfoCenter.nowPlayingInfo = nowPlayingInfo
• AirPlayͱʁԻָɾࣸਅɾಈըΛଞͷػثͰ؆୯ʹ࠶ੜ + ϛϥʔϦϯάɾը໘֦ு• ྺ࢙ͱͦΕͧΕͷମݧͷཪଆBonjour, RTSP, …• ΞϓϦͷΈࠐΈํ·ͱΊ
ࢀߟࢿྉWWDC SessionsWWDC19 Session 501 Reaching the. Big Screen with AirPlay 2WWDC19 Session 507 HLS Authoring for AirPlay 2 VideoApple։ൃऀ͚ϖʔδ https://developer.apple.com/airplay/ openairplay AirPlayͷϦόʔεΤϯδχΞϦϯά https://openairplay.github.io
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠Big Buck BunnyCopyright (C) 2008 Blender Foundation | peach.blender.org Some Rights Reserved.Creative Commons Attribution 3.0 license. https://peach.blender.org/Springish by Gillicuddy CC BY-NC 3.0https://freemusicarchive.org/music/gillicuddy/Plays_Guitar/05-springish/Upbeat Funk Pop by Scott Holmes Music CC BY-NC 4.0https://freemusicarchive.org/music/Scott_Holmes/indie-pop-acoustic-background-music/upbeat-funk-pop-1/