質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

YouTube

YouTubeとはユーザーがビデオをアップロード・共有・閲覧できるビデオ共有ウェブサイトです。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2195閲覧

Swift 画面が開いても、動画が再生されない

KaoruYoshida

総合スコア36

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

YouTube

YouTubeとはユーザーがビデオをアップロード・共有・閲覧できるビデオ共有ウェブサイトです。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/10/27 13:06

編集2021/10/27 13:14

前提・実現したいこと

ボタンを押すと、youtube上の動画が再生される、というプログラムを作っています。
実装中、以下の問題が発生しました。

発生している問題

ボタンをタップすると、再生する画面は開くのですが、肝心の動画が再生されません。
↓ずっとローディングで、このような状態です。
イメージ説明

該当のソースコード

swift

1import UIKit 2import AVFoundation 3import MediaPlayer 4import AVKit 5 6class RecipeDetailViewController: UIViewController{ 7 8 @IBOutlet var playButton: UIButton! 9 10 var player: AVPlayer? 11 12 13 @IBAction func playVideo() { 14 print("playvideoが呼ばれた") 15 guard let url = URL(string: "https://www.learningcontainer.com/wp-content/uploads/2020/05/sample-mp4-file.mp4") else { return } 16 17 // Create an AVPlayer, passing it the HTTP Live Streaming URL. 18 player = AVPlayer(url: url) 19 20 // Create a new AVPlayerViewController and pass it a reference to the player. 21 let controller = AVPlayerViewController() 22 controller.player = player 23 24 25 // Modally present the player and call the player's play() method when complete. 26 self.present(controller, animated: true) {[self] in 27 print("presentが呼ばれた") 28 player!.play() 29 } 30 } 31 32 override func viewDidLoad() { 33 super.viewDidLoad() 34 35 playButton.setTitle("", for: UIControl.State.normal) 36 playButton.tag = 0 37 playButton.addTarget(self, action: #selector(self.tappedVideo(_ :)), for: .touchUpInside) 38 39 } 40 41 @objc func tappedVideo(_ sender: UIButton){ 42 playVideo() 43 print("ボタンがタップされた") 44 } 45} 46

試したこと

  • YouTubeのリンクに問題があるのかと思って、変えてみました。
  • printによると、

playvideoが呼ばれた→ボタンがタップされた→presentが呼ばれた
の順で呼ばれました。

  • guard let url = URL(string: "https://www.learningcontainer.com/wp-content/uploads/2020/05/sample-mp4-file.mp4")


player = AVPlayer(url: url)
@IBAction func playVideo()のかっこの外に出してみました。

が、いずれも、初めにあげた問題と同じ状態になりました。

お分かりになる方、回答よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

問題と考えられる点

質問の中で提示されたコードには以下2つの問題があるようです。

1. URLで指定された動画を再生できない

https://www.learningcontainer.com/wp-content/uploads/2020/05/sample-mp4-file.mp4 にアクセスしても動画が再生されないようです。MacのSafariでアクセスしてみても動画が再生できませんでした。アクセス先に再生可能な動画が存在していないのではないでしょうか?
試しに、別のURL( https://devstreaming-cdn.apple.com/videos/wwdc/2019/502gzyuhh8p2r8g8/502/502_hd_introducing_lowlatency_hls.mp4?dl=1 )にアクセスしてみたところ、その動画は再生できました。

2. AVPlayerViewController を表示する処理が二重に実行される

playButton のタップ時には、以下2つの処理がそれぞれ実行されます。

  1. addTarget(_:action:for:) で設定された tappedVideo(_:)
  2. @IBAction にて関連づけられた playVideo()

tappedVideo(_:) の内部では playVideo() を呼び出すため、結果として playVideo() が二重に呼び出されることになり、 playVideo() 内部における AVPlayerViewController 表示処理が二重で実行されます。

修正例

上記の問題と考えられる点を踏まえて、以下のような修正例を考えました。
質問内のコードでは、試行錯誤した時のコードが残っているようでしたので、ついでに不要なコードを削除して整理した形としております。

この例では、ボタンがタップされた時に playButtonDidTap(_:) が呼び出されるようにInterface Builderで設定されているものとします。

swift

1import UIKit 2import AVKit 3 4class ViewController: UIViewController { 5 6 @IBAction func playButtonDidTap(_ sender: AnyObject) { 7 guard let url = URL(string: "https://devstreaming-cdn.apple.com/videos/wwdc/2019/502gzyuhh8p2r8g8/502/502_hd_introducing_lowlatency_hls.mp4?dl=1") else { return } 8 let controller = AVPlayerViewController() 9 controller.player = AVPlayer(url: url) 10 present(controller, animated: true) { 11 controller.player?.play() 12 } 13 } 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 } 18}

投稿2021/10/27 16:09

__k_san__

総合スコア177

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KaoruYoshida

2021/10/27 21:14

ご丁寧なお返事ありがとうございます。 とても納得いたしました。また何かあれば、よろしくお願いします。
KaoruYoshida

2021/10/28 12:49 編集

__k_san__さま、少し質問よろしいですか? 自分で試してみたところ、指定いただいた別のURLだと再生されました。 2についても修正してみて、結果URLに問題があることが分かりました。 どうやらYouTubeだとダメなようでして、、 差し支えなければ、YouTubeのリンクでもお試しいただけますでしょうか?
__k_san__

2021/11/01 06:21

YouTubeの動画ページのURLを指定しても、AVPlayerでは動画を再生することはできません。 この点についいての事情は、以下のページが参考になるかもしれません。 https://stackoverflow.com/questions/29018916/how-to-play-a-youtube-video-in-swift-using-avplayer https://stackoverflow.com/questions/25743208/how-to-play-youtube-video-using-url-in-avplayer-ios また、どうしてもアプリ内でYouTubeの動画を再生したいのであれば、以下のような情報が参考になるかもしれません。 https://qiita.com/john-rocky/items/4ecb7eddc9838fb31d65
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問