音視頻相關及地圖

音視頻相關:

1.語音合成器

let synthesizer = AVSpeechSynthesizer()
let utterance = AVSpeechUtterance(string:”需要讀的內容”)
synthesizer.speakUtterance(utterance)

2.音頻播放器

需要在類中聲明一個屬性
var player:AVAudioPlayer!
a.獲取音頻的路徑
let url = NSBundle.mainBundle().URLForResource("月半小夜曲", withExtension: ".mp3")

b. player = try! AVAudioPlayer(contentsOfURL: url)

c.其他設置
  // 緩沖音樂文件(播放音樂之前先緩沖)
   player.prepareToPlay()
        
  // 設置播放音量(0~1,可以調大于1,但是聲音也有可能失真)
    player.volume = 0.5
        
  // 指定從200開始播放
  // player.currentTime = 200
        
   // 允許變速播放
    player.enableRate = true
        
    // 設置倍速()
     player.rate = 1.2
        
    // 設置無限循環播放(負數為無限)
    player.numberOfLoops = -1
        
    // 播放
     player.play()
    //當前播放時間點
     print(player.currentTime)
    // 音樂的時長
    print(player.duration)
  

2.1、想要設置后臺播放的話,必須設置會話還有設置Xcode中Capabilities中BackgrounndModes這一選項,在第一行打鉤

   創建一個音頻會話對象設置支持后臺播放(Xcode的設置和這個代碼缺一不可)
        //創建會話
        let session = AVAudioSession()
        // 支持后臺播放
        do {
         //激活會話
            try session.setActive(true)
            //設置音頻會話的類別(支持后臺播放的類別)
            try session.setCategory(AVAudioSessionCategoryPlayback, withOptions: [])
        } catch {

            print("不支持后臺播放")

        }

2.2、 顯示音頻的內容

 if let url = NSBundle.mainBundle().URLForResource("月半小夜曲", withExtension: ".mp3"{

    //通過創建AVURLAsset對象用來獲取音視頻文件的元數據

    let assets = AVURLAsset(URL: url)

    //dataItem元數據項
    print(assets.metadata)

            for dataItem in assets.metadata

            {

                if let key = dataItem.commonKey

                {

                    switch key

                    {

                    case "artist":

                        artistLabel.text = dataItem.value as? String

                    case "title":

                        titleLabel.text = dataItem.value as?String

                    case "albumName":

                        albumLabel.text = dataItem.value as? String

                    case "artwork":

                        if let data = dataItem.value as? NSData

                        {

                            coverImageView.image = UIImage(data: data)

                        }

                    default: break

                    }

                }

   
        

3.錄音

import UIKit

import AVFoundation



class ViewController: UIViewController {
    //不能放到方法里,,不然沒人接管他的生命周期
    var recorder:  AVAudioRecorder?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        
    }
    @IBAction func startRecordd(sender: UIButton) {
        
        //
        //如果為空就創建recorder
        if recorder == nil
        {
            sender.setTitle("結束錄音", forState: .Normal)
            //字典
            let mySettings: [String:AnyObject] = [
                //設置錄音質量
                AVEncoderAudioQualityKey:AVAudioQuality.Low.rawValue,
                //比特率(16為字符串常量)
                AVEncoderBitRateKey: 16,
                //聲道數
                AVNumberOfChannelsKey:2,
                //采樣頻率
                AVSampleRateKey:44100
            ]
            
            // 拿到沙盒路徑(把當前路徑存到沙盒中)
            let filePath = NSHomeDirectory().stringByAppendingString("/Documents/test.caf")
            print(filePath)
            // 創建URL
            let url = NSURL(fileURLWithPath: filePath)
            
            self.recorder = try! AVAudioRecorder(URL: url, settings: mySettings)
            //開始錄音
            recorder?.record()

        } else {
            
            sender.setTitle("開始錄音", forState: .Normal)
            recorder?.stop()
            recorder = nil
        }
       
        
       
        
        
       
    }

}

4.播放視頻


import UIKit
import AVFoundation
import AVKit

class ViewController: UIViewController {

//    var player:AVPlayer!
    var timer:NSTimer?
    var isPlaying  = false
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //添加通知觀察者(觀察視頻播放完就停止播放)
        //參數2:選擇器接受到通知,就會停止播放
        //參數3:通知
        //參數4:nil接受所有的對象
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "stop:", name: AVPlayerItemDidPlayToEndTimeNotification, object: nil)
       
        //顯示出來視頻
        //方式1:
//        let layer = AVPlayerLayer(player: player)
//        layer.frame = self.view.bounds
//        //不能直接加到self.view
//        self.view.layer.addSublayer(layer)
//        player.play()

  }
    func stop(sender:NSNotification)
    {
        //播放完后自動停止
       self.dismissViewControllerAnimated(true, completion: nil)
        isPlaying = false
        
    }
    //點擊屏幕開始播放
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        
        //一個視圖控制器中不能模態多個視圖控制器,,模態出來第一個之后就不會模態的第二個了(程序不會崩潰,)
        //方式2:
        if let url =  NSBundle.mainBundle().URLForResource("birds.mp4", withExtension: nil) {
            
            //player已經被playerVC接管了,不會被釋放掉了
             let player = AVPlayer(URL: url)
            
            // AVPlayerViewController可以簡化AVPlayer的使用
            // AVPlayer負責控制視頻的播放停止等
            // AVPlayerViewController負責顯示和提供播放控件
            // AVPlayerViewController是MPMoviePlayerController的替代品,AVPlayerViewController針對iPad還提供了畫中畫功能,,他們是AVKit框架下高度封裝的工具類
            // 如果希望自己定制播放控件那么可以直接使用AVPlayer
            // 先用AVPlayer將視頻顯示出來,
            // 然后用按鈕,滑條,進度條之類的東西來自己的定制播放控件
            
            let playerVC = AVPlayerViewController()
            playerVC.player  = player
            //
            self.presentViewController(playerVC
                , animated: true,completion: {
                    //出來之后就自動播放
                   player.play()
                    
                    
            })
        }

    }
    deinit {
        
        
        //手動移除觀察者
        //移除觀察者后一定要記得手動移除通知觀察者否則有 內存泄漏的風險
        NSNotificationCenter.defaultCenter().removeObserver(self)
        //使用計時器的對象后一定要在deinit中使其失效以避免內存泄漏
        timer?.invalidate()
        timer = nil
        
    }
    
}


5.地圖

import UIKit
import MapKit
class ViewController: UIViewController,CLLocationManagerDelegate {

    //蘋果原生的地圖
    var mapView: MKMapView!
    //核心定位(定位管理器)
    var locationManager: CLLocationManager!
    
    @IBOutlet weak var mapTypeSeg: UISegmentedControl!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 創建定位管理器
        locationManager = CLLocationManager()
        // 綁定事件委托
        locationManager.delegate = self
        
        // 設置精確度(精度越高耗電越大 )
        // 設置導航使用kCLLocationAccuracyBestForNavigation最佳
        locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
        // 距離過濾器(十米之內不用重新定位)
        locationManager.distanceFilter = 10
        
       /*
        case Standard
        case Satellite
        case Hybrid  混合地圖
        @available(iOS 9.0, *)
        case SatelliteFlyover
        @available(iOS 9.0, *)
        case HybridFlyover
      */
  
        
        // 地圖已經顯示出來
        mapView = MKMapView(frame: self.view.bounds)
        //
        mapView.mapType = .SatelliteFlyover  //混合地圖
        //顯示交通狀況
        mapView.showsTraffic = true
        self.view.addSubview(mapView)
        
        //將分段控件放置到整個視圖層次結構的最頂層
        self.view.bringSubviewToFront(mapTypeSeg)

        // 創建坐標(經度和緯度)
        // 參數1:緯度  參數2:經度
        let coordinate = CLLocationCoordinate2DMake(30.6621, 104.041367)
        // 設置跨度
        let span = MKCoordinateSpanMake(0.01, 0.01)
        // 參數1:地圖中心點的經緯度坐標
        // 參數2:地圖跨度(經緯度跨度)
        // 設置地圖的中心點(設置區域)
        let region = MKCoordinateRegionMake(coordinate, span)
        // 設置地圖中心點地區
        mapView.setRegion(region, animated: true)
        
        // 判斷請求授權
        // 獲取定位服務的授權狀態
        let status = CLLocationManager.authorizationStatus()
        // 尚未沒有授權
        if status == .NotDetermined {
            
            // 請求授權一直使用定位服務(可以在后臺使用定位服務)
            locationManager.requestAlwaysAuthorization()
            // 請求授權在應用程序使用期間開啟定位服務
            // locationManager.requestWhenInUseAuthorization()
     
        //之前已拒絕授權
        } else if status == .Denied {
            //提示用戶跳轉設置開啟定位服務
            
            
        } else {
            //開始更新位置信息
            locationManager.startUpdatingLocation()
            //在地圖上顯示用戶當前位置
            mapView.showsUserLocation = true

        }
    }
    
    @IBAction func segAction(sender: UISegmentedControl) {
        
        //Standard:標準地圖, Satellite:衛星地圖  Hybrid:混合地圖
        let typeArray = [MKMapType.Standard,.Satellite,.Hybrid]
        mapView.mapType = typeArray[sender.selectedSegmentIndex]
    }

}


extension ViewController
{
    //定位授權狀態被改變時要執行的方法
    func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
        
        //如果請求定位授權成功就開始更新位置信息并 在地圖上顯示用戶位置
        if status == .AuthorizedAlways || status == .AuthorizedWhenInUse
        {
            manager.startUpdatingLocation()
            mapView.showsUserLocation = true
        }
    }
    
    //更新位置信息后要執行的方法
    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        
        //
        if let location = locations.first
        {
            let span = MKCoordinateSpanMake(0.01, 0.01)
            // 參數1:地圖中心點的經緯度坐標
            // 參數2:地圖跨度(經緯度跨度)
            let region = MKCoordinateRegionMake(location.coordinate, span)
            //設置地區
            mapView.setRegion(region, animated: true)

            
        }
       
        
    }
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,746評論 2 370

推薦閱讀更多精彩內容