葡京在线开户iOS学习笔记25-录音和网络流媒体

一、录音

AVFoundation框架还有一个AVAudioRecorder好像专门处理录音操作,它一律支撑多音频格式。

Linux系统中之每个文件及目录都出看许可权限,用它们来确定谁好经何种方法对文件和目录进行走访同操作。

先期来了解下AVAudioRecorder的常用属性:
@property (readonly, getter=isRecording) BOOL recording;//是否正在录音
@property (readonly) NSDictionary<NSString *, id> *settings;//录音配置
@property (readonly) NSURL *url;//录音文件存放URL
@property (readonly) NSTimeInterval currentTime;//录音时长
@property (getter=isMeteringEnabled) BOOL meteringEnabled;//是否监控声波

chmod  命令可以改变所有子目录的权柄,下面来2栽办法 
反一个文件的权: chmod mode file|dir 
更改所有子目录的权位: chmod mode dir -R                 
注意后面加了单-R参数 
参数就是权模式 mode = 777 or 752 ,666,,, 
mode 的老三只数字,分别代表owner,group,others所持有的权位。 
1 = x 执行 2 = w 写 4 = r 读,比如owner具有所有权限,1+2+4=7, 
并且以group 具有读 和推行权 1+4 =
5

常用对象方法:
- (BOOL)prepareToRecord;//为录音准备缓冲区
- (BOOL)record;//录音开始,暂停后调用会恢复录音
- (BOOL)recordAtTime:(NSTimeInterval)time;//在指定时间后开始录音
- (BOOL)recordForDuration:(NSTimeInterval) duration;//按指定时长录音
- (BOOL)recordAtTime:(NSTimeInterval)time 
         forDuration:(NSTimeInterval)duration;//上面2个的合体
- (void)pause; //中断录音
- (void)stop; //停止录音
- (BOOL)deleteRecording;//删除录音,必须先停止录音再删除

将目录/his及其下的具有文件及子目录的属于主改成wang,属组改化users。 
    $ chown –R wang.users /his

常用的代办方:
//录音完成后调用
- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder 
                           successfully:(BOOL)flag;
//录音编码发送错误时调用
- (void)audioRecorderEncodeErrorDidOccur:(AVAudioRecorder *)recorder 
                                   error:(NSError *)error;

上传了只 WordPress,在线解压后发现文件没有写副权限, 于是为此了 chmod
777 
filename 
不过特变动了拖欠文件, 文件内的文本或者无写副权限, 网上查了瞬间, 
修改linux文件权限命令:chmod 
用法:chmod XXX filename

录音操作步骤【和旋律播放类似】:
  1. 导入AVFoundation框架,导入头文件:
#import <AVFoundation/AVFoundation.h>
  1. 装音频会话类型为AVAudioSessionCategoryPlayAndRecord
    因为涉及录音与播音操作。
  2. 备安排录音设置的字典,例如录音格式、录音采样等等。
  3. 创立录音器对象AVAudioRecorder,设置录音存放文件URL路径以及配备。
  4. 初始化录音器对象,设置代理及外性能
  5. 调用录音器的prepareToRecord,为录音准备缓冲区
  6. 始于录音record,暂停录音pause,停止录音stop
  7. 心想事成代理方,监听录音完成

×××(所有者\组用户\其他用户)

咱来贯彻一个简短的录音项目:
#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>

@interface ViewController () <AVAudioRecorderDelegate>

@property (strong, nonatomic) IBOutlet UIProgressView *progressView;
@property (strong, nonatomic) AVAudioRecorder *recorder;
@property (strong, nonatomic) AVAudioPlayer *player;
@property (strong, nonatomic) NSTimer *timer;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //初始化定时器
    self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1
                                                  target:self
                                                selector:@selector(audioPowerChange)
                                                userInfo:nil
                                                 repeats:YES];
    self.timer.fireDate = [NSDate distantFuture];//暂停定时器
    //初始化音频会话
    [self setAVAudioSession];
    //初始化录音器
    [self initAudioRecorder];
}
/* 获取录音存放路径 */
- (NSString *)getSaveFilePath{
    NSString *urlStr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                NSUserDomainMask,YES).firstObject;
    urlStr = [urlStr stringByAppendingPathComponent:@"recorder.caf"];
    return urlStr;
}
/* 初始化音频播放器 */
- (void)initAudioPlayer{
    NSString *filePath = [self getSaveFilePath];
    NSURL *url = [NSURL fileURLWithPath:filePath];
    NSError *error = nil;
    AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:url
                                                                   error:&error];
    if (error) {
        NSLog(@"初始化音乐播放器失败");
        return;
    }
    player.numberOfLoops = 0;
    [player prepareToPlay];
    self.player = player;
}
/* 初始化录音器 */
- (void)initAudioRecorder{
    //创建URL
    NSString *filePath = [self getSaveFilePath];
    NSURL *url = [NSURL fileURLWithPath:filePath];
    NSMutableDictionary *settings = [NSMutableDictionary dictionary];
    //设置录音格式
    [settings setObject:@(kAudioFormatLinearPCM) forKey:AVFormatIDKey];
    //设置录音采样率,8000是电话采样率,对于一般录音已经够了
    [settings setObject:@(8000) forKey:AVSampleRateKey];
    //设置通道,这里采用单声道
    [settings setObject:@(1) forKey:AVNumberOfChannelsKey];
    //每个采样点位数,分为8、16、24、32
    [settings setObject:@(8) forKey:AVLinearPCMBitDepthKey];
    //是否使用浮点数采样
    [settings setObject:@(YES) forKey:AVLinearPCMIsFloatKey];

    //创建录音器
    NSError *error = nil;
    AVAudioRecorder *recorder = [[AVAudioRecorder alloc] initWithURL:url
                                                            settings:settings
                                                               error:&error];
    if (error) {
        NSLog(@"初始化录音器失败");
        return;
    }
    recorder.delegate = self;//设置代理
    recorder.meteringEnabled = YES;//如果要监控声波,必须设为YES
    [recorder prepareToRecord];//为录音准备缓冲区
    self.recorder = recorder;
}
/* 设置音频会话支持录音和音乐播放 */
- (void)setAVAudioSession{
    //获取音频会话
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    //设置为播放和录音状态,以便可以在录制完之后播放录音
    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:NULL];
    //激活修改
    [audioSession setActive:YES error:NULL];
}
/* 进度条模拟声波状态,每0.1秒执行一次 */
- (void)audioPowerChange{
    //更新测量值
    [self.recorder updateMeters];
    //取得第一个通道的音频,注意音频强度范围是-160.0到0
    float power = [self.recorder averagePowerForChannel:0];
    CGFloat progress = (1.0/160.0)*(power+160.0);
    self.progressView.progress = progress;
}
/* 点击录音按钮 */
- (IBAction)record:(id)sender {
    //录音
    if (![self.recorder isRecording]) {
        [self.recorder record];
        self.timer.fireDate = [NSDate distantPast];//恢复定时器
    }
}
/* 点击暂停按钮 */
- (IBAction)pauseRecord:(id)sender {
    //录音暂停
    if ([self.recorder isRecording]) {
        [self.recorder pause];
        self.timer.fireDate = [NSDate distantFuture];//暂停定时器
    }
}
/* 点击停止按钮 */
- (IBAction)stopRecord:(id)sender {
    //录音停止
    [self.recorder stop];
    self.timer.fireDate = [NSDate distantFuture];//暂停定时器
    self.progressView.progress = 0.0;
}
#pragma mark - AVAudioRecorderDelegate代理方法
/* 完成录音会调用 */
- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder 
                           successfully:(BOOL)flag
{
    //录音完成后自动播放录音
    [self initAudioPlayer];
    [self.player play];
}
@end

录音效果图

×=4 读的权杖 
×=2 勾的权力 
×=1 履的权柄

次、网络流媒体

AVAudioPlayer旋律播放器只能播放本地文件,并且是一次性加载所有的音频数据,但咱有时候用度下载边听怎么惩罚?
AVAudioPlayer大凡匪支持这种网络流媒体形式的点子播放,要播这种网络流媒体,我们得采取AudioToolbox框架的旋律队列服务Audio Queue Services

常用修改权限的指令:

板队列服务分为3部分:
  • 3个缓冲器
  • 1单缓冲队列
  • 1个回调

sudo chmod 600 ××× (只有所有者有读与描写的权位) 
sudo chmod 644 ××× (所有者有读与描绘的权杖,组用户只有读的权力) 
sudo chmod 700 ××× (只有所有者有读与描写及执行之权能)

1. 下是录音的旋律队列服务之做事原理:

sudo chmod 666 ××× (每个人都发生读与描绘的权柄)

2. 底是广播音频的点子队列服务的工作规律:

莫非我们又要采用C语言函数来落实了也?/(ㄒoㄒ)/~~
其实目前曾经产生许多老三正值开源框架可以动用,这里就是介绍下FreeStreamer框架

sudo chmod 777 ××× (每个人还发出读与描绘及执行之权杖)

FreeStreamer导入步骤【我是以Xcode7下进行的,Xcode6没尝试了】:
  1. github下载FreeStreamer到本地
  1. 将里面的FreeStreamer/FreeStreamer.xcodeproj拖入到花色蒙

  2. 以及时是动态库,添加到General产之嵌入式二进制文件列表

  3. 上加头文件

#import <FreeStreamer/FreeStreamer.h>

例如: 
    – rw- r–r–

FreeStreamer使用:
- (void)viewDidLoad {
    [super viewDidLoad];
    [self initAudioStream];
    //播放网络流媒体音频
    [self.audioStream play];
}
/* 初始化网络流媒体对象 */
- (void)initAudioStream{
    NSString *urlStr = @"http://sc1.111ttt.com/2016/1/02/24/195242042236.mp3";
    NSURL *url = [NSURL URLWithString:urlStr];
    //创建FSAudioStream对象
    self.audioStream = [[FSAudioStream alloc] initWithUrl:url];
    //设置播放错误回调Block
    self.audioStream.onFailure = ^(FSAudioStreamError error, NSString *description){
          NSLog(@"播放过程中发生错误,错误信息:%@",description);
    };
    //设置播放完成回调Block
    self.audioStream.onCompletion = ^(){
          NSLog(@"播放完成!");
    };
    [self.audioStream setVolume:0.5];//设置声音大小
}

自引进一个在线网络MP3网址,可以去那边复制网络MP3音乐地址:MP3音乐链接获取
点击想如果播的音乐,先试听一下,确定会播放,在网页下方复制链接到你的色蒙虽实施了

网络MP3音乐链接获取

夫网站不清楚能运行至啊时,趁现在尚会执行,赶紧去摸索一下吧,(o)/~。

    普通文书 文件主组用户其他用户 
    是文本sobsrc.tgz
的访问权限,表示sobsrc.tgz是一个不足为奇文书;sobsrc.tgz 
的属主有读写权限;与sobsrc.tgz属主同组的用户只有读权限;其他用户也只有读权限。 
   
确定了一个文书之顾权限后,用户可以以Linux系统提供的chmod命令来还设 
定不同的造访权限。也可采取chown命令来改变某个文件或者目录的所有者。利用chgrp

发生啊意见可以在江湖评论区中提成,喜欢自就算关心自己吧!O(∩_∩)O哈!

指令来改某个文件或者目录的用户组。 
    下面分别对这些命令加以介绍。 

  
  chmod 命令

  chmod命令是殊重大之,用于转移文件或者目录的访权限。用户用其决定文件要目录的访问权限。

  该令有星星点点栽用法。一种植是富含字母和操作符表达式的文设定法;另一样栽是含数字之数字要定法。

  1. 仿设定法

  chmod [who] [+ | – | =] [mode] 文件名¼

  命令中列选的意思为:

  操作对象who可是下述字母中的无一个还是它的整合:

  u 表示“用户(user)”,即文件或者目录的主人。

  g 表示“同组(group)用户”,即和公事属主有相同组ID的有用户。

  o 表示“其他(others)用户”。

  a 表示“所有(all)用户”。它是系默认值。

  操作符号可以是:

  + 添加某个权限。

  - 取消某个权限。

  = 赋予给定权限并取消其他具有权力(如果有言语)。

  设置mode所表示的权位可用下述字母之任性组合:

  r 可读。

  w 可写。

  x 可执行。

  X 只出对象文件对少数用户是不过实施之还是欠对象文件是目录时才追加x
属性。

  s
在文书实施时把过程的属主或组ID置为该公文之文书属主。方式“u+s”设置文件的用户ID位,“g+s”设置组ID位。

  t 保存程序的文书及交换设备及。

  u 与公事属主拥有一样的权杖。

  g 与同文书属主同组的用户拥有一致的权。

  o 和其他用户拥有相同的权位。

  文件称:以空格分开的使改权限的公文列表,支持过渡配符。

  以一个指令执行被不过为有多独权力方式,其间用逗号隔开。例如:chmod
g+r,o+r example

  使同组和其他用户对文件example 有读权限。

  2. 数字设定法

  我们得首先了解用数字代表的属性之含义:0表示尚未权力,1象征只是实施权,2代表可写权限,4意味着只是读权限,然后拿该相加。所以数字属性之格式应为3单从0到7的八迈入制数,其顺序是(u)(g)(o)。

  例如,如果想叫有文件之属主有“读/写”二栽权限,需要把4(可读)+2(可写)=6(读/写)。

  数字要定法的貌似式也:

  chmod [mode] 文件名¼

  例子:

  (1)文字设定法:

  例1:$ chmod a+x sort

  即设定文件sort的性能为:

  文件属主(u) 增加执行权

  与公事属主同组用户(g) 增加执行权

  其他用户(o) 增加执行权

  例2:$ chmod ug+w,o-x text

  即设定文件text的性能为:

  文件属主(u) 增加写权限

  及公事属主同组用户(g) 增加写权限

  其他用户(o) 删除执行权

  例3:$ chmod u+s a.out

  假设执行chmod后a.out的权为(可以就此ls – l a.out命令来拘禁):

  –rws–x–x 1 inin users 7192 Nov 4 14:22 a.out

  并且这执行文书要为此到一个文件文件shiyan1.c,其文件存取权限为“–rw——-”,即该文件才发夫属主具有读写权限。

  当其他用户执行a.out这个顺序时,他的身价为是序暂时改为inin(由于chmod命令中动用了s选项),所以他就是能读取shiyan1.c是文件(虽然此文件于设定为其他人不享有任何权力),这便是s的作用。

  因此,在一切体系被特意是root本身,最好不用了多之安装这种类型的文本(除非必要)这样好保障系统的安康,避免以某些程序的bug而使系统受到侵犯。

  例4:$ chmod a–x mm.txt

  $ chmod –x mm.txt

  $ chmod ugo–x mm.txt

  以上就三独指令还是将文件mm.txt的履行权删除,它设定的靶子啊所有使用者。

  (2)数字设定法:

  例1: $ chmod 644 mm.txt

  $ ls –l

  即设定文件mm.txt的特性为:

  -rw-r–r– 1 inin users 1155 Nov 5 11:22 mm.txt

  文件属主(u)inin 拥有读、写权限

  以及公事属主同组人用户(g) 拥有读权限

  其他人(o) 拥有读权限

  例2: $ chmod 750 wch.txt

  $ ls –l

  -rwxr-x— 1 inin users 44137 Nov 12 9:22 wchtxt

  即设定wchtxt这个文件之属性也:

  文件主本人(u)inin 可读/可写/可执行权

  同公事主同组人(g) 可读/可执行权

  其他人(o) 没有其余权力

  chgrp命令

  功能:改变文件或者目录所属之组。

  语法:chgrp [选项] group filename¼

  该令改变指定指定文件所属之用户组。其中group可以是用户组ID,也堪是/etc/group文件中用户组的组名。文件称是坐空格分开的使转移属组的公文列表,支持连配符。如果用户不是拖欠公文之属主或特级用户,则无克转该文件之组。

  该令的各选项意义为:

  - R 递归式地改指定目录及其下之所有子目录及文书之属组。

  例1:$ chgrp – R book /opt/local /book

  改变/opt/local /book/及其子目录下之享有文件的属组为book。

  chown 命令

  功能:更改某个文件或者目录的属主和属组。这个令也颇常用。例如root用户将好的一个文件拷贝给用户xu,为了为用户xu能够存取这个文件,root用户应拿这个文件之属主设为xu,否则,用户xu无法存取这个文件。

  语法:chown [选项] 用户或组 文件

  说明:chown将指定文件的拥有者改吧指定的用户或组。用户可是用户称或用户ID。组好是组名或组ID。文件是盖空格分开的如果改权限的文本列表,支持过渡配符。

  该令的各选项意义如下:

  - R 递归式地改指定目录及其下之所有子目录和文件的拥有者。

  - v 显示chown命令所召开的劳作。

  例1:把公文shiyan.c的持有者改吗wang。

  $ chown wang shiyan.c

  例2:把目录/his及其下的有所文件及子目录的属于主改成wang,属组改化users。

  $ chown – R wang.users /his