zoukankan      html  css  js  c++  java
  • iOS音频与视频的开发(一)-使用AVAudioPlayer播放音乐、使用AVPlayerViewController播放视频

      iOS的多媒体支持非常强大,它提供了多套支持多媒体的API,无论是音频、视频的播放,还是录制,iOS都提供了多种API支持。借助于这些API的支持,iOS应用既可以查看、播放手机相册中的照片、视频,也可以播放来自网络的视频.iOS也提供了对摄像头、麦克风的支持。

    1、使用AVAudioPlayer播放音乐

      AVAudioPlayer比较简单,当控制AVAudioPlayer对象装载音频完成后,就可以调用AVAudioPlayer的如下方法进行播放控制了。

      如:play/pause/stop/prepareToPlay.

      其中:如果调用play方法时,如果音频还没有准备好,程序会隐式先执行prepareToPlay方法。

      除此之外,AVAudioPlayer还提供了如下属性来访问音频文件的相关信息。

      playing:该属性(只读)返回播放器是否正在播放。

      pan:该属性用于设置或返回立体声平衡。如果该属性设为-1.0,则完全在左边播放;如果设为0.0则左右音量相同;如果设为1.0,则完全右边播放。

      enableRate:是否允许改边播放速率。

      numberOfLoops:设置循环次数。如果为-1标识无限循环。

      numberOfChannels:返回音频的声道数目。

      duration:音频的持续时间

      currentTime:获取音频的播放点。

      url:返回播放器关联的音频URL。

     案例代码:

    import UIKit
    import AVKit
    class NADiscoverViewController : UIViewController {
        
        lazy var audioPlayer = AVAudioPlayer.init()
        var durationTime:Float = 0.0 //播放时长
        var timer : Timer?
        
        lazy var startBtn : UIButton = {
            let startBtn = UIButton()
            startBtn.setImage(UIImage.init(named: "bofang"), for: .normal)
            startBtn.addTarget(self, action: #selector(playAction(sender:)), for: .touchUpInside)
            return startBtn
        }()
        
        lazy var finishBtn : UIButton = {
            let finishBtn = UIButton()
            finishBtn.setImage(UIImage.init(named: "jieshu"), for: .normal)
            finishBtn.addTarget(self , action: #selector(endAction(sender:)), for:.touchUpInside)
            return finishBtn
        }()
        
        lazy var progress : UIProgressView = {
            let progress = UIProgressView()
            return progress
        }()
        
        lazy var messageLabel : UILabel = {
            let messageLabel = UILabel()
            messageLabel.text = "时长"
            messageLabel.numberOfLines = 0
            return messageLabel
        }()
        
        override func viewDidLoad() {
            super.viewDidLoad()
            self.navigationItem.title = "发现"
            
            setSubViewConstraints()
            let fileURL : URL = Bundle.main.url(forResource: "a", withExtension: "mp3")!
            
            do {
                let player : AVAudioPlayer = try AVAudioPlayer.init(contentsOf: fileURL)
                audioPlayer = player
            }catch{}
            let str = String.init(format: "音频文件的声道数:%d
    音频文件的持续时间:%g", audioPlayer.numberOfChannels,audioPlayer.duration)
            messageLabel.text = str
            durationTime = Float(audioPlayer.duration)
            //将循环次数设为-1,用于指定该音频文件循环播放
            audioPlayer.numberOfLoops = -1
            audioPlayer.delegate = self
        }
        
        @objc func playAction(sender:UIButton) -> Void {
            if audioPlayer.isPlaying {
                audioPlayer.pause()
                startBtn.setImage(UIImage.init(named: "bofang"), for: .normal)
            } else {
                audioPlayer.play()
                startBtn.setImage(UIImage.init(named: "zanting"), for: .normal)
            }
            if timer == nil {
                timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(updateProge), userInfo: nil, repeats: true)
            }
        }
        @objc func endAction(sender:UIButton) -> Void {
            audioPlayer.stop()
            timer?.isValid
            timer = nil
        }
        
        @objc func updateProge() {
            progress.progress = Float(audioPlayer.currentTime) / durationTime
        }
        func setSubViewConstraints() -> Void {
            view.addSubview(startBtn)
            startBtn.snp.makeConstraints { (make) in
                make.top.equalTo(100)
                make.left.equalTo(50)
                make.width.height.equalTo(50)
            }
            
            view.addSubview(finishBtn)
            finishBtn.snp.makeConstraints { (make) in
                make.top.equalTo(startBtn)
                make.right.equalTo(-50)
                make.width.height.equalTo(50)
            }
            
            view.addSubview(progress)
            progress.snp.makeConstraints { (make) in
                make.top.equalTo(startBtn.snp_bottom).offset(30)
                make.left.equalTo(50)
                make.right.equalTo(-50)
            }
            view.addSubview(messageLabel)
            messageLabel.snp.makeConstraints { (make) in
                make.top.equalTo(progress.snp_bottom).offset(30)
                make.left.equalTo(50)
                make.right.equalTo(-50)
            }
        }
    }
    
    extension NADiscoverViewController : AVAudioPlayerDelegate {
        //当audioplayer播放完成后将会自动播放
        func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
            if player == audioPlayer && flag {
                print("播放完成")
                
            }
        }
        
        func audioPlayerBeginInterruption(_ player: AVAudioPlayer) {
            if player == audioPlayer {
                print("被中断了")
            }
        }
    }
    播放本地音乐

     效果图:

    2、使用AVPlayerViewController播放视频

      支持的视频编码格式很有限:H.264、MPEG-4,扩展名(压缩格式):.mp4、.mov、.m4v、.m2v、.3gp、.3g2等,如果是RMVB就不行了,需要借助第三方的框架来实现更多格式的支持。

      使用AVPlayerViewController之前先导入AVKit头文件

      AVPlayerViewController中集成了AVPlayer,AVPlayer提供了一些方法可以轻易实现对视频播放的控制

      如:play/pause/status

      AVPlayerViewController常用属性:

      showsPlaybackControls:是否显示回放控制

      entersFullScreenWhenPlaybackBegins:开启这个播放的时候支持(全屏)横竖屏

      exitsFullScreenWhenPlaybackEnds:开启这个播放结束的时候,可以退出全屏

      案例代码:

    import UIKit
    import AVKit
    class NAPublishViewController : UIViewController {
        var moviePlayer = AVPlayerViewController.init()
        override func viewDidLoad() {
            super.viewDidLoad()
            
            let movieUrl : URL = Bundle.main.url(forResource: "movie", withExtension: "mp4")!
            //使用指定的url创建MPMoviesPlayerController
            moviePlayer.player = AVPlayer.init(url: movieUrl)
            //是否显示回放控制
            moviePlayer.showsPlaybackControls = true
            //开启这个播放的时候支持(全屏)横竖屏
            if #available(iOS 11.0, *) {
                moviePlayer.entersFullScreenWhenPlaybackBegins = true
            }
            //开启这个播放结束的是否,可以退出全屏
            if #available(iOS 11.0, *) {
                moviePlayer.exitsFullScreenWhenPlaybackEnds = true
            }
            view.addSubview(moviePlayer.view)
            //判断moviePlayer已经准备好视频第一播放帧
            if moviePlayer.isReadyForDisplay {
                moviePlayer.player?.play()
            }
            
        }
        
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    }
    AVPlayerViewController播放视频

      通过上面几行代码,就可以实现本地或网络视频的播放。

            

  • 相关阅读:
    泛型集合的变化
    c#中结构与类的区别
    C# where子句
    C# 泛型学习
    about osgeo中国
    about codeplex
    content in map
    a excellent website for javascrpt & dhtml:
    MapGuide open source开发系列教程四: 体系结构(转贴)
    about NetTopologySuite
  • 原文地址:https://www.cnblogs.com/xjf125/p/10919477.html
Copyright © 2011-2022 走看看