菜单

iOS学习45之多媒体操作,多媒体简单总结

2019年9月16日 - 4166am金沙下载
iOS学习45之多媒体操作,多媒体简单总结

图片 1加油,夜来幽梦忽还乡

 1> AVPlayer

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

iOS进阶学习-多媒体,ios进阶多媒体

一、音频

  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、视频下载

一、音频 1、iOS
里面共有四种专门实现播放音频的方式: System Sound
Services(系统声音服务)。 OpenAL(跨…

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

1、System Sound Services 2、OpenAL(跨平台的开源的音频处理接口)3、Audio
Queue Services (播放和录制音频服务)4、AVAudioPlayer :
只能播放一个完整音频, 完全下载好的

  • 声音长度小于30秒

适合开发游戏的音频官方教程:
: 支持广泛的音频格式AACAMRALACiLBCIMA4linearPCMMP3

导入框架 #import <AVFoundation/AVFoundation.h>

//
获取到的需要播放的modelMusicModel *model = [[MusicHandle defaultHandle] modelWithIndex:self.musicIndex];
//
音频的地址NSString *pathString = [[NSBundle mainBundle] pathForResource:model.musicName ofType:model.musicType]; NSData *data = [NSData dataWithContentsOfFile:pathString];//根据音频的data创建一个AVAudioPlayer对象self.audioPlayer = [[AVAudioPlayer alloc]initWithData:data error:nil];

//播放[self.audioPlayer play];//暂停[self.audioPlayer pause];//停止[self.audioPlayer stop];//音量self.audioPlayer.volume = 1;//播放次数
self.audioPlayer.numberOfLoops = -1;//代理协议
AVAudioPlayerDelegate//播放完成会调用的代理方法- audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:flag;//播放解码失败- audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error;

导入框架#import <AVFoundation/AVFoundation.h>

NSString *playString = @"http://static.tripbe.com/videofiles/20121214/9533522808.f4v.mp4";//
统一资源定位符NSURL *playerURL = [NSURL URLWithString:playString];//初始化self.playerView = [[AVPlayerViewController alloc]init];//AVPlayerItem
,视频的一些信息.
创建AVPlayer使用的AVPlayerItem *item = [[AVPlayerItem alloc]initWithURL:playerURL];//通过AVPlayerItem创建AVPlayer

 layer.frame = CGRectMake(0, 0, self.view.frame.size.width, 200);```` //设置AVPlayer的填充模式 ` layer.videoGravity = AVLayerVideoGravityResizeAspect; [self.view.layer addSublayer:layer]; ` //设置AVPlayerViewController内部的AVPlayer为刚创建的AVPlayer `self.playerView.player = self.player;` //关闭AVPlayerViewController内部的约束 ` self.playerView.view.translatesAutoresizingMaskIntoConstraints = YES;``- touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ ` //开始// ` [self.player play];` //暂停 ` //[self.player pause]; ` // 音量 0 ~ 1`// self.player.volume = 0; ` //获取当前播放到第几秒`// CGFloat time = self.player.currentTime.value / self.player.currentTime.timescale; ` //获取当前播放的视频或者音频的总时长`// CGFloat duration = self.player.currentItem.duration.value`` / self.player.currentItem.duration.timescale;` //替换掉当前播放的音频或者视频`// self.player replaceCurrentItemWithPlayerItem:<#(nullable AVPlayerItem *)#>]; ` //跳转到某个时间的节点 // 构建一个CMTime结构体 // 参数 1 : 时间 // 参数 2 : 时间跨度`// CMTimeMakeWithSeconds(100, self.player.currentTime.timescale);// self.player seekToTime:<##> completionHandler:<#^(BOOL finished)completionHandler#> [self showViewController:self.playerView sender:nil];}`

 5> AVAudioPlayer优势

 2> 视频播放实现步骤

  引入头文件代码

#import <AVFoundation/AVFoundation.h>

 NSString *playString = @"http://static.tripbe.com/videofiles/20121214/9533522808.f4v.mp4";

 // 播放地址
 NSURL *playURL = [NSURL URLWithString:playString];

   AVPlayerItem 可以获取视频的信息,当前播放时间,总时间等

AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:playURL];

  AVPlayerItem 的重要属性

   状态 status

    AVPlayerStatusUnknown,(代表视频播放出现了未知的问题)

    AVPlayerStatusReadyToPlay,(代表视频可以播放,可以调用
play方法)

    AVPlayerStatusFailed(代表视频无法进行播放了)

   loadedTimeRange:代表已经缓存的进度,监听此属性可以在 UI
中更新缓存进度,也是很有用的一个属性

@interface ViewController ()
    @property(nonatomic, strong)AVPlayer *player;
@end 

self.player = [[AVPlayer alloc] initWithPlayerItem:item];

    // 设置播放页面
    AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:_player];
    // 设置播放页面的大小
    layer.frame = CGRectMake(0, 100, [UIScreen mainScreen].bounds.size.width, 300);
    // 设置背景颜色
    layer.backgroundColor = [UIColor cyanColor].CGColor;
    // 设置播放窗口和当前视图之间的比例显示内容
    layer.videoGravity = AVLayerVideoGravityResizeAspect;
    // 添加播放视图到view上
    [self.view.layer addSublayer:layer];

// 播放 
[self.player play];

[self.player seekToTime:CMTimeMakeWithSeconds(progress,
//设置每秒钟多少帧
self.player.currentTime.timescale) completionHandler:^(BOOL finished) {

       }];

 // 设置音量
 self.player.volume = 1.0f;
    // 当前播放时间
 self.player.currentTime

//当播放完成时,可以注册通知,根据需求,做出不同的响应
AVPlayerItemDidPlayToEndTimeNotification

   可以通过设置观察者来完成添加播放完成通知

-(void)addNotification{
    //给AVPlayerItem添加播放完成通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:)name:AVPlayerItemDidPlayToEndTimeNotification object:self.player.currentItem];
}

-(void)playbackFinished:(NSNotification *)notification{
    NSLog(@"视频播放完成.");
}

 通过以上的六个步骤已经可以实现视频在 iOS 客户端的播放;

 AVPlayerltem 资源管理对象,作用是:切换视频播放,使用时切换不同的 Item
即可. 而非创建新的 AVPlayer.

 AVPlayerItem 的一些重要属性可以使我们定制视频的开发

实例代码:

- (void)viewDidLoad {
    [super viewDidLoad];

    NSString *playString = @"http://static.tripbe.com/videofiles/20121214/9533522808.f4v.mp4";
    NSURL *url = [NSURL URLWithString:playString];
    // 本地视频
//    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"1457622279563.mp4" ofType:nil]];

    // 设置播放的项目
    AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:url];

    // 初始化player对象
    self.player = [[AVPlayer alloc] initWithPlayerItem:item];

    // 设置播放页面
    AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:_player];
    // 设置播放页面的大小
    layer.frame = CGRectMake(0, 100, [UIScreen mainScreen].bounds.size.width, 300);
    // 设置背景颜色
    layer.backgroundColor = [UIColor cyanColor].CGColor;
    // 设置播放窗口和当前视图之间的比例显示内容
    layer.videoGravity = AVLayerVideoGravityResizeAspect;
    // 添加播放视图到view上
    [self.view.layer addSublayer:layer];

    // 设置播放进度的默认值
    self.progressSlider.value = 0;
    // 设置播放音量的默认值
    self.player.volume = 1.0f;

    [self addNotification];
}

#pragma mark - 开始播放按钮的响应方法
- (IBAction)startPlayer:(UIButton *)sender
{
    [self.player play];
}
#pragma mark - 暂停播放按钮的响应方法
- (IBAction)puasePlayer:(UIButton *)sender
{
    [self.player pause];
}
#pragma mark - 改变进度按钮的响应方法
- (IBAction)changeProgress:(UISlider *)sender
{
    self.sumPlayOperation = _player.currentItem.duration.value / _player.currentItem.duration.timescale;

// CMTimeMake(a, b) a表示当前时间,b表示每秒钟有多少帧
    [_player seekToTime:CMTimeMakeWithSeconds(sender.value * self.sumPlayOperation, _player.currentTime.timescale) completionHandler:^(BOOL finished) {
        [self.player play];
    }];
}

- (void)addNotification{
    //给AVPlayerItem添加播放完成通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:)name:AVPlayerItemDidPlayToEndTimeNotification object:self.player.currentItem];
}

- (void)playbackFinished:(NSNotification *)notification{
    NSLog(@"视频播放完成.");
}

 

1. 音频 1
音频实现简述 iOS 里面共有四种专门实现播放音频的方式: System Sound
Services(系统声音服务)…

 8> 音频的后台播放

后台播放音频设置   

    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setActive:YES error:nil];
    [session setCategory:AVAudioSessionCategoryPlayback error:nil];

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 

 1> 音频实现简述

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

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图