iOS - AVAudioPlayer 音频播放

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 前言 NS_CLASS_AVAILABLE(10_7, 2_2) @interface AVAudioPlayer : NSObject @available(iOS 2.2, *) public class AVAudioPlayer : NSObject本地音乐播放:添加库文件:AVFoundation.

前言

    NS_CLASS_AVAILABLE(10_7, 2_2) @interface AVAudioPlayer : NSObject 
    @available(iOS 2.2, *)         public class AVAudioPlayer : NSObject
  • 本地音乐播放:
    • 添加库文件:AVFoundation.framework
    • 包含头文件:#import <AVFoundation/AVFoundation.h>

1、本地音乐播放

  • Objective-C

        // 添加库文件:AVFoundation.framework
        // 包含头文件:#import <AVFoundation/AVFoundation.h>
    
        // 声明音乐播放控件,必须声明为全局属性变量,否则可能不会播放,AVAudioPlayer 只能播放本地音乐
        @property(nonatomic, retain)AVAudioPlayer *musicPlayer;
    
        // 获取音乐文件路径
        NSURL *musicUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"蓝莲花" ofType:@"mp3"]];
    
        // 实例化音乐播放控件
        musicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:musicUrl error:nil];
    
        // 准备(缓冲)播放
        [musicPlayer prepareToPlay];
    
        // 开始播放音乐
        [musicPlayer play];
  • Swift

        // 添加库文件:AVFoundation.framework
        // 包含头文件:import AVFoundation
    
        // 声明音乐播放控件,必须声明为全局属性变量,否则可能不会播放,AVAudioPlayer 只能播放本地音乐    
        var musicPlayer:AVAudioPlayer!
    
        // 获取音乐文件路径
        let musicUrl = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("蓝莲花", ofType: "mp3")!)
    
        // 实例化音乐播放控件
        musicPlayer = try? AVAudioPlayer(contentsOfURL: musicUrl)
    
        // 准备(缓冲)播放
        musicPlayer.prepareToPlay()
    
        // 开始播放音乐
        musicPlayer.play()

2、本地音乐播放设置

  • Objective-C

        // 设置代理,需遵守 <AVAudioPlayerDelegate> 协议
        musicPlayer.delegate = self;
    
        // 判断播放状态
        BOOL isPlaying = musicPlayer.isPlaying;
    
        // 获取音乐通道数
        NSUInteger numberOfChannels = musicPlayer.numberOfChannels;
    
        // 获取音乐时长
        /*
            获取音乐的长度,单位秒
        */
        NSTimeInterval duration = musicPlayer.duration;
    
        // 获取与输出设备相关联的当前播放进度
        NSTimeInterval deviceCurrentTime = musicPlayer.deviceCurrentTime;
    
        // 获取当前音乐文件的路径
        /*
            音乐文件播放控件由 url 创建,returns nil if object was not created with a URL
        */
        NSURL *currentMusicUrl = musicPlayer.url;
    
        // 获取当前音乐文件的数据
        /*
            音乐文件播放控件由 data 创建,returns nil if object was not created with a data object
        */
        NSData *currentMusicData = musicPlayer.data;
    
        // 设置声道
        /*
            -1.0:左声道, 0.0:左右声道(默认), 1.0:右声道
        */
        musicPlayer.pan = 1.0;
    
        // 设置音量
        /*
            音量范围是 0.0 ~ 1.0,默认为 1.0
        */
        musicPlayer.volume = 0;
    
        // 设置是否允许控制播发速度
        /*
            设置播放速度时必须设置此项为 YES,必须在 [musicPlayer prepareToPlay] 之前设置,默认为 NO
        */
        musicPlayer.enableRate = YES;
    
        // 设置播放速度
        /*
            enableRate 必须设置为 YES,1.0 is normal, 0.5 is half speed, 2.0 is double speed
        */
        musicPlayer.rate = 1;
    
        // 设置当前播放位置
        /*
            设置音乐从指定的时间处开始播放
        */
        musicPlayer.currentTime = 30;
    
        // 设置循环播放次数
        /*
            = 0:只播放一次(默认),> 0:播放设置的次数,< 0:循环播放
        */
        musicPlayer.numberOfLoops = 1;
    
        // 缓冲音乐
        [musicPlayer prepareToPlay];
    
        // 开始播放
        [musicPlayer play];
    
        // 定时播放
        /*
            在指定的时间播放音乐
        */
        [musicPlayer playAtTime:[[NSDate dateWithTimeIntervalSinceNow:10] timeIntervalSince1970]];
    
        // 暂停播放
        [musicPlayer pause];
    
        // 停止播放
        [musicPlayer stop];
  • Swift

        // 设置代理
        /*
            需遵守 AVAudioPlayerDelegate 协议
        */
        musicPlayer.delegate = self
    
        // 判断播放状态
        let isPlaying:Bool = musicPlayer.playing
    
        // 获取音乐通道数
        let numberOfChannels:Int = musicPlayer.numberOfChannels
    
        // 获取音乐时长
        /*
            获取音乐的长度,单位秒
        */
        let duration:NSTimeInterval = musicPlayer.duration
    
        // 获取与输出设备相关联的当前播放进度
        let deviceCurrentTime:NSTimeInterval = musicPlayer.deviceCurrentTime
    
        // 获取当前音乐文件的路径
        /*
            音乐文件播放控件由 url 创建,returns nil if object was not created with a URL
        */
        let currentMusicUrl:NSURL = musicPlayer.url!
    
        // 获取当前音乐文件的数据
        /*
            音乐文件播放控件由 data 创建,returns nil if object was not created with a data object
        */
        let currentMusicData = musicPlayer.data
    
        // 设置声道
        /*
            -1.0:左声道, 0.0:左右声道(默认), 1.0:右声道
        */
        musicPlayer.pan = 1.0
    
        // 设置音量
        /*
            音量范围是 0.0 ~ 1.0,默认为 1.0
        */
        musicPlayer.volume = 0
    
        // 设置是否允许控制播发速度
        /*
            设置播放速度是必须设置此项为 YES,必须在 [musicPlayer prepareToPlay] 之前设置,默认为 NO
        */
        musicPlayer.enableRate = true
    
        // 设置播放速度
        /*
            enableRate 必须设置为 YES,1.0 is normal, 0.5 is half speed, 2.0 is double speed
        */
        musicPlayer.rate = 1
    
        // 设置当前播放位置
        /*
            设置音乐从指定的时间处开始播放
        */
        musicPlayer.currentTime = 30
    
        // 设置循环播放次数
        /*
            = 0:只播放一次(默认),> 0:播放设置的次数,< 0:循环播放
        */
        musicPlayer.numberOfLoops = 1
    
        // 缓冲音乐
        musicPlayer.prepareToPlay()
    
        // 开始播放
        musicPlayer.play()
    
        // 定时播放
        /*
            在指定的时间播放音乐
        */
        musicPlayer.playAtTime(NSDate(timeIntervalSinceNow: 10).timeIntervalSince1970)
    
        // 暂停播放
        musicPlayer.pause()
    
        // 停止播放
        musicPlayer.stop()

3、本地音乐文件解析

  • Objective-C

        /*
            注意观察  commonKey 和 value:
    
                commonKey = title             歌曲名称
                commonKey = artist            歌手名称
                commonKey = albumName         专辑名称
                commonKey = artwork           专辑图片
        */
        NSString *titleString = nil;
        NSString *artistString = nil;
        NSString *albumNameString = nil;
        UIImage  *artworkImage = nil;
    
        // 获取音乐文件路径
        NSURL *musicUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"蓝莲花" ofType:@"mp3"]];
    
        // 加载音乐文件
        AVURLAsset *URLAsset = [AVURLAsset URLAssetWithURL:musicUrl options:nil];
    
        // 解析音乐文件
        /*
            获取音乐文件中的信息,固定格式 org.id3
        */
        NSArray *musicInfoArray = [URLAsset metadataForFormat:@"org.id3"];
    
        for (AVMetadataItem *item in musicInfoArray) {
    
            // 解析歌曲名称
            if ([item.commonKey isEqualToString:@"title"]) {
    
                titleString = (NSString *)item.value;
            }
    
            // 解析歌手名称
            if ([item.commonKey isEqualToString:@"artist"]) {
    
                artistString = (NSString *)item.value;
            }
    
            // 解析专辑名称
            if ([item.commonKey isEqualToString:@"albumName"]) {
    
                albumNameString = (NSString *)item.value;
            }
    
            // 解析专辑图片
            if ([item.commonKey isEqualToString:@"artwork"]) {
    
                // value 值为 NSData 时,直接取值
                NSData *data = (NSData *)item.value;
    
                artworkImage = [UIImage imageWithData:data];
            }
        }
    
        // 显示解析值
    
        musicInfoLabel.text = [NSString stringWithFormat:@"歌曲名称: %@\n歌手名称: %@\n专辑名称: %@",
                                                          titleString, artistString, albumNameString];
    
        musicInfoImageView.image = artworkImage;
  • Swift

        /*
            注意观察  commonKey 和 value:
    
                commonKey = title             歌曲名称
                commonKey = artist            歌手名称
                commonKey = albumName         专辑名称
                commonKey = artwork           专辑图片
        */
        var titleString:String!
        var artistString:String!
        var albumNameString:String!
        var artworkImage:UIImage!
    
        // 获取音乐文件路径
        let musicUrl:NSURL = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("蓝莲花", ofType: "mp3")!)
    
        // 加载音乐文件
        let URLAsset = AVURLAsset(URL: musicUrl, options: nil)
    
        // 解析音乐文件
        /*
            获取音乐文件中的信息,固定格式 org.id3
        */
        let musicInfoArray = URLAsset.metadataForFormat("org.id3")
    
        for item in musicInfoArray {
    
            let itemCommonKey:String? = (item as! AVMutableMetadataItem).commonKey
    
            // 解析歌曲名称
            if itemCommonKey == "title" {
    
                titleString = (item as! AVMutableMetadataItem).value as! String
            }
    
            // 解析歌手名称
            if itemCommonKey == "artist" {
    
                artistString = (item as! AVMutableMetadataItem).value as! String
            }
    
            // 解析专辑名称
            if itemCommonKey == "albumName" {
    
                albumNameString = (item as! AVMutableMetadataItem).value as! String
            }
    
            // 解析专辑图片
            if itemCommonKey == "artwork" {
    
                // value 值为 NSData 时,直接取值
                let data = (item as! AVMutableMetadataItem).value as! NSData
    
                artworkImage = UIImage(data: data)
            }
        }
    
        // 显示解析值
    
        musicInfoLabel.text = "歌曲名称: \(titleString)\n歌手名称: \(artistString)\n专辑名称: \(albumNameString)"
    
        musicInfoImageView.image = artworkImage

4、AVAudioPlayerDelegate 协议方法

  • Objective-C

        // 播放完成
        - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
    
        }
    
        // 播放失败
        - (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error {
    
        }
  • Swift

        // 播放完成
        func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) {
    
        }
    
        // 播放失败
        func audioPlayerDecodeErrorDidOccur(player: AVAudioPlayer, error: NSError?) {
    
        }
目录
相关文章
|
7月前
|
编解码 Linux 开发工具
iOS平台如何实现RTSP|RTMP播放端录像?
我们在做RTSP、RTMP直播播放器的时候,有个比较重要的功能,就是拉流端实时录像,包括设置单个录像文件大小、文件前缀、audio转AAC、只录制视频或只录制音频、开始录像、停止录像事件状态回调等。
134 5
|
9月前
|
iOS开发
技术好文:xcode动态图,ios实现动态图,iosgif,暂停和继续播放
技术好文:xcode动态图,ios实现动态图,iosgif,暂停和继续播放
124 24
|
10月前
|
Android开发 iOS开发
ios后台播放声音的三种实现方式
ios后台播放声音的三种实现方式
742 1
|
编解码 开发工具 Android开发
安卓端/iOS端如何播放4K分辨率的RTMP/RTSP流
4K分辨率即4096×2160的像素分辨率,它是2K投影机和高清电视分辨率的4倍,属于超高清分辨率。在此分辨率下,观众将可以看清画面中的每一个细节,每一个特写。影院如果采用惊人的4096×2160像素,无论在影院的哪个位置,观众都可以清楚的看到画面的每一个细节,影片色彩鲜艳、文字清晰锐丽,再配合超真实音效,这种感觉真的是一种难以言传的享受。
359 0
安卓端/iOS端如何播放4K分辨率的RTMP/RTSP流
|
开发工具 图形学 Android开发
Windows/Android/IOS平台如何在Unity3d播放RTSP/RTMP流
如果基于Unity3d完全重新开发一个播放器,代价大,周期长,不适合快速出产品,最好的方式就是集成现有Native平台上成熟稳定播放器.
199 1
|
iOS开发
iOS开发 - 滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和Masonry简单使用)
iOS开发 - 滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和Masonry简单使用)
292 0
iOS开发 - 滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和Masonry简单使用)
|
编解码 iOS开发 内存技术
iOS 录音、音频的拼接剪切以及边录边压缩转码
iOS 录音、音频的拼接剪切以及边录边压缩转码
891 0
iOS 录音、音频的拼接剪切以及边录边压缩转码
|
iOS开发
iOS 多条音频拼接为一条音频进行播放
把多条mp3音频合并为一条保存并进行播放
394 0
|
开发工具 iOS开发 内存技术
iOS开发之多媒体播放
iOS开发之多媒体播放
165 0
|
iOS开发
ios 音乐后台播放
ios 音乐后台播放
80 0

热门文章

最新文章

  • 1
    苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
    50
  • 2
    苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
    45
  • 3
    uniapp云打包ios应用证书的获取方法,生成指南
    46
  • 4
    iOS|解决 setBrightness 调节屏幕亮度不生效的问题
    124
  • 5
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
    29
  • 6
    iOS各个证书生成细节
    43
  • 7
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    213
  • 8
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    66
  • 9
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    85
  • 10
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    68