2017-12-29 40 views
1

、機能していないAVPlayerViewControllerにバックエンドからAWSの動画のURLを表示しようとしています。ビデオURLがテーブルビューに表示されず、デバッガでこのエラーがスローされます。スウィフト4 - 私はAWSから画像のURLまたはAWSからも動画のURLから生成されたサムネイルのいずれかを保持するためにUIImageを設定し、テーブルビューを持っている奇妙なエラーが出ます

私は画像や動画のURLのいずれかを表示するには、セルをクリックすると、それは正しくビデオプレーヤーにsegues
2017-12-29 12:20:37.053337-0800 VideoFit[3541:1366125] CredStore - performQuery - Error copying matching creds. Error=-25300, query={ 
    class = inet; 
    "m_Limit" = "m_LimitAll"; 
    "r_Attributes" = 1; 
    sync = syna; 
} 

、その後、私は再びエラーを取得し、三角形のスタートボタン何があることを意味しない、それを通る線を持っています再生するビデオ。

videoplayererror

しかし、私はそれは問題ではないので、それが正常に渡されたURLを印刷するとき、問題がAVPlayerが何らかの理由で私のAWS動画のURLを扱うことができないです。それは、それは安全でなければならないことを意味するが、私はすでに真

ここ
<key>NSAppTransportSecurity</key> 
<dict> 
    <key>NSAllowsArbitraryLoads</key> 
    <true/> 
</dict> 

に私の任意の負荷を設定し、いくつかのVideoPlayer VCに自分の動画を表示するためのコードとサムネイルジェネレータ関数であるので、それはおそらく、HTTPSリンクありこれらにはいくつか問題がありますか?

import UIKit 
import AVKit 
import MediaPlayer 

class VideoPlayerVC: AVPlayerViewController { 

    var urlToPlay: String? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     print("Here is the url ---> \(String(describing: urlToPlay))") 
     playVideo() 
    } 

    private func playVideo() { 

     guard let urlFromString = urlToPlay else { print("No url to play") ;return } 
     let url = URL(string: urlFromString) 
     print("Here is the url to play ---> \(String(describing: url))") 
     let asset: AVURLAsset = AVURLAsset(url: url!) 
     let item: AVPlayerItem = AVPlayerItem(asset: asset) 
     let player: AVPlayer = AVPlayer(playerItem: item) 

     self.player = player 
     self.showsPlaybackControls = true 

     self.player?.play() 
    } 
} 

これは私のcellforRow atIndexPath方法は、それがテーブルビュー内のすべてのビデオオブジェクトのために、このエラーがスローされます実行したとき、私は、サムネイルを作る方法です。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    if let cell = tableView.dequeueReusableCell(withIdentifier: "sortedExerciseCell") as? SortedExerciseCell! { 
     // Do if check for videoURI and imageURI 
     if selectedExerciseArray[indexPath.row].imageURI != nil { 
      if let imageURI = URL(string: selectedExerciseArray[indexPath.row].imageURI!) { 
       print("It's a photo!") 
       // Using DispatchQueue.global(qos: .background).async loads cells in background 
       DispatchQueue.global(qos: .background).async { 
        let data = try? Data(contentsOf: imageURI) 

        DispatchQueue.main.async { 
         cell.exerciseImg.image = UIImage(data: data!) 
        } 
       } 
      } 
     } else { 
      if let videoURI = URL(string: selectedExerciseArray[indexPath.row].videoURI!) { 
       print("It's a video!") 
       print(videoURI) 
       DispatchQueue.global(qos: .background).async { 
        DispatchQueue.main.async { 
         cell.exerciseImg.image = self.thumbnailForVideoAtURL(url: videoURI) 
        // for every video object the above error is thrown!!! 
        } 
       } 
      } 
     } 
     cell.exerciseName.text = selectedExerciseArray[indexPath.row].name 
     return cell 
    } else { 
     return UITableViewCell() 
    } 
} 

// Used to just display the video thumbnail in cell, when clicked on will display video as needed 

private func thumbnailForVideoAtURL(url: URL) -> UIImage? { 

    let asset = AVAsset(url: url) 
    let assetImageGenerator = AVAssetImageGenerator(asset: asset) 

    do { 
     print("Doing the video thumbnail from backend") 
     let imageRef = try assetImageGenerator.copyCGImage(at: CMTimeMake(1, 60) , actualTime: nil) 
     return UIImage(cgImage: imageRef) 
    } catch { 
     print("This is failing for some reason") 
     print("error") 
     return nil 
    } 
} 

ほとんどは固定またはすることができないiOSの11のバグにそれをチョーキング、私はこれについて、スタックオーバーフロー上の同様の質問を見てきましたが、どれもこの問題を解決する方法についての完全な答えを与えているように見えるんトランスポートセキュリティ(すでに任意の負荷がかかるため、これは問題にはなりません)。他の誰かが動作する可能性のあるアプローチはありますか?

  • 重要な注意 - マイバックエンドの開発者のみが、Webページから動画のURLを表示することができ、他の言葉で、彼はウェブからダウンロードした後にビデオを表示するための基本的なウェブサイトを作る必要があります。私は、これはAWSからのビデオのURLのを処理するための標準的な手順であるのかはわからないが、私はのUIViewControllerがWKUIDelegateに準拠したカスタムの「loadHTMLString」でURLをロードしようとすることを決めた、私はビデオを見たが、同じような状況がどこ三角起こりますビデオが再生できないことを示すスタートボタンが横切っている。私はこの時点で他に何ができるかは分かりません。何か助けていただければ幸いです。

  • は、ここで私は私のバックエンドから引っ張ってきたリンクのいずれかです。 https://videofitapptestbucket.s3.us-west-2.amazonaws.com/100001427750

+0

実際の動画リンクを投稿するとよいでしょう。 –

+0

私は私のポストを編集した、ここでのURLです:https://videofitapptestbucket.s3.us-west-2.amazonaws.com/100001427750 – Jumpman987

+0

URLは拡張子 –

答えて

1

試してみてください。

if let path = urlToPlay { 
    let url = URL(string: path)! 
    let videoPlayer = AVPlayer(url: url) 
    self.player = videoPlayer 
    DispatchQueue.main.async { 
     self.player?.play() 
    } 
} 

は、あなたの問題は、ファイルの拡張子であると思われviewDidAppear()方法

+0

を持っていない私はそれを試してみましたが、まだ前と同じエラーを得ました、それ以上のアイデア? – Jumpman987

1

でそれを呼び出します。 DMSはOSによって認識されないため、assetgeneratorを使用してイメージを作成するときにスローされます。

Error Domain=AVFoundationErrorDomain Code=-11828 "Cannot Open" UserInfo={NSLocalizedFailureReason=This media format is not supported., NSLocalizedDescription=Cannot Open, NSUnderlyingError=0x6040000534d0 {Error Domain=NSOSStatusErrorDomain Code=-12847 "(null)"}}

ので、サーバー上のファイルの名前を変更します。 mp4の拡張子はあなたのファイルでうまくいくようです。Appleはそれは未定義の動作になりますことを言うように

また、AVPlayerViewControllerをサブクラス化することは、一般的にその素晴らしいアイデアではありません。 (読んだ:ランダムな混乱)。 AVPlayerを内部に持つクラスを使用することをお勧めします。

+0

はい、これはまさに私が考えていたものです。私はバックエンド開発者とこれについて議論する必要があります。レスポンスありがとう! – Jumpman987

関連する問題