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

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

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

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

Q&A

解決済

1回答

2458閲覧

Swift 動画のストリーミング再生が出来ない

globalplus

総合スコア119

Swift

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

0グッド

0クリップ

投稿2020/07/07 16:28

動画のストリーミング再生をしたいのですが出来ません。
元々、ビデオプレイヤーが下から出てきて全画面で再生する仕様だったのですが
UIViewの中だけで再生させたいので以下のコードにしました
しかし全画面レイヤーが立ち上がり、何も再生されず、全画面レイヤーを閉じるとサムネだけがUIViewに表示されるという事になってしまいました。
アドバイスよろしくお願いします

import UIKit import AVFoundation import AVKit class ViewController: UIViewController { @IBOutlet weak var label: UILabel! @IBOutlet weak var Play_View: UIView! override func viewDidLoad() { super.viewDidLoad() } func playMovieFromUrl(movieUrl: URL?) { if let movieUrl = movieUrl { let videoPlayer = AVPlayer(url: movieUrl) let playerController = AVPlayerViewController() playerController.player = videoPlayer //レイヤー生成(これが間違っている?) let playerLayer = AVPlayerLayer(player: videoPlayer) playerLayer.frame = self.Play_View.bounds self.Play_View.layer.addSublayer(playerLayer) self.present(playerController, animated: true, completion: { videoPlayer.play() }) } else { print("cannot play") } } func playMovieFromPath(moviePath: String?) { if let moviePath = moviePath { self.playMovieFromUrl(movieUrl: URL(fileURLWithPath: moviePath)) } else { print("no such file") } } //labelによって再生動画を分けている。labelのテキスト内容は遷移する時に値渡しをして分けている func Play(){ if label.text == "りんご"{ playMovieFromUrl(movieUrl: URL(string: "https://d2qguwbxlx1sbt.cloudfront.net/TextInMotion-VideoSample-576p.mp4")) }else if label.text == "みかん"{ playMovieFromUrl(movieUrl: URL(string: "みかん動画")) } } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

ご質問のコードだと、 UIVeiw にビデオ画像を表示する処理と、AVPlayerViewControllerに表示させる処理の両方が記述されています。

また、present()AVPlayerViewControllerの表示と、表示完了後にUIVewで表示させる処理の両方を記述してしまっているため、

しかし全画面レイヤーが立ち上がり、何も再生されず、全画面レイヤーを閉じるとサムネだけがUIViewに表示されるという事になってしまいました。

という状態になっていると思います。

AVPlayerViewControlerを使わずに(全画面表示させず、かつ再生ボタンなども表示しない)映像だけを表示したいのであれば、こんな感じで再生できました。

ここでは、View がロードされた時点で再生を行っていますが、必要に応じて再生のタイミングを調整していただければと思います。

メソッド名や変数名は Swift 流に書き換えてありますので、適宜読み替えていただければと思います。

Swift

1 func playMovieFromUrl(movieUrl: URL?) { 2 if let movieUrl = movieUrl { 3 let videoPlayer = AVPlayer(url: movieUrl) 4 5 // コントローラが必要なければ不要 6 // let playerController = AVPlayerViewController() 7 // playerController.player = videoPlayer 8 9 let playerLayer = AVPlayerLayer(player: videoPlayer) 10 playerLayer.frame = self.playerView.bounds 11 self.playerView.layer.addSublayer(playerLayer) 12 13 // ここで再生する 14 videoPlayer.play() 15 16 // playerViewController を使うのであれば、present()で表示する必要がある。 17 // completion: は再生完了したあとに実行する処理を記述 18 // self.present(playerController, animated: true, completion: { 19 // videoPlayer.play() 20 // }) 21 } else { 22 print("cannot play") 23 } 24 }

投稿2020/07/07 23:24

編集2020/07/07 23:24
TsukubaDepot

総合スコア5086

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

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

globalplus

2020/07/08 03:33

見事再生されました! いつもありがとうございます。
globalplus

2020/07/08 04:23 編集

UIView内に透明なUIButtonを配置しました。それを押すと 全画面レイヤーが出てくるにはどうしたら良いですか?
TsukubaDepot

2020/07/08 04:38

その透明ボタンを押したときのアクションで、AVPlayerViewController() を生成し present で表示するようにすると良さそうに思えますが、いかがでしょうか。 ボタンを押すよりも、UIView にタップジェスチャを関連づけた方がパフォーマンス的にはよいかもしれません(透過処理はコストが高そうなので)。
globalplus

2020/07/08 05:59 編集

>その透明ボタンを押したときのアクションで、AVPlayerViewController() を生成し present で表示するようにすると良さそうに思えますが、いかがでしょうか それが良いのですが実装方法がわかりませんので丸投げ質問となってしまいそうですが教えて頂く事は出来ますか? >ボタンを押すよりも、UIView にタップジェスチャを関連づけた方がパフォーマンス的にはよいかもしれません(透過処理はコストが高そうなので)。 透明というのはUIButtonの名前を消しただけです。
TsukubaDepot

2020/07/08 06:11

この前別のご質問でコメントしたリンク https://developer.apple.com/documentation/avfoundation/media_playback_and_selection/creating_a_basic_video_player_ios_and_tvos の「Implement Playback Behavior」をボタンを押したときの処理として実装すれば良いかと思います。 > 透明というのはUIButtonの名前を消しただけです。 実際にOS内でどのような処理を行なっているか分からないので何とも言えませんが、映像が逐次更新する View の上に部品を乗せていると、ラベル名を消しただけであっても実際は何らかの更新処理が行われていそうな感じがしたので、コストが高い(余計な計算コストがかかる)と思った次第です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問