前言:

最近工作内容用到了语音播放,从 AVPlayer 到 AVPlayerItem, 期间遇到挺多问题,趟了很多 bug, 也总结了一些心得。对 AVPlayer 了解的更多一些,因为涉及点比较多,所以打算做一个系列详尽的写一下这部分内容。希望大家多多支持,有问题的地方欢迎指正。

AVPlayer 是一个可以播放任何格式的全功能影音播放器
支持视频格式: WMV,AVI,MKV,RMVB,RM,XVID,MP4,3GP,MPG 等。
支持音频格式:MP3,WMA,RM,ACC,OGG,APE,FLAC,FLV 等。
所以不得不说苹果亲儿子还是很强大的,是做视频开发的首选。

如何使用

AVPlayer 存在于 AVFoundation 框架,我们使用时需要导入:

import AVFoundation

几个播放相关的参数(此处暂时只说下我用到的)

在创建一个播放器之前我们需要先了解一些播放器相关的类

AVPlayer: 控制播放器的播放,暂停,播放速度
AVPlayerItem: 管理资源对象,提供播放数据源

1.创建AVPlayer

因为我这边播放,需要播放、暂停、重新播放、进度条拖动播放,所以我这边使用了AVPlayerItem

if let url = URL(string: "http://img.youluwx.com/qa/20200917/video/c94869f4-0ddc-4e45-be7e-b0620acc544d.mp3") { let playerItem = AVPlayerItem(url: url) let play = AVPlayer(playerItem: playerItem)
}

1.2 音频播放、暂停

///播放
player.play()
///暂停
player.pause()

1.3 重新播放

重新播放就是,先把进度调整到开始,然后播放

let seekTime = CMTime(value: CMTimeValue(0), timescale: 1)
player.seek(to: seekTime, completionHandler: { _ in})
player.play()

1.3 进度条拖动播放

此处使用 UISlider滑杆来拖动使用 Swift 使用 UISlider

let playTime = slider.value * duration
let seekTime = CMTime(value: CMTimeValue(playTime), timescale: 1)
player.seek(to: seekTime, completionHandler: { _ in})

1.4 播放进度监听

let playerItem = AVPlayerItem(url: url)
let player = AVPlayer(playerItem: playerItem)
player.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 1), queue: DispatchQueue.main) { time inif let duration = self.playerItem?.duration {let nowDuration = CMTimeGetSeconds(duration)let currentTime = Int(time.seconds)let text = "\(currentTime)/\(nowDuration)\""let progress = Float(currentTime) / Float(nowDuration)print("text:\(text) progress:\(progress)") }
}

2.遇到的问题

2.1 获取网络音频总时间

使用 AVPlayer 播放网络流媒体,发现一个坑:
就是 playerItem.duration 有可能不返回该网络多媒体资源的播放总时间长度,而是返回了一个奇怪的数据:nan,
因为我通过 CMTimeGetSeconds (playerItem.duration) 得到的一直是 nan,只有在监听播放进度,开始播放之后才能拿到数据

let playerItem = AVPlayerItem(url: url)
if let duration = playerItem?.duration {print(CMTimeGetSeconds(duration))
}

而几经周折费劲,发现 CMTimeGetSeconds (playerItem.asset.duration) 返回的却是该网络多媒体资源的正确的播放总时间长度.

let playerItem = AVPlayerItem(url: url)
if let duration = playerItem?.asset.duration { print(CMTimeGetSeconds(duration))
}

最后,总时间可能和播放时间差那么一点,这点一直没搞明白,有知道的大佬麻烦留个言

最大的问题

在最后的测试期间,遇到了更加严重的问题,我发现我们的语音有一部分能播放,另外一部分不能播放,
可播放语音

http://img.youluwx.com/qa/20200917/video/c94869f4-0ddc-4e45-be7e-b0620acc544d.mp3

不可播放语音

http://img.youluwx.com/qa/20201110/video/47e36af4-8fc2-432f-b7c6-ccd982140694.mp3

我分别下载下来音频文件对比:

不能播放在 Safari 浏览器中打开显示如下,能播放的就暂不展示了

具体原因应该是AVPlayer不支持吧,至于更加具体的问题:可能是因为我太菜了吧,找不到问题所在, 也没找到具体解决办法,只能借用其他视频播放器暂时使用了
嗯,最后,如果你要使用AVPlayer,最好慎重一些

Swift 使用AVPlayer 和 AVPlayerItem 做语音播放相关推荐

  1. 使用Speech Synthesis API 做语音播放

    前提:富文本去除标签,只留下纯文本  == >>  str.replace(/<[^>]+>/g, "") 这是在vue中使用,以下是项目实际代码: ...

  2. Swift 基础 AVPlayer音乐播放器的使用(源码)

    一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹.靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希 ...

  3. 多功能语音播放器上线啦~

    应广大学生反映,学程序不会读单词,留言问我能不能做个语音播放器,就是能输入英文能读出来的那种!! 为了帮助公众号里面仅有的几百粉丝,我就顺手写一个吧,万一还能增加点粉丝呢? 于是经过一番奋斗,一款名为 ...

  4. 使用PWM实现语音播放

    本文转自ARM中文社区,作者:Xiaoya 链接:https://community.arm.com/cn/b/blog/posts/nucleof429-2-pwm 事实上大部分MCU都可以实现语音 ...

  5. PWM实现语音播放原理

    采用PWM进行播放语音原理 1.概述 2.声音原理 3.DAC产生声音的原理是什么 4.PWM又是如何实现的DAC的 5.PWM的频率与底噪的关系 6.PWM音乐曲目解析 7.后续 1.概述 大多数微 ...

  6. 乐鑫Esp32学习之旅 23 安信可 esp32-a1s 音频开发板移植最新 esp-adf 音频框架,小试牛刀如何实现在线文字转语音播放。

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...

  7. php仿微信语音条,html5的audio实现高仿微信语音播放效果

    前言 之前做过一个微信的项目,专家回复可以录音,然后储存成mp3格式,前台可以获取mp3,客户可以在线试听mp3录音效果,今天就简单分享一下这个效果如何实现,及实现思路和方法! 效果图 前台大体呈现效 ...

  8. Arduino案例实操 -- 语音播放模块(DY-SV5W)

    案例主控板如不做特殊说明的话,均默认是Arduino UNO控制板. 本次实验以UNO发送串口协议控制语音播放器播放歌曲,语音播放模块选型DY-SV5W. 文章标题导航 一.硬件选择 1. Ardui ...

  9. swift AVFoundation AVPlayer 视频播放器——swift学习(十)

    播放器 对于资源的播放,你应使用AVPlayer类.你可以使用AVPlayerItem实例去管理整个资源的显示状态,使用AVPlayerIteamTrack类去管理单独任务的显示状态.你可以使用AVP ...

  10. 移动端语音播放以及语音条拖动的实现

    移动端语音播放,包含了语音播放动态小喇叭,语音条,时间长度,支持移动端触动拖动,不支持PC拖动. 类似于微信公众号里面的语音播放,效果如下: 进入页面: 播放时: 页面代码: <!DOCTYPE ...

最新文章

  1. js控制使div自动适应居中
  2. BAT集体告别中台上半场!接下来,中台怎么玩?
  3. antd Tree 展开和默认选中
  4. 中国AI专利申请量占全球74%,腾讯、百度、OPPO前五
  5. 【Python学习系列十五】pandas库DataFrame行列操作使用方法
  6. 学习笔记Hadoop(二)—— Hadoop介绍(2)——Hadoop 核心组件
  7. figma下载_我如何使用Figma,CSS Grid和CSS Flexbox构建登录页面
  8. matlab的m函数入门2
  9. ubuntu 12.04安装与配置
  10. 苹果最新专利曝光:苹果可能正研发可折叠iPhone
  11. Linux下Centos7以rpm方式离线安装MySQL5.7教程以及部分报错解决方案
  12. 人脸检测caffe下步骤
  13. 目前流行的源程序版本管理软件和项目管理的软件优缺点
  14. 51单片机串行通信原理
  15. 驱动人生安装驱动计算机无法启动,驱动人生解决声卡驱动问题 驱动人生针对电脑不出声解决方案...
  16. Handler源码阅读
  17. 企业微信开发----H5发送表单请求到企业微信内部审核
  18. mirna富集分析_miRNA芯片数据挖掘文章套路
  19. MQTT:QoS服务质量 0,1,2(Quality of Service 0, 1 2)
  20. java计算机毕业设计基于安卓Android/微信小程序的婚恋交友系统uni-app

热门文章

  1. matlab实现神经网络
  2. 24-思科防火墙:ASA透明防火墙实验
  3. windows系统不安装软件查看cpu温度
  4. FlashFXP V3.3.9(真正破解) 绿色版
  5. win7 美化Linux,让XP的主题背景拥有Win7一样的华丽 让Linux系统和Win8一模一样!超华丽Linux仿Win...
  6. tftpd32刷路由器方法_不走弯路:小米路由器3G 刷Padavan固件简单教程
  7. php 年会抽奖,PHP+jQuery年会在线拍照抽奖
  8. 如何发布Flash ZXP/MXP扩展
  9. 笔记MySQLJavaweb
  10. Python网络爬虫:正则表达式