Avplayer Won't Let Me Access Url

AVPlayer won't let me access URL

I found your question after you commented on a question I had answered previously, so lets continue here :)

I can get your code working by combining my original answer to that question with the answer provided by @callam above so...give him the credit for the correct answer :)

To summarize, you need to:

  1. Add a AVPlayerView to your Storyboard and connect it to your ViewController
  2. Setup your ViewController
  3. Manage App Transport Security and the outgoing connection.

In greater detail

1. Add a AVPlayerView to your Storyboard and connect it to your ViewController

Drag a AVKit Player View to your view in the storyboard

Add AVKit player view

In your ViewController class, create an outlet for the view:

 @IBOutlet weak var playerView: AVPlayerView!

And connect it.

2. Setup your ViewController

Here is my code:

import Cocoa
import AVKit

class ViewController: NSViewController {

@IBOutlet weak var playerView: AVPlayerView!

override func viewDidLoad() {
super.viewDidLoad()

let fileURL = URL(string: "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4")
let avAsset = AVURLAsset(url: fileURL!, options: nil)

let playerItem = AVPlayerItem(asset: avAsset)
let videoPlayer = AVPlayer(playerItem: playerItem)
playerView.player = videoPlayer
videoPlayer.play()
}
}

Seems familiar no :)

Notice I create the videoPlayer right here, no need to for me to use the let playerView = self.playerView you mention in your comments.

If you just do these two steps, you end up with a player view that cannot play video and errors in your console. So you need to add the final piece to the puzzle, kindly provided by @callam above.

3. Manage App Transport Security and the outgoing connection.

First, if you cannot use a HTTPS connection you must allow HTTP connections in your info.plist file.

Here is my .plist file in its entirety

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSMinimumSystemVersion</key>
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2017 :) </string>
<key>NSMainStoryboardFile</key>
<string>Main</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
</dict>
</plist>

The important part being the NSAppTransportSecurity part

And then finally, you must enable Outgoing Connections (Client) under Capabilities of your project

enable Outgoing Connections

If I do that, I end up with this:

The final result

But notice though, that I still see errors in the console.

Hope you are able to get to the same result following these steps :)

How to reload data for AVPlayer, if URL failed swift

Solution:

 private var player: AVPlayer? {
didSet{
if player?.currentItem?.status == .failed {
if indexOfURL >= 0 {
prepareForPronunciation(indexOfURL)
}
}
}
}

If URLs are over, set indexOfURL equals -1, otherwise increment it to use next URL in the next function call



Related Topics



Leave a reply



Submit