iOS进阶学习-多媒体

一、音频

  1、iOS 里面共有四种专门实现播放音频的方式:

  • System Sound Services(系统声音服务)。
  • OpenAL(跨平台的开源的音频处理接口)。
  • Audio Queue Services(播放和录制音频服务)。
  • AVAudioPlayer(高级音频播放器)。
  • 在这里我们主要介绍一下System Sound Services和AVAudioPlayer。

  2、System Sound Services

  • System Sound Services 是最底层也是最简单的声音播放服务,通过调用 AudioServicesPlaySystemSound 这个函数就可以播放一些简单的音频文件。
  • 适用场景:适合播放一些很小的提示或者警告音,AudioToolbox.framework是一套基于C语言的框架,使用它来播放音效其本质是将短音频注册到系统声音服务(System Sound Service)。
  • 局限性:
  • 声音长度要小于30s
  • 格式:必须是PCM或IMA4
  • 不能控制播放的进度
  • 调用方法后立即播放声音
  • 没有循环播放和立体声音播放
  • 示例代码:(用storyboard创建一个按钮,关联点击事件)
#import "ViewController.h"

//引入头文件
#import <AudioToolbox/AudioToolbox.h>
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

#pragma mark - 播放音乐
- (IBAction)playAction:(id)sender {

    //得到的主要应用程序包
    CFBundleRef mainBundle;
    SystemSoundID soundFileObject;
    mainBundle = CFBundleGetMainBundle ();

    //声音文件的URL
    CFURLRef soundFileURLRef  = CFBundleCopyResourceURL (mainBundle,CFSTR ("蔡琴 - 爱断情伤"),CFSTR ("wav"),NULL);

    //注册声音到系统
    AudioServicesCreateSystemSoundID (soundFileURLRef,&soundFileObject);

    // AudioServicesAddSystemSoundCompletion 方法为音频播放添加 CallBack 函数,有了 CallBack 函数我们可以解决不少问题,比如可以克服 System Sound Services 本身不支持循环播放的问题。
    AudioServicesAddSystemSoundCompletion (soundFileObject, NULL , NULL ,&completionCallback,(__bridge void *) self );

    //播放注册的声音,(此句代码,可以在本类中的任意位置调用,不限于本方法中)
    AudioServicesPlaySystemSound(soundFileObject);

    //让手机震动
    //    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

}

static  void  completionCallback (SystemSoundID  ssID, void* clientData) {
    // Play again after sound play completion
    NSLog(@"播放完成-传入ID为-%u,传入的参数为%@", (unsigned int)ssID, clientData);

    AudioServicesPlaySystemSound(ssID);
}

void playFinished(SystemSoundID  ssID, void* clientData)
{
//    unsigned long ID = ssID; // ssID 不能直接作为参数打印出来,需要中转一次

    NSLog(@"播放完成-传入ID为-%u,传入的参数为%@", (unsigned int)ssID, clientData);

    AudioServicesPlaySystemSound(ssID);

    // 移除完成后执行的函数
//    AudioServicesRemoveSystemSoundCompletion(ssID);

    // 根据ID释放自定义系统声音
//    AudioServicesDisposeSystemSoundID(ssID);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

  3、AVAudioPlayer:是一个高级的播放器,它支持广泛的音频格式,如下:

  • AAC
  • AMR(AdaptiveMulti-Rate, aformatforspeech)
  • ALAC(AppleLossless)
  • iLBC(internetLowBitrateCodec, anotherformatforspeech)
  • IMA4(IMA/ADPCM)
  • linearPCM(uncompressed)
  • MP3(MPEG-1audiolayer3)

  4、AVAudioPlayer的优势:

  • 支持更多的格式
  • 可以播放任意长度的音频文件
  • 支持循环播放
  • 可以同步播放多个音频文件
  • 控制播放进度以及从音频的任意一点开始播放

  5、开发步骤:

  • AVAudioPlayer包含在 AVFoundation框架中,所以开发的时候首先导入音频的框架AVFoundation.framework。注意:引入头文件 #import <AVFoundation/AVFoundation.h>。
  • AVAudioPlayer的初始化的时候需要给一个播放文件:AVAudioPlayer  *avAudioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:文件路径 error:nil];
  • 重要属性:1.设置初始音量大小 audioPlayer.volume = 1;(0.0 ~ 1.0);2.设置音乐播放次数  audioPlayer.numberOfLoops = -1(只要是负数都是循环播放);3.   播放进度 audioPlayer.currentTime = 0;
  • 重要方法:1.预播放:[audioPlayer prepareToPlay];2.播放:[audioPlayer play];3.暂停:[audioPlayer pause];4.停止:[audioPlayer stop];
  • 协议(AVAudioPlayerDelegate):1.播放完成会调用的代理方法:- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag;播放解码失败:- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error。
  • 示例代码:github下载地址

二、视频

  1、AVPlayer

  iOS 里面视频播放用到的是AVPlayer(包含在AVFoundation框架内)与AVAudioPlayer有点类似,但是AVPlayer的功能更加强大,它可以用来播放音频也可以用来播放视频。而且在播放音频方面 AVPlayer 可以直接播放网络音频。

  2、开发步骤

  • 1)导入支持视频播放的框架AVFoundation.framework,引入头文件#import <AVFoundation/AVFoundation.h>。
  • 2)获取播放的地址。
  • 3)根据播放的 URL 创建 AVPlayerItem 对象( AVPlayerItem 可以获取视频的信息,当前播放时间,总时间等)。
  • AVPlayerItem的重要属性:
  • 状态 status:
  • AVPlayerStatusUnknown,(代表视频播放出现了未知的问题)
  • AVPlayerStatusReadyToPlay,(代表视频可以播放,可以调用 play方法)
  • AVPlayerStatusFailed(代表视频无法进行播放了)
  • loadedTimeRange:代表已经缓存的进度,监听此属性可以在 UI 中更新缓存进度,也是很有用的一个属性。
  • 4)根据AVPlayerItem初始化 AVPlayer 对象。
  • 5)单纯只是使用 AVPlayer 类无法显示视频;这个类并没有真正的视图;需要将视频层添加到 AVPlayerLayer中;最后需要把AVPlayerLayer添加到需要播放页面的 Layer 层
  • 6)AVPlayerLayer 相关设置以及播放。
  • 7)在指定的时间播放。
  • 8)播放完成的通知。
  • 通过以上的六个步骤已经可以实现视频在 iOS 客户端的播放。
  • 代码示例:
#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
#import <AVKit/AVKit.h>
@interface ViewController ()
/// 控制视频播放的控件
@property (weak, nonatomic) IBOutlet UISlider *progressSlider;
/// 声明播放视频的控件属性(也可以用于播放音频)
@property (nonatomic, strong) AVPlayer *player;
/// 播放的总时长
@property (nonatomic, assign) CGFloat sumPlayOperation;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    // 设置播放的url
    NSString *playString = @"http://static.tripbe.com/videofiles/20121214/9533522808.f4v.mp4";
    NSURL *url = [NSURL URLWithString:playString];
    // 设置播放的项目
    AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:url];
    // 初始化player对象
    self.player = [[AVPlayer alloc] initWithPlayerItem:item];
    // 设置播放页面
    AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:self.player];
    // 设置播放页面的大小
    layer.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 300);
    // 设置背景颜色
    layer.backgroundColor = [UIColor cyanColor].CGColor;
    // 设置播放窗口和当前视图之间的比例显示内容
    layer.videoGravity = AVLayerVideoGravityResizeAspect;
    // 添加播放视图到self.view上
    [self.view.layer addSublayer:layer];
    // 设置播放进度的默认值
    self.progressSlider.value = 0;
    // 设置播放的默认音量值
    self.player.volume = 1.0f;

}
#pragma mark - 开始播放
- (IBAction)startPlayer:(id)sender {
    [self.player play];
}
#pragma mark 停止播放
- (IBAction)stopPlayer:(id)sender {
    [self.player pause];
}
#pragma mark 改变播放进度
- (IBAction)changePlaye:(id)sender {
    self.sumPlayOperation = self.player.currentItem.duration.value / self.player.currentItem.duration.timescale;
    // 第一个参数是:当前时间
    // 第二个参数是:每秒钟有都少帧

    [self.player seekToTime:CMTimeMakeWithSeconds(self.progressSlider.value * self.sumPlayOperation, self.player.currentTime.timescale) completionHandler:^(BOOL finished) {
        [self.player play];
    }];
}

  3、视频下载

  • 视频下载需要使用多线程
  • 思路:继承 NSOperation,实现下载任务类
  • 注意:开启runLoop 保证下载任务的结束
  • 使用 iOS8提供的NSURLSessionConfiguration可以实现后台下载
  • AFN 没有提供下载时候的多线程安全
  • 代码示例:github下载地址
时间: 2024-10-14 13:54:19

iOS进阶学习-多媒体的相关文章

iOS进阶学习-地图

一.地图的简介 在移动互联网时代,移动app能解决用户的很多生活琐事,比如: 导航:去任意陌生的地方. 周边:找餐馆.找酒店.找银行.找电影院. 手机软件:微信摇一摇.QQ附近的人.微博.支付宝等. 在上述应用中,都用到了地图和定位功能,在iOS开发中,要想加入这两大功能,必须基于两个框架进行开发: Map Kit :用于地图展示. Core Location :用于地理定位. 二.地图定位(CoreLocation框架,地理编码与反地理编码) 1.CoreLocation框架的使用 导入头文件

iOS进阶学习-多线程

一.多线程概述 1.程序,进程,线程 程序:由源代码生成的可执行应用.(例如:QQ.app) 进程:一个正在运行的程序可以看做一个进程.(例如:正在运行的QQ就是一个进程),进程拥有独立运行所需的全部资源. 线程:程序中独立运行的代码段.(例如:接收QQ消息的代码) 一个进程是由一或多个线程组成.进程只负责资源的调度和分配,线程才是程序真正的执行单元,负责代码的执行. 2.单线程 每个正在运行的程序(即进程),至少包含一个线程,这个线程叫主线程. 主线程在程序启动时被创建,用于执行main函数.

iOS进阶学习笔记

熟练掌握C/C++/Objective-C/Swift语言: 熟悉Cocoa Touch(Foundation,UIKit).Objective-C中block,gcd,NSOperation等: 熟悉Object消息传递等机制,Objective-C Runtime,阅读源码: 熟练使用大部分iOS平台常用库,开源库(AFNetworking,SDWebImage,fmdb),开源控件(EGOTableViewPullRefresh,MRProgress); 关注github上iOS平台开源项

iOS进阶学习-CocoaPods的安装与使用

一.CocoaPods的安装 1.简介: CocoaPods是一个用来帮助我们管理第三方依赖库的工具. 在开发iOS应用时,会经常使用第三方类库,比如SDWebImage.AFNetworking等等,手动的下载与添加类库非常麻烦,通过CocoaPods可以便捷的下载与管理第三方类库. 使用CocoaPods的目的是让我们能自动化的.集中的.直观的管理第三方开源库. 官方链接:https://cocoapods.org 2.安装步骤 第一步:打开终端,查看自己电脑的ruby环境:gem sour

iOS进阶学习-网络之数据请求

注:文中出现的网站只做用例子,所以有些已经失效的网站,具体URL大家可以自己上网搜索相关资源. 一.HTTP和HTTPS协议 1.URL: URL全称是Uniform Resource Locator(统一资源定位符)通过1个URL,能找到互联网上唯一的1个资源 URL就是资源的地址.位置,互联网上的每个资源都有一个唯一的URL URL的基本格式=协议://主机地址/路径 http://www.cnblogs.com/soley 协议:不同的协议,代表着不同的资源查找方式,资源传输方式 主机地址

iOS进阶学习-数据处理之文件读写

一.沙盒机制 1.什么是沙盒? 每一个iOS应用程序都会为自己创建一个文件系统目录(文件夹),这个独立.封闭.安全的空间,叫做沙盒. 2.沙盒机制(SandBox) 沙盒是一种安全体系. 它规定了应用程序只能在为该应用程序创建的文件夹(沙盒)内访问文件,不可以访问其它沙盒内的内容(iOS8之后已经部分开放访问). 所有的非代码文件都保存在这个地方,比如图片.声音.属性列表(plist).sqlite数据库和文本文件等. 3.沙盒机制的特点: 每个应用程序的活动范围都限定在自己的沙盒里. 不能随意

iOS进阶学习-数据库

一.数据库管理系统 1.SQL语言概述:SQL是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言. 2.常见的数据库: MySQL:MySQL是一个精巧的SQL数据库管理系统,而且是开源的数据管理系统.MySQL主要目标是快速.健壮和易用.它拥有强大的功能.灵活性.丰富的应用编程接口(API)以及精巧的系统结构. Oracle:Oracle Database,又名Oracle RDBMS,或简称Oracl

iOS进阶学习-初识AFNetworking

一.AFNetworking简介 AFNetworking是一个 在iOS开发中 使用非常多网络开源库 适用于iOS以及Mac OS X.它构建于在(Apple iOS开发文档) NSURLConnection ,  NSOperation , 以及其他熟悉的Foundation技术之上. 它拥有良好的架构,丰富的api,以及模块化构建方式,使得使用起来非常轻松. 官方链接http://cocoadocs.org/docsets/AFNetworking/1.3.0/. AFNetworking

iOS进阶学习-CoreData

一.CoreData数据库框架的优势 1.CoreData数据持久化框架是Cocoa API的一部分,首次在iOS5版本的系统中出现,它允许按照实体-属性-值模型组织数据,并以XML.二进制文件或者SQLite数据文件的格式持久化数据.CoreData主要提供独享-关系映射(ORM)功能,把OC对象转化为数据保存到文件,也可以数据转化为OC对象. 2.CoreData数据库框架的优势: sqlite: 基于C接口需要使用sql语句,代码繁琐. 在处理大量数据时,表关系更直观. 在OC中不是可视化