Swift 3에서 m3u8 스트리밍 파일 플레이하는 방법

2017. 5. 14. 22:49아이폰 개발

별도의 라이브러리 없이 쉽게 플레이가 된다.

import AVKit

import Foundation

import AVFoundation

var player:AVPlayer!

...

guard let url = URL(string: "https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/bipbop_4x3_variant.m3u8") else { return }

let playerItem = AVPlayerItem(url: url)

player = AVPlayer(playerItem: playerItem)

player?.play()

http://stackoverflow.com/questions/42665545/hls-m3u8in-ios-10


단, 주의할 점은 mp3 스트리밍과 달리 m3u8의 경우 해당 음원의 전체 플레이 타임을 직접 알수 있는 방법이 없다.

그래서 프로그레스 컨트롤을 이용하여 플레이 타임을 표시하거나 seek 기능을 구현하고 싶어도 불가능하다.

별도의 메타정보를 수신하여 처리하는 방법 밖에 없는 듯.


쓸만한 오디오 스트림 예제 프로젝트

https://github.com/harshalrj25/audioStreamDemo


백그라운드 플레이를 지원하는 Jukebox 프레임워크

https://github.com/teodorpatras/Jukebox


Core Audio Essentials에 대해서는 다음 내용을 참고한다.

https://developer.apple.com/library/content/documentation/MusicAudio/Conceptual/CoreAudioOverview/CoreAudioEssentials/CoreAudioEssentials.html#//apple_ref/doc/uid/TP40003577-CH10-SW1


--------------------


동영상 플레이하는 방법!


우선 화면에 보이도록 해주는 AVPlayerView를 정의한다

https://swifter.kr/2016/10/28/avplayerlayer%EB%A5%BC-uiview%EC%9D%98-%EB%A0%88%EC%9D%B4%EC%96%B4%EB%A1%9C-%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0/

final class AVPlayerView : UIView {
  override public class var layerClass: Swift.AnyClass {
    get {
      return AVPlayerLayer.self
    }
  }
 
  private var playerLayer: AVPlayerLayer {
    return self.layer as! AVPlayerLayer
  }
 
  func player() -> AVPlayer {
    return playerLayer.player!
  }
 
  func setPlayer(player: AVPlayer) {
    playerLayer.player = player
  }
 
  func setVideoFillMode(fillMode: String) {
    playerLayer.videoGravity = fillMode
  }
 
  func videoFillMode() -> String {
    return playerLayer.videoGravity
  }
}


그다음 AVPlayerView를 AVPlayer 객체인 videoPlayer와 연결해준다.

http://stackoverflow.com/questions/37937036/playing-hls-m3u8-in-cocoa-os-x-avplayer-swift

import Cocoa
import AVKit
import Foundation
import AVFoundation

class ViewController: NSViewController {

    @IBOutlet weak var playerView: AVPlayerView!

    var videoPlayer:AVPlayer!

    override func viewDidLoad() {
        super.viewDidLoad()

        //let path = NSBundle.mainBundle().pathForResource("sample", ofType: "mov")
        //var fileURL = NSURL(fileURLWithPath: path!)
        let fileURL = NSURL(string: "http://qthttp.apple.com.edgesuite.net/1010qwoeiuryfg/sl.m3u8")
        let avAsset = AVURLAsset(URL: fileURL!, options: nil)

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

    override var representedObject: AnyObject? {
        didSet {
            // Update the view, if already loaded.
        }
    }
}