如何播放本地文件中的音频?

2024-02-20

我想播放下载的本地音频文件,但它不播放:

class AVPlayerService {
static let instance = AVPlayerService()

private var audioPlayer: AVPlayer!
public weak var delegate: AVPlayerServiceDelegate?

func setupPlayer(forURL url: URL) {
    let playerItem: AVPlayerItem = AVPlayerItem(url: URL(fileURLWithPath: "\(url)")
    audioPlayer = AVPlayer(playerItem: playerItem)
    audioPlayer.play() 
}

我在这里获取本地文件,然后在视图控制器中调用它:

func getDownloadedSurahFor(surah: Surah, reciter: Reciter) -> (Exists, URL?) {
    let documentsDirectoryURL =  FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!

    // lets create your destination file url
    let destinationUrl = documentsDirectoryURL.appendingPathComponent("\(reciter.name): \(surah.number)")
    print(destinationUrl)

    // to check if it exists before downloading it
    if FileManager.default.fileExists(atPath: destinationUrl.path) {
        print("Already downloaded")
        return (.exists, destinationUrl)
    } else {
        return (.doesNotExist, nil)
    }
}

在我的 Viewcontroller 中,我检查它是否存在,然后调用 setupPlayer:

let (exists, url) =  DataService.instance.getDownloadedSurahFor(surah: playingSurah, reciter: reciter)
        if exists == .exists {
            self.audioService.setupPlayer(forURL: url!)
            self.setupSlider()
            self.changeButtonTo(.pause)
            print("Downloaded file should now play")
        }

SimpleSwift 4+ 的解决方案:

import Foundation
import AVFoundation

final class MediaPlayer {
    static var player = AVAudioPlayer()

    class func play() {
        do {
            let file = Bundle.main.url(forResource: "file_name", withExtension: "mp3")!
            player = try AVAudioPlayer(contentsOf: file)
            player.numberOfLoops = 0 // loop count, set -1 for infinite
            player.volume = 1
            player.prepareToPlay()

            try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [])
            try AVAudioSession.sharedInstance().setActive(true)

            player.play()
        } catch _ {
            print("catch")
        }
    }
}

对于 Swift 4+ 的多次使用:

import UIKit
import AudioToolbox

struct SoundPlayer {
    static var filename : String?
    static var enabled : Bool = true

    private struct Internal {
        static var cache = [URL:SystemSoundID]()
    }

    static func playSound(soundFile: String) {
        if !enabled {
            return
        }

        if let url = Bundle.main.url(forResource: soundFile, withExtension: nil) {
            var soundID : SystemSoundID = Internal.cache[url] ?? 0

            if soundID == 0 {
                AudioServicesCreateSystemSoundID(url as CFURL, &soundID)
                Internal.cache[url] = soundID
            }

            AudioServicesPlaySystemSound(soundID)
        } else {
            print("Could not find sound file name `\(soundFile)`")
        }
    }

    // call the function with filename
    static func play(file: String) {
        self.playSound(soundFile: file)
    }
}

检查此主题的 Swift 2 ->https://stackoverflow.com/a/35000526/2125010 https://stackoverflow.com/a/35000526/2125010

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何播放本地文件中的音频? 的相关文章

  • 设置属性文本后防止 UILabel 字体自动更改

    我发现如果我将属性文本设置为UILabel 预定义字体将更改为属性文本第一个字符的字体 例如 the font size is set to 20 in Interface Builder println theLabel font poi
  • 有没有办法更改 UITabBar 或 UITabBarItem 中的文本位置?

    这是我打算放在屏幕上的自定义选项卡栏 然而 我的搭档希望文字稍微向上一些 我怎样才能这样做呢 为什么不为视图控制器设置一个空的标题属性 并将标题添加到选项卡的自定义图像中 UPDATE 为了回答的完整性 来自评论和ios标签栏在没有图像时将
  • 如何比较两个音频数据?

    我会录制自己的声音并将其保存为wav文件在我的电脑中 稍后我会说话 计算机应该将我的语音命令与预先存在 预先录制的 wav 文件相匹配 问题 如何检查两个音频数据是否相等或两个音频之间是否有 80 匹配 if audio1 audio2 D
  • 从 RemoteIO 录制到 AAC:数据正在写入,但文件无法播放

    我一直在尝试从 iPad 2 上的 iOS 5 中的 renderCallback 中直接从 RemoteIO 单元录制到 AAC 我看到了相互矛盾的信息 说这是不可能的 但这是可能的 在评论中 here http atastypixel
  • didChangeCameraPosition 获取可用坐标的边界框/矩形

    如何从 GMSCameraPosition 检索 GMSColinedBounds 我想知道每次用户移动相机时地图上的可见坐标 至少东北 西南点 如下所示 void mapView GMSMapView mapView didChangeC
  • 使用 Swift 过滤 Realm 对象

    尝试使用以下方法过滤我的领域数据库时 我总是收到以下错误NSPredicate 属性 text 不是类型 getType 对象中的链接 我想过滤我的领域数据库以仅显示其中包含某些特定文本的项目 这是我尝试过的 let realm try R
  • 填充 UIScrollView 的垂直空间

    我正在研究一个具有UIScrollView 我想要做的是将标签固定在可滚动区域的顶部 并将按钮固定在底部 两者之间的空间最小 这个想法是 如果标签的高度增加 按钮将被向下推 以便用户必须向下滚动才能找到它 但是 如果标签很短 则标签和按钮之
  • “StorageReference”类型的值没有成员“put”[重复]

    这个问题在这里已经有答案了 我更新到 firebase storage 4 0 现在收到此错误 指出 storageRef 没有成员 put 它以前在旧版本的 Firebase 中有效 if let selectedImage select
  • 在 Android 媒体播放器上播放 MediaStore 中的音频

    有没有办法通过使用 MediaPLayer 播放从 MediaStore 获得的音频 或者我走的方向完全错误 到目前为止 我已经查看了 MediaStore Audio 但没有什么能真正帮助我 我只需要知道我是否走在正确的轨道上 首先 我假
  • Swift 从 Realm 中删除对象

    我有领域对象保存来自 JSON 响应的列表 但现在如果该对象不再从 JSON 中出现在列表中 我需要删除该对象 我怎么做到这一点 这是我的领域初始化 func listItems dic Array lt String AnyObject
  • 方向改变后的javascript最大视口高度Android和iOS

    目标 查找设备的最大视口高度 包括设备的空间address bar这样我们就可以动态调整 min body 的大小并将内容向上推 问题 移动浏览器处理方向状态的方式不同 方向变化时更新 DOM 属性的方式也不同 使用 JavaScript
  • iOS 5 中的新错误:WebKit 丢弃了未捕获的异常

    我正在尝试加载一个UIWebView与 Facebook OAuth 授权 URL 我使用以下代码 当我的UIWebView加载 Facebook 登录页面 我输入我的凭据 然后按 登录 按钮 当我点击按钮时 我收到以下错误 WebKit
  • 如何确定当前处于活动状态的视图控制器/显示视图的视图控制器?

    在我的应用程序中 我正在排队一些本地通知 当它们触发时我必须呈现模式视图 问题是我有许多视图控制器 其中任何一个当前都可能处于活动状态 因此需要呈现模式视图控制器 如何确定当前正在使用哪一个 我将导航控制器设置为 Windows 根视图控制
  • EKEvent接受邀请

    你如何接受EKEventiOS 中的邀请 我知道这有可能梦幻般的 日历 5和其他日历应用程序具有此功能 但我没有看到公开的非只读属性来更改用户有关事件的状态 知道如何做到这一点吗 Thanks 事实证明 经过更多研究后 所有这些应用程序都只
  • 为什么我不能在 func Swift 中使用 self

    我试图自行将 SKSpriteNodes 添加到函数中的视图中 但 Xcode 不允许我这样做 它给了我错误 使用未解析的标识符 self func indicate if test 0 var large CGFloat largest
  • 修剪 UIImage 边框

    这是我想要修剪的图像的示例 我想去掉图像周围的边框 在本例中是顶部和底部的黑条 我在Github上找到了一个库 CKImageAdditions https github com cmkilger CKImageAdditions 但是它似
  • cocos2d中获取CCSprite的绝对位置

    在我的游戏中 我有一个CCSprite绕另一个轨道运行CCSprite 很像电子绕原子核运行 我将电子作为原子核的子元素 以使动画更加简单 我所要做的就是旋转原子核 电子就会很好地跟随 然而 我的问题来自于想要让轨道动画看起来更时髦一点 通
  • Objective c,实例成员的内存管理

    我对实例成员的内存管理感到困惑 我有一个带有 ivar 的课程 DetailedResultsTableViewController detailedResultsTableViewController and property nonat
  • Cocoapods 框架不支持配置文件

    我是 iOS 开发领域的新手 我正在从事 iOS 应用程序开发工作 我正在使用 Cocoapods 集成 Alamofire 和 KeychainSwift 等第三方库 当我导出存档以从本地生成 ipa 文件时 它工作正常 但是当我尝试在
  • Android Mediaplayer:下载媒体文件的 setDataSource 问题

    我有一个可以录制和播放音频文件的应用程序 一些音频文件是使用 httpclient 使用简单的标准 http 下载来下载的 很长一段时间以来 它就像一种魅力 现在我突然无法播放我下载的文件 该堆栈失败 我将文件存储在 SDCard 上 并且

随机推荐

  • 在Java中,我们可以在一个类中创建多少个构造函数?

    在Java中 我们可以在一个类中创建多少个构造函数 严格来说 JVM 类文件格式将类的方法数量 包括所有构造函数 限制为少于 65536 个 根据 Tom Hawtin 的说法 有效限制为 65527 个 每个方法签名在常量池中占用一个槽
  • Google Colab 脚本抛出“传输端点未连接”

    我无法使用任何 bash 命令Google Colab脚本 它让我 Transport endpoint is not connected 该问题仅发生在已安装的 gdrive 中 我正在使用google drive ocamlfuse 例
  • 向不同的操作提交相同的表单

    取决于哪个submit用户选择的按钮 Cat and Dog在本例中 我想使用正确的 http 动词将表单提交到正确的控制器操作 在本例中 只有一个文本输入 如果用户按下Cat我想POST to Cats create and if Dog
  • 如何将 tumblr 中的横幅链接到另一个网站?

    我正在尝试将我的 tumblr 博客中的横幅链接到另一个网站 我不知道该怎么做 以下是我在自定义 html 选项卡中找到的代码 但我似乎无法使我的横幅可点击 我到底应该在哪里添加链接的网站地址 任何帮助将不胜感激 div class blo
  • Io异常:网络适配器无法建立连接

    我正在使用 tomcat 应用程序服务器并连接到 Oracle DB 有一个文件叫ojdbc14 10g jar在项目中 在 jsp 页面中 我打开与数据库的连接并获取一些信息 但是 当我刷新页面时 我多次收到以下错误 java sql S
  • Laravel 重写引导模板

    因此 我在项目中添加了自定义 app css 并且使用引导模板 现在 当我在 app css 中创建新的按钮样式时 它可以在任何地方访问 因为我获得了主模板 并且其他页面正在扩展它 所以在每个页面上 但是当我在 app css 中覆盖引导主
  • android.support.v7.app.MediaRouteButton 不显示

    这是我的布局
  • 如何在pygame中将三角形旋转一定角度?

    我需要在屏幕中心旋转一个三角形 不是图像 我看到其他人回答了这个问题 但三角形不能指向上方 我尝试过使用其他人的功能 但他们认为只能部分工作 就像我上面提到的功能一样 import pygame disp pygame display se
  • 正则表达式性能:Boost 与 Perl [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 perl 和 boost 正则表达式之间的性能比较 我需要设计一段非常依赖正则表达式的代码
  • WPF:如何以原始尺寸显示图像?

    我在 WPF 中显示图像时遇到问题 这是我的代码
  • 以编程方式更改布局的前景色

    我想更改线性布局的前景色 这是我的代码 layout setForeground new ColorDrawable getResources getColor R color svbackclr 但是这个调用需要最低 api 级别 23
  • SQL 关键字“ISABOUT”[已弃用?] 应该替换为什么?

    在 MS SQL 全文搜索中 我在查询中使用 ISABOUT 例如 这应该返回前 10 名ProductIDs PK 与RANK领域在ProductDetails Table SELECT FROM CONTAINSTABLE Produc
  • 连接浏览器和广告商而不在多点连接中显示警报消息

    目前我正在探索多点连接框架 我的应用程序广告商和浏览器中有 2 个选项 因此 当用户在一台设备上启动浏览器 而在另一台设备上启动广告商时 他们应该能够找到彼此 当该设备出现在浏览器中并且用户点击它时 将向拥有广告设备的用户显示警报 允许他们
  • 角度测试台覆盖模块不工作

    当对测试夹具使用以下配置时 我收到关于找不到标签的抱怨 替换为MockSelectionToolComponent直接在AppModule工作正常 所以一定是别的东西 Add the imported module to the impor
  • MySQL服务器消失了

    我在 MySql 服务器上执行此查询 它给出了 MySQL 服务器已消失 错误 在下面的查询中 我的两个表都有超过 1000000 行 SELECT a tab 11 10 url as url a tab 11 10 c5 as t1 a
  • 如何比较两个雄辩的集合并从另一个集合中删除其中的内容?

    我有所有门的集合 以及当前用户有权访问的门的集合 如何比较两者并从所有门集合中删除用户已有权访问的门 doors Door orderBy name asc gt get users doors user gt doors 这是两个集合 U
  • 删除或禁用 RAP/RCP EditorPart 上显示的“X”关闭按钮

    我正在开发一个显示 ViewPart 和 EditorPart 的 RAP 应用程序 我试图找到一种方法来防止 所有 编辑器部分关闭 有没有办法删除或禁用 编辑器部分显示的 X 关闭按钮 你可以这样做 我写的大致相同 例如 http wik
  • 如何启用即席分布式查询

    当我运行查询时OPENROWSET在 SQL Server 2000 中它可以工作 但 SQL Server 2008 中的相同查询会生成以下错误 SQL Server 阻止了对组件 临时分布式查询 的语句 OpenRowset OpenD
  • 动态 Telerik RadOutlookBar 标题与 ItemTemplate 出现错误

    我正在尝试以 MVVM 方式使用 Telerik RadControls 但遇到了一些奇怪的问题 RadOutlookBar 背后的 Viewmodel 有一个 ViewModel 集合 每个 ViewModel 都有一个 Title 字符
  • 如何播放本地文件中的音频?

    我想播放下载的本地音频文件 但它不播放 class AVPlayerService static let instance AVPlayerService private var audioPlayer AVPlayer public we