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。

 案例代码:

  1. import UIKit
  2. import AVKit
  3. class NADiscoverViewController : UIViewController {
  4.  
  5. lazy var audioPlayer = AVAudioPlayer.init()
  6. var durationTime:Float = 0.0 //播放时长
  7. var timer : Timer?
  8.  
  9. lazy var startBtn : UIButton = {
  10. let startBtn = UIButton()
  11. startBtn.setImage(UIImage.init(named: "bofang"), for: .normal)
  12. startBtn.addTarget(self, action: #selector(playAction(sender:)), for: .touchUpInside)
  13. return startBtn
  14. }()
  15.  
  16. lazy var finishBtn : UIButton = {
  17. let finishBtn = UIButton()
  18. finishBtn.setImage(UIImage.init(named: "jieshu"), for: .normal)
  19. finishBtn.addTarget(self , action: #selector(endAction(sender:)), for:.touchUpInside)
  20. return finishBtn
  21. }()
  22.  
  23. lazy var progress : UIProgressView = {
  24. let progress = UIProgressView()
  25. return progress
  26. }()
  27.  
  28. lazy var messageLabel : UILabel = {
  29. let messageLabel = UILabel()
  30. messageLabel.text = "时长"
  31. messageLabel.numberOfLines =
  32. return messageLabel
  33. }()
  34.  
  35. override func viewDidLoad() {
  36. super.viewDidLoad()
  37. self.navigationItem.title = "发现"
  38.  
  39. setSubViewConstraints()
  40. let fileURL : URL = Bundle.main.url(forResource: "a", withExtension: "mp3")!
  41.  
  42. do {
  43. let player : AVAudioPlayer = try AVAudioPlayer.init(contentsOf: fileURL)
  44. audioPlayer = player
  45. }catch{}
  46. let str = String.init(format: "音频文件的声道数:%d\n音频文件的持续时间:%g", audioPlayer.numberOfChannels,audioPlayer.duration)
  47. messageLabel.text = str
  48. durationTime = Float(audioPlayer.duration)
  49. //将循环次数设为-1,用于指定该音频文件循环播放
  50. audioPlayer.numberOfLoops = -
  51. audioPlayer.delegate = self
  52. }
  53.  
  54. @objc func playAction(sender:UIButton) -> Void {
  55. if audioPlayer.isPlaying {
  56. audioPlayer.pause()
  57. startBtn.setImage(UIImage.init(named: "bofang"), for: .normal)
  58. } else {
  59. audioPlayer.play()
  60. startBtn.setImage(UIImage.init(named: "zanting"), for: .normal)
  61. }
  62. if timer == nil {
  63. timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(updateProge), userInfo: nil, repeats: true)
  64. }
  65. }
  66. @objc func endAction(sender:UIButton) -> Void {
  67. audioPlayer.stop()
  68. timer?.isValid
  69. timer = nil
  70. }
  71.  
  72. @objc func updateProge() {
  73. progress.progress = Float(audioPlayer.currentTime) / durationTime
  74. }
  75. func setSubViewConstraints() -> Void {
  76. view.addSubview(startBtn)
  77. startBtn.snp.makeConstraints { (make) in
  78. make.top.equalTo()
  79. make.left.equalTo()
  80. make.width.height.equalTo()
  81. }
  82.  
  83. view.addSubview(finishBtn)
  84. finishBtn.snp.makeConstraints { (make) in
  85. make.top.equalTo(startBtn)
  86. make.right.equalTo(-)
  87. make.width.height.equalTo()
  88. }
  89.  
  90. view.addSubview(progress)
  91. progress.snp.makeConstraints { (make) in
  92. make.top.equalTo(startBtn.snp_bottom).offset()
  93. make.left.equalTo()
  94. make.right.equalTo(-)
  95. }
  96. view.addSubview(messageLabel)
  97. messageLabel.snp.makeConstraints { (make) in
  98. make.top.equalTo(progress.snp_bottom).offset()
  99. make.left.equalTo()
  100. make.right.equalTo(-)
  101. }
  102. }
  103. }
  104.  
  105. extension NADiscoverViewController : AVAudioPlayerDelegate {
  106. //当audioplayer播放完成后将会自动播放
  107. func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
  108. if player == audioPlayer && flag {
  109. print("播放完成")
  110.  
  111. }
  112. }
  113.  
  114. func audioPlayerBeginInterruption(_ player: AVAudioPlayer) {
  115. if player == audioPlayer {
  116. print("被中断了")
  117. }
  118. }
  119. }

播放本地音乐

 效果图:

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:开启这个播放结束的时候,可以退出全屏

  案例代码:

  1. import UIKit
  2. import AVKit
  3. class NAPublishViewController : UIViewController {
  4. var moviePlayer = AVPlayerViewController.init()
  5. override func viewDidLoad() {
  6. super.viewDidLoad()
  7.  
  8. let movieUrl : URL = Bundle.main.url(forResource: "movie", withExtension: "mp4")!
  9. //使用指定的url创建MPMoviesPlayerController
  10. moviePlayer.player = AVPlayer.init(url: movieUrl)
  11. //是否显示回放控制
  12. moviePlayer.showsPlaybackControls = true
  13. //开启这个播放的时候支持(全屏)横竖屏
  14. if #available(iOS 11.0, *) {
  15. moviePlayer.entersFullScreenWhenPlaybackBegins = true
  16. }
  17. //开启这个播放结束的是否,可以退出全屏
  18. if #available(iOS 11.0, *) {
  19. moviePlayer.exitsFullScreenWhenPlaybackEnds = true
  20. }
  21. view.addSubview(moviePlayer.view)
  22. //判断moviePlayer已经准备好视频第一播放帧
  23. if moviePlayer.isReadyForDisplay {
  24. moviePlayer.player?.play()
  25. }
  26.  
  27. }
  28.  
  29. override func didReceiveMemoryWarning() {
  30. super.didReceiveMemoryWarning()
  31. // Dispose of any resources that can be recreated.
  32. }
  33. }

AVPlayerViewController播放视频

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

        

iOS音频与视频的开发(一)-使用AVAudioPlayer播放音乐、使用AVPlayerViewController播放视频的更多相关文章

  1. 《转》iOS音频视频初级开发

    代码改变世界 Posts - 73, Articles - 0, Comments - 1539 Cnblogs Dashboard Logout HOME CONTACT GALLERY RSS   ...

  2. iOS音频与视频的开发(二)- 使用AVAudioRecorder进行录制音频

    1.使用AVAudioRecorder录制视频 AVAudioRecorder与AVAudioPlayer类似,它们都属于AVFoundation的类.AVAudioRecorder的功能类似于一个录 ...

  3. iOS音频播放、录音、视频播放、拍照、视频录制

    随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像头的操 ...

  4. iOS 音频视频制作

    --iOS多媒体 概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制, ...

  5. iOS音频AAC视频H264编码 推流最佳方案

    iOS音频AAC视频H264编码 推流最佳方案 项目都是个人的调研与实验,可能很多不好或者不对的地方请多包涵. 1    功能概况 *  实现音视频的数据的采集 *  实现音视频数据的编码,视频编码成 ...

  6. iOS 音频视频图像合成那点事

    代码地址如下:http://www.demodashi.com/demo/13420.html 人而无信不知其可 前言 很久很久没有写点什么了,只因为最近事情太多了,这几天终于闲下来了,趁此机会,记录 ...

  7. IOS开发之小实例--创建一个简单的用于视频录制和回放的应用程序

    前言:还是看了一下国外的入门IOS文章:<Create a Simple App for Video Recording and Playback>,主要涉及视频录制和回放的功能的基本实现 ...

  8. IOS 音频开发文件大小计算

    音频基础知识 音频文件计算大小 音频转码 标签(空格分隔): 调查 IOS音频 https://developer.apple.com/library/ios/documentation/MusicA ...

  9. iOS 音频开发

      音频基础知识 组成 音频文件的组成:文件格式(或者音频容器) + 数据格式(或者音频编码). 文件格式(或音频容器)是用于形容文件本身的格式. 我们可以通过多种不同的方法为真正的音频数据编码.例如 ...

随机推荐

  1. session购物车中的移除功能部分(学生笔记)

    function onclick_remove(r) { if (confirm("确认删除么!此操作不可恢复")) { var out_momey = $(".out_ ...

  2. Python 類和對象 Class vs Object

    類別定義 class 類別名: 例如: >>> class Point:...     x = 0.0...     y = 0.0 1. 宣告 >>> p1 = ...

  3. JS If...Else

    JS If...Else 条件语句用于基于不同的条件来执行不同的动作. 条件语句 通常在写代码时,您总是需要为不同的决定来执行不同的动作.您可以在代码中使用条件语句来完成该任务. 在 JavaScri ...

  4. EChart绘制风速风向曲线分析图

    1.获取ECharts 在 ECharts 的 GitHub 上下载最新的 release 版本,解压出来的文件夹里的 dist 目录里可以找到最新版本的 echarts 库. 2.引入ECharts ...

  5. React 中this.setStat是批量执行的, 它发现做三次是多余的,所以只执行一次

    16==> this.setStat是批量执行的 它发现做三次是多余的,所以只执行一次 import React, { Component } from "react"; e ...

  6. 机器学习--支持向量机 (SVM)算法的原理及优缺点

    一.支持向量机 (SVM)算法的原理 支持向量机(Support Vector Machine,常简称为SVM)是一种监督式学习的方法,可广泛地应用于统计分类以及回归分析.它是将向量映射到一个更高维的 ...

  7. cmd如何跨盘cd切换路径

    cmd跨盘cd要加参数 /d ,难怪,我还以为电脑有问题呢~

  8. Gson的序列化和反序列化-待更新

    反序列化为List List<Person> persons =gson.fromJson(json, new TypeToken<List<Person>>() ...

  9. Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3) A. Math Problem 水题

    A. Math Problem Your math teacher gave you the following problem: There are n segments on the x-axis ...

  10. ROS kinetic + Realsens D435i + ORK + LINEMOD 物体识别

    1. ORK 网址:https://wg-perception.github.io/object_recognition_core/ ORK (Object Recognition Kitchen) ...