XCDYouTubeKitを使ってみる

はじめに

iosでYoutube動画の再生を行いたい時は公式のyoutube-ios-player-helperを使うことが多いと思いますが,ios android共に闇を抱えている部分が多いので代わりになるライブラリがないか調べてみました。

使ってみた感想としては、iosのライブラリに作りが寄っているので公式ライブラリにはない音量の制御とか入れやすいのかなと思いました。

全画面再生のコード

全画面で動画が再生するサンプルです。

import AVKit
import XCDYouTubeKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        playVideo(videoID: "再生したい動画のVideoID")
    }
    
    struct YouTubeVideoQuality {
        static let hd720 = NSNumber(value: XCDYouTubeVideoQuality.HD720.rawValue)
        static let medium360 = NSNumber(value: XCDYouTubeVideoQuality.medium360.rawValue)
        static let small240 = NSNumber(value: XCDYouTubeVideoQuality.small240.rawValue)
    }

    func playVideo(videoID: String?) {
        let playerViewController = AVPlayerViewController()
       
        self.present(playerViewController, animated: true, completion: nil)
        
        XCDYouTubeClient.default().getVideoWithIdentifier(videoID) { [weak playerViewController] (video: XCDYouTubeVideo?, error: Error?) in
            if let streamURLs = video?.streamURLs, let streamURL = (streamURLs[XCDYouTubeVideoQualityHTTPLiveStreaming] ?? streamURLs[YouTubeVideoQuality.hd720] ?? streamURLs[YouTubeVideoQuality.medium360] ?? streamURLs[YouTubeVideoQuality.small240]) {
                playerViewController?.player = AVPlayer(url: streamURL)
            } else {
                self.dismiss(animated: true, completion: nil)
            }
        }
    }
}

YouTube TOS and Appstore policyにあるようにYoutubeのポリシーに反してしまっているようなのでアプリを審査に出す時リジェクトされる確率が上がってしまうかもしれません。

小さい画面での再生

READMEにPresent the video in a non full-screen viewという欄があってObj-cで何やらやってるっぽかったのですが、うまく動かなかったので自己流で小さい画面での動画再生を実装してみました。

動画を流すViewの作成

動画を流す領域を作成するためにCustomViewを作ります、Appleのドキュメントに良い感じのコードがあったのでぱくってきました。

AVPlayerLayer – AVFoundation | Apple Developer Documentation

class PlayerView: UIView {
    
    var player: AVPlayer? {
        get { return playerLayer.player }
        set { playerLayer.player = newValue }
    }
    
    var playerLayer: AVPlayerLayer {
        return layer as! AVPlayerLayer
    }
    
    override static var layerClass: AnyClass {
        return AVPlayerLayer.self
    }
}

呼び出し側のコード

小さい画面で動画を流したい用途としてはインライン再生だと思うので、無音にして再生するコードを作ってみました。

class ViewController: UIViewController {

    @IBOutlet weak var playerView: PlayerView!
    var player = AVPlayer()
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        playVideo(videoID: "再生したい動画のVideoID")
    }
    
    struct YouTubeVideoQuality {
        static let hd720 = NSNumber(value: XCDYouTubeVideoQuality.HD720.rawValue)
        static let medium360 = NSNumber(value: XCDYouTubeVideoQuality.medium360.rawValue)
        static let small240 = NSNumber(value: XCDYouTubeVideoQuality.small240.rawValue)
    }

    func playVideo(videoID: String?) {
        XCDYouTubeClient.default().getVideoWithIdentifier(videoID) { [weak self] (video: XCDYouTubeVideo?, error: Error?) in
            if let streamURLs = video?.streamURLs, let streamURL = (streamURLs[XCDYouTubeVideoQualityHTTPLiveStreaming] ?? streamURLs[YouTubeVideoQuality.hd720] ?? streamURLs[YouTubeVideoQuality.medium360] ?? streamURLs[YouTubeVideoQuality.small240]) {
                self?.player = AVPlayer(url: streamURL)
                self?.playerView.player = self?.player
                self?.player.volume = 0
          // 動画の再生
                self?.player.play()
            }
        }
    }
}

参考文献

AVPlayerLayer – AVFoundation | Apple Developer Documentation

[iOS]動画を再生する(AVPlayerLayer使用)

0xced/XCDYouTubeKit

メディアファイルの扱い 3 – AVPlayer

Swift

前の記事

GKObstacleで障害物を作る
ARKit

次の記事

ARKitでGeometoryの配置と重力