十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
一、简单介绍
创新互联建站"三网合一"的企业建站思路。企业可建设拥有电脑版、微信版、手机版的企业网站。实现跨屏营销,产品发布一步更新,电脑网络+移动网络一网打尽,满足企业的营销需求!创新互联建站具备承接各种类型的网站设计、成都网站建设项目的能力。经过10余年的努力的开拓,为不同行业的企事业单位提供了优质的服务,并获得了客户的一致好评。
简单来说,音频可以分为2种
(1)音效
又称“短音频”,通常在程序中的播放时长为1~2秒
在应用程序中起到点缀效果,提升整体用户体验
(2)音乐
比如游戏中的“背景音乐”,一般播放时间较长
框架:播放音频需要用到AVFoundation.framework框架
二、音效的播放
1.获得音效文件的路径
复制代码 代码如下:
NSURL *url = [[NSBundle mainBundle] URLForResource:@"m_03.wav" withExtension:nil];
2.加载音效文件,得到对应的音效ID
复制代码 代码如下:
SystemSoundID soundID = 0;
AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), soundID);
3.播放音效
复制代码 代码如下:
AudioServicesPlaySystemSound(soundID);
注意:音效文件只需要加载1次
4.音效播放常见函数总结
加载音效文件
复制代码 代码如下:
AudioServicesCreateSystemSoundID(CFURLRef inFileURL, SystemSoundID *outSystemSoundID)
释放音效资源
复制代码 代码如下:
AudioServicesDisposeSystemSoundID(SystemSoundID inSystemSoundID)
播放音效
复制代码 代码如下:
AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID)
播放音效带点震动
复制代码 代码如下:
AudioServicesPlayAlertSound(SystemSoundID inSystemSoundID)
三、程序示例
先导入需要依赖的框架
导入需要播放的音效文件素材
说明:AVFoundation.framework框架中的东西转换为CF需要使用桥接。
代码示例:
复制代码 代码如下:
YYViewController.m文件
//
// YYViewController.m
// 14-音效播放
//
// Created by apple on 14-8-8.
// Copyright (c) 2014年 yangyong. All rights reserved.
//
#import "YYViewController.h"
#import
@interface YYViewController ()
@end
复制代码 代码如下:
@implementation YYViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//1.获得音效文件的全路径
NSURL *url=[[NSBundle mainBundle]URLForResource:@"buyao.wav" withExtension:nil];
//2.加载音效文件,创建音效ID(SoundID,一个ID对应一个音效文件)
SystemSoundID soundID=0;
AudioServicesCreateSystemSoundID((__bridge CFURLRef)url, soundID);
//把需要销毁的音效文件的ID传递给它既可销毁
//AudioServicesDisposeSystemSoundID(soundID);
//3.播放音效文件
//下面的两个函数都可以用来播放音效文件,第一个函数伴随有震动效果
AudioServicesPlayAlertSound(soundID);
//AudioServicesPlaySystemSound(#systemsoundid)
}
@end
说明:点击屏幕可以播放音效文件。
音乐的播放
一、简单说明
音乐播放用到一个叫做AVAudioPlayer的`类,这个类可以用于播放手机本地的音乐文件。
注意:
(1)该类(AVAudioPlayer)只能用于播放本地音频。
(2)时间比较短的(称之为音效)使用AudioServicesCreateSystemSoundID来创建,而本地时间较长(称之为音乐)使用AVAudioPlayer类。
二、代码示例
AVAudioPlayer类依赖于AVFoundation框架,因此使用该类必须先导入AVFoundation框架,并包含其头文件(包含主头文件即可)。
导入必要的,需要播放的音频文件到项目中。
代码示例:
复制代码 代码如下:
//
// YYViewController.m
// 15-播放音乐
//
#import "YYViewController.h"
#import
@interface YYViewController ()
@end
复制代码 代码如下:
@implementation YYViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//1.音频文件的url路径
NSURL *url=[[NSBundle mainBundle]URLForResource:@"235319.mp3" withExtension:Nil];
//2.创建播放器(注意:一个AVAudioPlayer只能播放一个url)
AVAudioPlayer *audioPlayer=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:Nil];
//3.缓冲
[audioPlayer prepareToPlay];
//4.播放
[audioPlayer play];
}
@end
代码说明:运行程序,点击模拟器界面,却并没有能够播放音频文件,原因是代码中创建的AVAudioPlayer播放器是一个局部变量,应该调整为全局属性。
可将代码调整如下,即可播放音频:
复制代码 代码如下:
#import "YYViewController.h"
#import
@interface YYViewController ()
@property(nonatomic,strong)AVAudioPlayer *audioplayer;
@end
复制代码 代码如下:
@implementation YYViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//1.音频文件的url路径
NSURL *url=[[NSBundle mainBundle]URLForResource:@"235319.mp3" withExtension:Nil];
//2.创建播放器(注意:一个AVAudioPlayer只能播放一个url)
self.audioplayer=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:Nil];
//3.缓冲
[self.audioplayer prepareToPlay];
//4.播放
[self.audioplayer play];
}
@end
注意:一个AVAudioPlayer只能播放一个url,如果想要播放多个文件,那么就得创建多个播放器。
三、相关说明
新建一个项目,在storyboard中放三个按钮,分别用来控制音乐的播放、暂停和停止。
程序代码如下:
复制代码 代码如下:
#import "YYViewController.h"
#import
@interface YYViewController ()
@property(nonatomic,strong)AVAudioPlayer *player;
- (IBAction)play;
- (IBAction)pause;
- (IBAction)stop;
@end
@implementation YYViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//1.音频文件的url路径
NSURL *url=[[NSBundle mainBundle]URLForResource:@"235319.mp3" withExtension:Nil];
//2.创建播放器(注意:一个AVAudioPlayer只能播放一个url)
self.player=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:Nil];
//3.缓冲
[self.player prepareToPlay];
}
- (IBAction)play {
//开始播放/继续播放
[self.player play];
}
- (IBAction)pause {
//暂停
[self.player pause];
}
- (IBAction)stop {
//停止
//注意:如果点击了stop,那么一定要让播放器重新创建,否则会出现一些莫名其面的问题
[self.player stop];
}
@end
注意:如果点了“停止”,那么一定要播放器重新创建,不然的话会出现莫名其妙的问题。
点击了stop之后,播放器实际上就不能再继续使用了,如果还继续使用,那么后续的一些东西会无法控制。
推荐代码:
复制代码 代码如下:
#import "YYViewController.h"
#import
@interface YYViewController ()
@property(nonatomic,strong)AVAudioPlayer *player;
- (IBAction)play;
- (IBAction)pause;
- (IBAction)stop;
@end
复制代码 代码如下:
@implementation YYViewController
#pragma mark-懒加载
-(AVAudioPlayer *)player
{
if (_player==Nil) {
//1.音频文件的url路径
NSURL *url=[[NSBundle mainBundle]URLForResource:@"235319.mp3" withExtension:Nil];
//2.创建播放器(注意:一个AVAudioPlayer只能播放一个url)
self.player=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:Nil];
//3.缓冲
[self.player prepareToPlay];
}
return _player;
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (IBAction)play {
//开始播放/继续播放
[self.player play];
}
- (IBAction)pause {
//暂停
[self.player pause];
}
- (IBAction)stop {
//停止
//注意:如果点击了stop,那么一定要让播放器重新创建,否则会出现一些莫名其面的问题
[self.player stop];
self.player=Nil;
}
@end
四、播放多个文件
点击,url,按住common建查看。
可以发现,这个url是只读的,因此只能通过initWithContentsOfUrl的方式进行设置,也就意味着一个播放器对象只能播放一个音频文件。
那么如何实现播放多个音频文件呢?
可以考虑封装一个播放音乐的工具类,下一篇文章将会介绍具体怎么实现。
笔者iOS开发工程师,现在很多应用场景下都会用到视频播放技术,当然iOS APP也不例外,这是写这篇文章的背景。
最近我一个同样做iOS工程师的同学说他最近面试了一个人,简历里写着做过视频播放,就问他基本的视频播放原理是什么,结果此人一脸懵逼状什么也没答上来,只是说会用iOS SDK下调用视频播放的几个API。我同学跟我说他就是想问问此人计算机基础怎么样,其实只要应聘者能说出“解码”两个字都会让他满意的,可惜他却什么也没说出来。这又让笔者想起几年前临近大学毕业时同寝室友校招面试时也遇到了同样的问题,他也做过视频播放,人家就问他其中有两个问题,一是如果现在有一种非常奇怪的格式的视频让你播放你该怎么办,他也是懵逼了。二是如果现在有一个1G的超大视频让你播放,你又该怎么办,他直接就傻了,面试自然折戟沉沙了。
事实上仅就iOS APP来讲,要想做出视频播放的功能来,的确是调用 AVFoundation 框架下几个常用的API就可以了,iOS 9 之前常用的是 MPMoviePlayerController ,ios 9 之后推荐使用流播放技术的 AVPlayer ,可是就像常说的API普通的程序员都会调,可是真正有专业基础和想进阶就要知其然还要知其所以然,有专业基础的和半路出家的程序员的最大区别也正在于此,这也就成了本片文章写作的契机,下面这些内容也是笔者整合了一些自己的一些积累,主要来源于我们有合作关系的一家叫保利威视的视频解决方案提供商,希望对大家有帮助,水平有限,有不足之处还请大家不吝赐教。
视音频技术主要包含以下几点:** 封装技术,视频压缩编码技术以及音频压缩编码技术。如果考虑到网络传输的话,还包括流媒体协议技术。**
视频播放器播放网上的视频文件,需要经过以下几个步骤:** 解协议,解封装,解码视音频,视音频同步**。如果播放本地文件则不需要解协议,为以下几个步骤:解封装,解码视音频,视音频同步。过程如图所示。
解协议的作用,就是将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如HTTP,RTMP,或是MMS等等。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。
解封装的作用,就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。
解码的作用,就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频 数据输出成为非压缩的音频抽样数据,例如PCM数据。
视音频同步的作用,就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。
项目中应产品的需求,需给button添加点击声音。下面我总结了一下关于播放系统提示音和播放自定义声音的方法。
一:播放系统提示音。
第一步:首先得导入AudioToolbox框架 #importAudioToolbox/AudioToolbox.h
第二步:定义一个SystemSoundIDSystemSoundID soundID =1000;
AudioServicesPlaySystemSound(soundID);
SystemSoundID具体参数请参考 传送门
二:播放本地文件
//得到音效文件的地址
NSString*soundFilePath =[[NSBundlemainBundle]pathForResource:nameofType:type];
//将地址字符串转换成url
NSURL*soundURL = [NSURLfileURLWithPath:soundFilePath];
//生成系统音效id
AudioServicesCreateSystemSoundID((__bridgeCFURLRef)soundURL, soundFileObject);
//播放系统音效
AudioServicesPlaySystemSound(soundFileObject);
本文讲解的是 iOS 视频播放, 支持本地,在线播放. 进度拖动,精准跳转,获取视频的长度等问题
demo 记得点亮 star. 3Q
iOS 视频播放主要使用的类 AVPlayerItem,AVPlayerLayer,AVPlayer
AVPlayerItem: 提供视频信息, 利用视频的 url 创建一个对象.利用 kvo 监听 status,可以获取当前视频的状态.
AVPlayer: 就类似视频的控制者. 可以用来控制视频的播放,暂停,跳转等. 它的创建依赖于AVPlayerItem
AVPlayerLayer: 用于视频的显示. 可以理解成一个 view. 它的创建依赖于AVPlayer
简单总结: AVPlayer控制视频状态, AVPlayerLayer用于显示,AVPlayerItem提供视频信息
获取视频的长度 s
视频精准跳转.拖动 UISlider,监听 value 改变方法如下:
//为什么timescale要设置成 600 CMTime教程
快进:AVPlayer .rate 1
慢放: 0 AVPlayer .rate 1
快退: AVPlayer .rate 0 (m3u8 不能快退)
MP4:如果快进到了缓存不够的地方:KVC监听 AVPlayerItem .isPlaybackBufferEmpty = yes
快退到头会走通知AVPlayerItemDidPlayToEndTimeNotification
m3u8(静态):快进与MP4格式视频一致,可以10倍 20倍播放。
m3u8(动态):快进到了缓存不够的地方,会走通知AVPlayerItemDidPlayToEndTimeNotification。
备注:使用[AVPlayerItem stepByCount:-24];
将AVPlayerItem 向前或向后移动指定的步数,正数前进,负数后退。 每个步数的大小取决于AVPlayerItem启用的AVPlayerItemTracks对象;
注册监听和通知