Slide 1

Slide 1 text

AVPlayerपΓͷઃܭtips potatotips #55 Oct 9, 2018 Toshihiro Suzuki © Toshihiro Suzuki 2018 1

Slide 2

Slide 2 text

whoami @toshi0383 (Toshihiro Suzuki) ಡΈํ: τογʔ or... © Toshihiro Suzuki 2018 2

Slide 3

Slide 3 text

ʮ౦ژ౎࠷଎ͷஉʯ͞Μ © Toshihiro Suzuki 2018 3

Slide 4

Slide 4 text

झຯ: ѪंͰυϥΠϒ (ՈͰ) © Toshihiro Suzuki 2018 4

Slide 5

Slide 5 text

job AbemaTV iOS/tvOS ετΫϥ (Streaming Client Team) ಈը࠶ੜ඼࣭ © Toshihiro Suzuki 2018 5

Slide 6

Slide 6 text

Developer Blog https://developers.cyberagent.co.jp/blog/archives/17579/ © Toshihiro Suzuki 2018 6

Slide 7

Slide 7 text

ࠓ೔ͷςʔϚ © Toshihiro Suzuki 2018 7

Slide 8

Slide 8 text

AVPlayerपΓͷίʔυΛͲ ͏੔ཧͨ͠Β͍͍͔ ͋͘·ͰҰྫͳͷͰɺ͝ࢀߟఔ౓ʹɻ © Toshihiro Suzuki 2018 8

Slide 9

Slide 9 text

ྲྀΕ —લఏͱͳΔํ਑ —ઃܭͷશମ૾Λ၆ᛌ © Toshihiro Suzuki 2018 9

Slide 10

Slide 10 text

ํ਑ —AVPlayer͸UIͱͯ͠ଊ͑ͳ͍ —replaceCurrentItem͸࢖Θͳ͍ (লུ) © Toshihiro Suzuki 2018 10

Slide 11

Slide 11 text

ҰൠతʹΑ͘ݟΔίʔυ class ViewController: UIViewController { var player: AVPlayer? ... override func viewDidLoad() { super.viewDidLoad() player?.play() } } © Toshihiro Suzuki 2018 11

Slide 12

Slide 12 text

Α͘ݟΔίʔυͷ໰୊఺ —playerΛ৮Δίʔυ͕ࢄΒ͹͍ͬͯͯݟ௨͕͠Α͘ͳ ͍ —ଞͷView͔Β৮Γ͍ͨ৔߹ʹڑ཭͕͋Δ © Toshihiro Suzuki 2018 12

Slide 13

Slide 13 text

ͦ΋ͦ΋ϓϨΠϠʔ͔ͩΒͬͯView ʹറΒΕ͍ͯΔͷ͕ѱ͍ͷͰ͸ © Toshihiro Suzuki 2018 13

Slide 14

Slide 14 text

AVPlayerͷॳظԽ΍ૢ࡞͸ϝΠϯε Ϩουඞਢͱ͍͏ݴ͍఻͑ ࠷ۙ͸͋·Γฉ͔ͳ͍͚ͲɺҎલ͸ͦ͏͍͏ৗ͕ࣝଘࡏ ͨ͠ؾ͕͢Δɻ © Toshihiro Suzuki 2018 14

Slide 15

Slide 15 text

໎৴Ͱ͢ ؾͷ͍ͤͳͷͰ๨Ε·͠ΐ͏ © Toshihiro Suzuki 2018 15

Slide 16

Slide 16 text

ͨͩ͠ KVOͷొ࿥͸ϝΠϯεϨουͷํ͕͍͍ͱ͍͏هड़͋Γ https://developer.apple.com/documentation/avfoundation/avplayer © Toshihiro Suzuki 2018 16

Slide 17

Slide 17 text

͋ͱ ͜͏͍͏࿩΋͋ΔͷͰཁݕূ https://speakerdeck.com/kyoheig3/abema-devcon?slide=24 © Toshihiro Suzuki 2018 17

Slide 18

Slide 18 text

ͱ͸͍͑ɺ ϝΠϯεϨου == UI ʹറΒΕΔඞ ཁ͸ͳ͍͸ͣ Appleͷαϯϓϧ΋ AssetPlaybackManager ͕playerΛ؅ཧ͍ͯ͠Δ ΋ͬͱ্ྲྀͰ΍ͬͯ͠·͓͏ʂ © Toshihiro Suzuki 2018 18

Slide 19

Slide 19 text

၆ᛌΠϥετ © Toshihiro Suzuki 2018 19

Slide 20

Slide 20 text

RxSwift // ViewModel let control = VideoPlayerControl() ... requestReload .startWith(()) // NOTE: initial load .subscribe(onNext: { [weak self] in guard let me = self else { return } me.manager = VideoPlayerManager(url: me.url, control: me.control) me.manager.player.asObservable() .bind(to: me.playerRelay) .disposed(by: me.manager.playerDisposeBag) }) .disposed(by: disposeBag) © Toshihiro Suzuki 2018 20

Slide 21

Slide 21 text

RxSwift // ViewController viewModel.playerRelay.asObservable() .observeOn(ConcurrentMainScheduler.instance) .subscribe(onNext: { [weak self] player in self?.playerView.playerLayer.player = player }) .disposed(by: disposeBag) © Toshihiro Suzuki 2018 21

Slide 22

Slide 22 text

·ͱΊ —AVPlayerੜ੒ΛUI૚͔Β෼཭ͨ͠Βগ͠εοͱͨ͠ —ManagerΫϥεʹ੾Γग़ͤͨ͜ͱͰɺը໘Λލ͍Ͱ ૢ࡞&ੜଘ͕Մೳ => Picture-in-Pictureͱ͔ෳ਺ϓϨΠϠʔͱ͔ —VideoPlayerStream Λ࢖͏͜ͱͰɺϓϨΠϠʔͷ ڍಈΛmockՄೳ. (testable!) © Toshihiro Suzuki 2018 22

Slide 23

Slide 23 text

toshi0383/VideoPlayerManager ৭ʑ్தͰ্͕͕ͬͯ͢·͢ɻ https://github.com/toshi0383/VideoPlayerManager Open-Source! © Toshihiro Suzuki 2018 23

Slide 24

Slide 24 text

ͪͳΈʹ ࣮͸AbemaTV iOSΞϓϦ΋͜Ε͔Β͜ͷํ਑ͰϦϑΝ ΫλʹऔΓֻ͔Δͱ͜Ζɻ tvOSͱڞ௨Ͱ࢖͑ΔϥΠϒϥϦʹ͍ͨ͠ɻ ·ͩ·ͩࡉ͔͍ͱ͜Ζ͸͜Ε͔Βߟ͑ΔͷͰɺ͝ҙݟื ूதͰ͢ɻ © Toshihiro Suzuki 2018 24

Slide 25

Slide 25 text

ͪͳΈʹͪͳΈʹ Ұॹʹಇ͘஥ؒ͸·ͩ·ͩืूதͰ͢ ҰॹʹςετۦಈͰࢹௌମݧ޲্ ͠·͠ΐ͏ ! © Toshihiro Suzuki 2018 25

Slide 26

Slide 26 text

͓ΘΓ © Toshihiro Suzuki 2018 26

Slide 27

Slide 27 text

ࢀߟࢿྉ —Apple AVPlayerυΩϡϝϯτ —AVPlayerϕετϓϥΫςΟε by @KyoheiG3 —ಈըΞϓϦΛͳΊΒ͔ʹಈ͔ٕ͢ज़ by @dekatotoro © Toshihiro Suzuki 2018 27

Slide 28

Slide 28 text

Toshihiro Suzuki ! Twitter/GitHub/GTSport => @toshi0383 Email: [email protected] © Toshihiro Suzuki 2018 28