一、音頻
1、iOS 裡面共有四種專門實現播放音頻的方式:
2、System Sound Services
#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:是一個高級的播放器,它支持廣泛的音頻格式,如下:
4、AVAudioPlayer的優勢:
5、開發步驟:
二、視頻
1、AVPlayer
iOS 裡面視頻播放用到的是AVPlayer(包含在AVFoundation框架內)與AVAudioPlayer有點類似,但是AVPlayer的功能更加強大,它可以用來播放音頻也可以用來播放視頻。而且在播放音頻方面 AVPlayer 可以直接播放網絡音頻。
2、開發步驟
#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、視頻下載