Slide 1

Slide 1 text

ෳ਺ͷϥΠϒө૾Λ ಉظ࠶ੜ͢Δͷ͕େมͩͬͨͷͰ ஌ݟΛ͓఻͑͠·͢ iOSDC Japan 2018 2018.8.31 10:50~ Track C pixiv.inc FromAtom

Slide 2

Slide 2 text

• FromAtom / @FromAtom / id:FromAtom • ͸ͯͳΠϯλʔϯˠ͸ͯͳΞϧόΠτˠϐΫγϒ • pixiv Sketch / pixiv Sketch LIVE / pixivίϛοΫ • Swift 1.2 ͔ΒiOSΞϓϦ։ൃͷੈք΁ ࣗݾ঺հ

Slide 3

Slide 3 text

͓ֆ͔͖ίϛϡχέʔγϣϯΞϓϦ pixiv Sketch

Slide 4

Slide 4 text

એ఻

Slide 5

Slide 5 text

ϐΫγϒגࣜձࣾͬͯձࣾͰ͢

Slide 6

Slide 6 text

͍Ζ͍Ζ΍ͬͯ·͢

Slide 7

Slide 7 text

͜͜Ͱ౾஌ࣝ

Slide 8

Slide 8 text

pixivͷ "p" ͸খจࣈ

Slide 9

Slide 9 text

γϧόʔεϙϯαʔͰ͢ʂ

Slide 10

Slide 10 text

ϊϕϧςΟ΋༻ҙ͓ͯ͠Γ·͢ʂ

Slide 11

Slide 11 text

Slide 12

Slide 12 text

Slide 13

Slide 13 text

खʹೖΕΔํ๏

Slide 14

Slide 14 text

ϐΫγϒࣾһΛݟ͚͍ͭͯͩ͘͞

Slide 15

Slide 15 text

Slide 16

Slide 16 text

ʮίʔυϨϏϡʔ͓ئ͍͠·͢ʯ

Slide 17

Slide 17 text

ࠓ೔͸ઌண15ਓʹϓϨθϯτʂ ࣋ͬͯΔࣾһΛ୳ͤʂ

Slide 18

Slide 18 text

ෳ਺ͷϥΠϒө૾Λ ಉظ࠶ੜ͢Δͷ͕େมͩͬͨͷͰ ஌ݟΛ͓఻͑͠·͢ iOSDC Japan 2018 08/31 10:50 Track C pixiv.inc FromAtom

Slide 19

Slide 19 text

iOSͰಈը࠶ੜ͢Δ

Slide 20

Slide 20 text

iOSͰಈը࠶ੜ͢Δ ࢀߟɿ [iOS] iOSͰಈըΛ࠶ੜ͢Δ̐ͭͷํ๏ | Developers.IO (https://dev.classmethod.jp/smartphone/ios-video/) ࠶ੜํ๏ ൑அج४ ࣮૷ίετ MPMoviePlayerController iOS9 ͔Β Deprecated - WKWebView ؆୯ʹαοͱग़͍ͨ࣌͠ খ AVPlayerViewController WKWebViewΑΓগ͚ͩ͠ڽΓ͍ͨ࣌ খ AVPlayer ෳࡶͳ੍ޚɾදࣔΛߦ͍͍ͨ࣌ େ

Slide 21

Slide 21 text

WKWebView or AVPlayerViewController Λ࢖͓͏ʂʂʂ

Slide 22

Slide 22 text

AVPlayer͸େม͔ͩΒ ࢖Θͳ͍Α͏ʹؤுͬͯʂʂʂ

Slide 23

Slide 23 text

AVPlayerΛ͔ͭ͏࣌

Slide 24

Slide 24 text

AVPlayerΛ͔ͭ͏࣌ • ෳࡶͳ࠶ੜ੍ޚΛߦ͍͍ͨ • ಠࣗͷૢ࡞ύωϧΛ࡞Γ͍ͨ • ϑϧεΫϦʔϯػೳΛࣗ࡞͍ͨ͠ • ෳ਺ಈըͷಉظ࠶ੜΛ࣮ݱ͍ͨ͠

Slide 25

Slide 25 text

AVPlayerΛ͔ͭ͏࣌ • ෳࡶͳ࠶ੜ੍ޚΛߦ͍͍ͨ • ಠࣗͷૢ࡞ύωϧΛ࡞Γ͍ͨ • ϑϧεΫϦʔϯػೳΛࣗ࡞͍ͨ͠ • ෳ਺ಈըͷಉظ࠶ੜΛ࣮ݱ͍ͨ͠

Slide 26

Slide 26 text

ͳΜͰෳ਺ಈըͷಉظ͢ΔΜʁ

Slide 27

Slide 27 text

pixiv Sketch LIVE

Slide 28

Slide 28 text

ෳ਺ਓ഑৴ • ࠷େ4ਓ·Ͱಉ࣌഑৴͕Ͱ͖Δ • ഑৴ऀ͸్தͰ૿ݮ͢Δ • ࢹௌऀ͸͢΂ͯͷಈըΛ࠶ੜ

Slide 29

Slide 29 text

ෳ਺ਓ഑৴ • ࠷େ4ਓ·Ͱಉ࣌഑৴͕Ͱ͖Δ • ഑৴ऀ͸్தͰ૿ݮ͢Δ • ࢹௌऀ͸͢΂ͯͷಈըΛ࠶ੜ 1 2 3 4

Slide 30

Slide 30 text

ෳ਺ਓ഑৴ • ഑৴ऀಉ࢜͸WebRTCͰ௿஗ԆʹίϛϡχέʔγϣϯՄೳ • ࢹௌऀଆʹ͸HLSಈը͕࠷େ4ͭ߱ͬͯ͘Δ • ී௨ʹ࠶ੜ͢ΔͱHLSಈըͷ࠶ੜλΠϛϯά͕ζϨΔ • ձ࿩ͷ಺༰͕ζϨͯ·ͱ΋ʹࢹௌͰ͖ͳ͍

Slide 31

Slide 31 text

ෳ਺HLSʢಈըʣͷಉظ࠶ੜ͕ඞཁ

Slide 32

Slide 32 text

͜ͷൃදͷํ਑ • ϥΠϒ഑৴͞Ε͍ͯΔHLSಈըͷ࿩Λ͠·͢ • ࣮૷ํ๏͸ WWDC 2017ͷ "Advances in HTTP Live Streaming" Ͱ΄΅෼͔Δ • αϯϓϧίʔυ΋͋Γ·͢ • ͳͷͰৄ͍࣮͠૷ͷ࿩͸ͤͣɺίπ΍ϊ΢ϋ΢Λڞ༗͠·͢ • কདྷෳ਺HLSΛಉظ࠶ੜ͢Δ࣌ͷखॿ͚ʹͳΔࢿྉΛ໨ࢦ͢ ࢀߟɿ Advances in HTTP Live Streaming - WWDC2017 (https://developer.apple.com/videos/play/wwdc2017/504/)

Slide 33

Slide 33 text

1ͭͷHLSಈըΛ࠶ੜ͢Δࡍͷίπ

Slide 34

Slide 34 text

AVPlayerLayerͷίπ LICENSE: "Big Buck Bunny" by Blender Foundation is licensed under CC BY 3.0 ૝ఆ ݱ࣮

Slide 35

Slide 35 text

• .frame Λઃఆ͠ͳ͍ͱಈըαΠζ͕͓͔͘͠ͳΔ AVPlayerLayerͷίπ

Slide 36

Slide 36 text

KVOͷίπ • ͜ͷ5छྨΛ؂ࢹ͓ͯ͘͠ • .status, .loadedTimeRangesɿओʹಉظ࠶ੜʹ࢖͏ • .isPlayback*ɿϩʔσΟϯάɾϦϩʔυදࣔͷϋϯυϦϯάʹ࢖͏

Slide 37

Slide 37 text

KVOͷίπ • removeObserver ͤͣʹഁغ͢Δͱ࣮ߦ࣌Ϋϥογϡ • iOS9 ͔Β NotificationCenter ͷ removeObserver ͸ෆཁʹͳ͚ͬͨͲKVO͸ผ ࢀߟɿiOS9Ҏ߱Ͱ͸ "NotificationCenter.default.removeObserver(_:name:object:)" Λdeinitʹॻ͔ͳͯ͘΋ྑ͍Ͱ͢Αɻ(https://fromatom.hatenablog.com/entry/2017/12/13/135542)

Slide 38

Slide 38 text

KVOͷίπ • addObserver ͍ͯ͠ͳ͍ঢ়ଶͰ removeObserver ͢Δͱ࣮ߦ࣌Ϋϥογϡ • addObserver ͞Ε͍ͯΔ͔஌Δํ๏͕ͳͦ͞͏ • DispatchQueueͱϑϥάΛ༻͍ͯஸೡʹ؅ཧ͢Δඞཁ͕͋Δ

Slide 39

Slide 39 text

block-based KVOΛ࢖͏ • removeObserver ͠ͳͯ͘΋Ϋϥογϡ͠ͳ͍ • observer?.invalidate() Ͱ໌ࣔతʹഁغ΋Ͱ͖Δ

Slide 40

Slide 40 text

ෳ਺ͷHLSಈըΛ࠶ੜ͢Δࡍͷίπ

Slide 41

Slide 41 text

iOS 9 ͷαϙʔτΛ੾Δ • ಉظ࠶ੜʹඞཁͳAPI͕ iOS 10+ • iOS 9 ҎલͰ͸Ͳ͏͕Μ͹ͬͯ΋ແཧ • શͯͷಈըΛಉ࣌ʹϦϩʔυͯٙ͠ࣅಉظͳͲ͸ՄೳʢζϨΔʣ • ΋͘͠͸ iOS 9 ͷ৔߹͚ͩಈըΛݟΕͳ͘͢Δ

Slide 42

Slide 42 text

ಉظͷ࢓૊Έ ͬ͘͟Γͱ

Slide 43

Slide 43 text

1 2 3 4

Slide 44

Slide 44 text

਌ ࢠ ࢠ ࢠ Seekͯ͠࠶ੜ

Slide 45

Slide 45 text

਌ ࢠ ࢠ ࢠ ζϨΛΈΔ

Slide 46

Slide 46 text

਌ ࢠ ࢠ ࢠ Seekͯ͠࠶ੜ

Slide 47

Slide 47 text

ઃܭͷίπ • View (VC) ʹσʔλ͕ີ݁߹͠΍͍͢ • ෳ਺ͷಈը (UIView) ͕ີ݁߹ͯ͠େมʹͳΔʢͳͬͨʣ • ManagerΛ࡞ΓಉظʹඞཁͳσʔλΛView֎ʹग़͢ • γϯάϧτϯ or ಈըΛ؅ཧ͢ΔView (VC) ʹΠϯελϯεΛ΋ͨͤΔ

Slide 48

Slide 48 text

ࢠ ਌

Slide 49

Slide 49 text

ࢠ ਌ ͍·࣌ؒͲΜͳʁ

Slide 50

Slide 50 text

ࢠ ਌ ͍·࣌ؒͲΜͳʁ σʔλ

Slide 51

Slide 51 text

ࢠ Manager σ ʔ λ ਌

Slide 52

Slide 52 text

ࢠ Manager σ ʔ λ ਌ ͍·࣌ؒͲΜͳʁ

Slide 53

Slide 53 text

ࢠ Manager σ ʔ λ ࢠ ࢠ ਌

Slide 54

Slide 54 text

খٳࢭ ͜͜Ͱ࢒Γ5෼ or 10෼ܦա ͩͱ͍͍ײ͡Β͍͠Α

Slide 55

Slide 55 text

ϋϚͬͨ໰୊

Slide 56

Slide 56 text

਌ಈը͕ૣૹΓ͞ΕΔ • ࠶ੜˠ͠͹Β͘ࢹௌˠఀࢭˠ࠶ੜ Λߦͳ͏ͱى͜Δ • Buffer͕͔ͬ͠Γͱཷ·͍ͬͯΔͱൃੜ • ૣૹΓ͕ऴΘΔ·Ͱಉظ͕Ͱ͖ͳ͍ͷͰࢠͷಈը΋ࢭ·Δ

Slide 57

Slide 57 text

਌ಈը͕ૣૹΓ͞ΕΔ • preferredForwardBufferDuration ͷ஋Λখͯ͘͞͠ղܾ • ੜ੒͞Ε͍ͯΔHLSͷઃఆͰม͑ͨ΄͏͕ແ೉ • σϑΥϧτ͸"0"ͰࣗಈͰ͍͍ײ͡ʹͯ͘͠ΕΔ • automaticallyWaitsToMinimizeStalling Λ true ʹ͠ͳ͍ͱ༗ޮʹͳΒͳ͍

Slide 58

Slide 58 text

ࢠͷಈը͕࠶ੜ͞Εͳ͍ • ಉظ࠶ੜʹ͸HLSͷ EXT-X-PROGRAM-DATE-TIME λάΛ࢖͏ • ͜ͷλάͰࢦఆ͞Ε͕ͨ࣌ؒͣΕ͍ͯͨ • ͲͷϨΠϠʔͷ໰୊͔Θ͔ΒͣɺݪҼڀ໌ʹ͕͔͔࣌ؒͬͨ • αʔόαΠυͱͷίϛϡχέʔγϣϯ͕େࣄ ࢀߟɿHLS WWDC 2017 Preliminary spec (https://developer.apple.com/streaming/HLS-WWDC-2017-Preliminary-Spec.pdf)

Slide 59

Slide 59 text

σόοάํ๏

Slide 60

Slide 60 text

HLS͕ు͘ΤϥʔΛݟΔํ๏ • .AVPlayerItemNewErrorLogEntry ͷ௨஌Λड͚औΔ • ௨஌Λड͚औͬͨΒ AVPlayer ͕͍࣋ͬͯΔ errorLog() ͷ࠷ޙΛݟΔ

Slide 61

Slide 61 text

AVPlayerItemErrorLogEvent.errorComment ͷத਎ Failure Error Code Authentication failures 401 Unauthorized Client doesn’t have permissions 403 Forbidden Resource unavailable but may become available in the future 404 Not Found Resource unavailable and will never become available in the future 410 Gone Internal server errors 500 Internal Server Error Invalid response from gateway 502 Bad Gateway Server unavailable 503 Service Unavailable Gateway timeouts 504 Gateway Time-Out ࢀߟɿError Handling Best Practices for HTTP Live Streaming - WWDC 2017 (https://developer.apple.com/videos/play/wwdc2017/514/?time=218)

Slide 62

Slide 62 text

αʔόαΠυͱͷ࿈ܞ • αʔόαΠυ͸֤ϓϥοτϑΥʔϜʹରԠ͢Δඞཁ͕͋Δ • iOSͷSafariͰಈ͍ͯ΋AVPlayerͰ͸ಈ͔ͳ͍͜ͱ͕͋Δ • खݩͰؾܰʹσόοάͯ͠΋Β͑Δ΄͏͕Α͍

Slide 63

Slide 63 text

σόοά༻ΞϓϦ • HLSͷURL͔Β࠶ੜͰ͖Δ • ֤छϩάΛਨΕྲྀ͍ͯ͠Δ • In-HouseϏϧυͰ഑෍ LICENSE: "Big Buck Bunny" by Blender Foundation is licensed under CC BY 3.0

Slide 64

Slide 64 text

Androidͷ৔߹͸ʁ

Slide 65

Slide 65 text

google/ExoPlayer Λ࢖͑͹ղܾ • Googleۘ੡ • શ෦΍ͬͯ͘ΕΔʂ࠷ߴʂ • https://github.com/google/ExoPlayer

Slide 66

Slide 66 text

·ͱΊ