一、音频播放

1.音效播放(短时间的音频文件)
1> AudioServicesCreateSystemSoundID
2> AudioServicesPlaySystemSound

2.音乐播放(长时间的音频文件)
1> AVAudioPlayer
只能播放本地的音频文件

2> AVPlayer
能播放本地、远程的音频、视频文件
基于Layer显示,得自己去编写控制面板

3> MPMoviePlayerController
能播放本地、远程的音频、视频文件
自带播放控制面板(暂停、播放、播放进度、是否要全屏)

4> MPMoviewPlayerViewController
能播放本地、远程的音频、视频文件
内部是封装了MPMoviePlayerController
播放界面默认就是全屏的
如果播放功能比较简单,仅仅是简单地播放远程、本地的视频文件,建议用这个

实例:AVPlayer  MPMoviePlayerController, MPMoviewPlayerViewController 本地视频播放

5> DOUAudioStreamer
能播放远程、本地的音频文件
监听缓冲进度、下载速度、下载进度

#import "HMViewController.h"
#import "HMAudioFile.h" #import "UIView+Extension.h" #define MJStatusProp @"status"
#define MJBufferingRatioProp @"bufferingRatio" #import "DOUAudioStreamer.h" @interface HMViewController ()
/** 播放器 */
@property (weak, nonatomic) IBOutlet UILabel *infoLabel;
@property (nonatomic, strong) DOUAudioStreamer *streamer;
@property (weak, nonatomic) IBOutlet UIView *positionProgressView;
@property (weak, nonatomic) IBOutlet UIView *downloadProgressView;
@property (weak, nonatomic) IBOutlet UIView *progressBg;
@property (strong, nonatomic) NSTimer *currentTimeTimer; @end @implementation HMViewController #pragma mark - 定时器
- (void)addTimer
{
self.currentTimeTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateCurrentTime) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:self.currentTimeTimer forMode:NSRunLoopCommonModes];
} - (void)removeTimer
{
[self.currentTimeTimer invalidate];
self.currentTimeTimer = nil;
} - (void)viewDidLoad
{
[super viewDidLoad]; // 创建音频文件模型(提供音频文件路径)
HMAudioFile *file = [[HMAudioFile alloc] init];
file.audioFileURL = [NSURL URLWithString:@"http://y1.eoews.com/assets/ringtones/2012/5/18/34045/hi4dwfmrxm2citwjcc5841z3tiqaeeoczhbtfoex.mp3"]; // 创建播放器
self.streamer = [DOUAudioStreamer streamerWithAudioFile:file]; // KVO监听streamer的属性(Key value Observing)
[self.streamer addObserver:self forKeyPath:MJStatusProp options:NSKeyValueObservingOptionOld context:nil];
[self.streamer addObserver:self forKeyPath:MJBufferingRatioProp options:NSKeyValueObservingOptionOld context:nil]; // 播放
[self.streamer play]; [self addTimer]; UIWebView *webView;
webView.scalesPageToFit = YES;
} - (void)dealloc
{
[self.streamer removeObserver:self forKeyPath:MJStatusProp];
[self.streamer removeObserver:self forKeyPath:MJBufferingRatioProp];
} /**
利用KVO监听的属性值改变了,就会调用
*/
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
dispatch_async(dispatch_get_main_queue(), ^{ if ([keyPath isEqualToString:MJStatusProp]) { // 监听到播放器状态改变了
// NSLog(@"状态改变了----%d", self.streamer.status);
} else if ([keyPath isEqualToString:MJBufferingRatioProp]) { // 监听到缓冲比例改变
double unit = 1000.0; // 总长度
double expectedLength = self.streamer.expectedLength / unit / unit;
// 已经下载长度
double receivedLength = self.streamer.receivedLength / unit / unit;
// 下载速度
double downloadSpeed = self.streamer.downloadSpeed / unit; self.infoLabel.text = [NSString stringWithFormat:@"缓冲:%.2fMB/%.2fMB(%.0f%%)\n下载速度:%.2fKB/s", receivedLength, expectedLength, (receivedLength/ expectedLength) * , downloadSpeed]; self.downloadProgressView.width = self.progressBg.width * (receivedLength/ expectedLength);
}
});
} - (void)updateCurrentTime
{
self.positionProgressView.width = self.progressBg.width * (self.streamer.currentTime / self.streamer.duration);
} // AVAudioPlayer : 只能播放本地的音频文件
// AVPlayer : 能播放远程\本地的音频、视频文件
// MPMoviePlayerController : 能播放远程\本地的音频、视频文件
// MPMoviePlayerViewController : 能播放远程\本地的音频、视频文件
// self.player = [AVPlayer playerWithURL:[NSURL URLWithString:@"http://file.qianqian.com/data2/music/42275287/42275287.mp3?xcode=e41a36a1198cf7f07c498ac14eafd4a5398370073e4f3405"]]; @end

二、视频播放

1.音乐播放中2> 3> 4>

2.VLC

#import "HMViewController.h"
#import <MobileVLCKit/MobileVLCKit.h> @interface HMViewController ()
@property (nonatomic, strong) VLCMediaPlayer *player;
@end @implementation HMViewController - (void)viewDidLoad
{
[super viewDidLoad]; self.player = [[VLCMediaPlayer alloc] init];
// 设置需要播放的多媒体文件
// NSURL *url = [NSURL URLWithString:@"http://streams.videolan.org/streams/mp4/Mr_MrsSmith-h264_aac.mp4"];
NSURL *url = [[NSBundle mainBundle] URLForResource:@"minion_01.mp4" withExtension:nil];
self.player.media = [VLCMedia mediaWithURL:url];
// 设置播放界面的载体
self.player.drawable = self.view;
// 播放
[self.player play];
} - (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
} // NSURL *url = [NSURL URLWithString:@"http://y1.eoews.com/assets/ringtones/2012/5/18/34045/hi4dwfmrxm2citwjcc5841z3tiqaeeoczhbtfoex.mp3"];
// NSURL *url = [NSURL URLWithString:@"http://streams.videolan.org/streams/mp4/Mr_MrsSmith-h264_aac.mp4"];
@end

3.FFmpeg
kxmovie
Vitamio

三、录音

1.AVAudioRecorder

#import "HMViewController.h"
#import <AVFoundation/AVFoundation.h> @interface HMViewController ()
- (IBAction)startRecord;
- (IBAction)stopRecord;
@property (nonatomic, strong) AVAudioRecorder *recorder;
@property (nonatomic, strong) CADisplayLink *timer;
@property (nonatomic, strong) NSTimer *stopRecordTimer;
/** 静音的持续时间 */
@property (nonatomic, assign) CGFloat slientDuration;
@end @implementation HMViewController - (void)viewDidLoad
{
[super viewDidLoad]; } - (void)addTimer
{
self.timer = [CADisplayLink displayLinkWithTarget:self selector:@selector(update)];
[self.timer addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
} - (void)removeTimer
{
[self.timer invalidate];
self.timer = nil;
} - (void)update
{
// 更新测试值
[self.recorder updateMeters]; // 如果分贝不超过-20
float power = [self.recorder averagePowerForChannel:];
if (power <= -) { // 几乎为静音
self.slientDuration += self.timer.duration; if (self.slientDuration >= ) {
// 停止录音
[self.recorder stop];
}
} else { // 有说话
self.slientDuration = ; }
} //- (void)update
//{
// // 更新测试值
// [self.recorder updateMeters];
//
// // 如果分贝不超过-20
// float power = [self.recorder averagePowerForChannel:0];
// if (power <= -20) { // 几乎为静音
// if (!self.stopRecordTimer) {
// self.stopRecordTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self.recorder selector:@selector(stopRecord) userInfo:nil repeats:NO];
// }
// } else { // 有说话
//// [self.stopRecordTimer invalidate];
//// self.stopRecordTimer = nil;
// NSDate *time = [NSDate dateWithTimeIntervalSinceNow:2.0];
// [self.stopRecordTimer setFireDate:time];
// }
//} - (IBAction)startRecord {
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *path = [doc stringByAppendingPathComponent:@"test.caf"];
NSURL *url = [NSURL fileURLWithPath:path]; AVAudioRecorder *recorder = [[AVAudioRecorder alloc] initWithURL:url settings:nil error:nil];
// 缓冲
[recorder prepareToRecord];
// 开启分贝测量功能
recorder.meteringEnabled = YES;
// 开始录音
[recorder record];
self.recorder = recorder; // 开启定时器
[self addTimer];
} - (IBAction)stopRecord {
// [self.recorder stop];
}

IOS 多媒体 使用总结的更多相关文章

  1. IOS多媒体

    概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像 ...

  2. (转载)iOS 多媒体

    音频:(音效.音乐) 在iOS中音频播放从形式上可以分为音效播放和音乐播放.前者主要指的是一些短音频播放,通常作为点缀音频,对于这类音频不需要进行进度.循环等控制.后者指的是一些较长的音频,通常是主音 ...

  3. iOS多媒体框架介绍

    媒体层 媒体层包含图形技术.音频技术和视频技术,这些技术相互结合就可为移动设备带来最好的多媒体体验,更重要的是,它们让创建外观音效俱佳的应用程序变得更加容易.您可以使用iOS的高级框架更快速地创建高级 ...

  4. iOS多媒体总结&进入后台播放音乐

    1. 播放mp3需要导入框架,AVFoundation支持音频文件(.caf..aif..wav..wmv和.mp3)的播放. #import <AVFoundation/AVFoundatio ...

  5. iOS,多媒体,地图相关

    1.本地音频播放 2.本地视频播放 3.使用UIImagePickerController摄像头拍照,录像,照片库浏览 4.使用AVFunction,AVCaptureVideoDataOutput实 ...

  6. iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

    --iOS多媒体 概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制, ...

  7. 《转》iOS音频视频初级开发

    代码改变世界 Posts - 73, Articles - 0, Comments - 1539 Cnblogs Dashboard Logout HOME CONTACT GALLERY RSS   ...

  8. iOS应用开发详解

    <iOS应用开发详解> 基本信息 作者: 郭宏志    出版社:电子工业出版社 ISBN:9787121207075 上架时间:2013-6-28 出版日期:2013 年7月 开本:16开 ...

  9. IOS音频1:之采用四种方式播放音频文件(一)AudioToolbox AVFoundation OpenAL AUDIO QUEUE

    本文转载至 http://blog.csdn.net/u014011807/article/details/40187737 在本卷你可以学到什么? 采用四种方法设计应用于各种场合的音频播放器: 基于 ...

随机推荐

  1. hdu1286 找新朋友 欧拉函数模板

    首先这一题用的是欧拉函数!!函数!!不是什么欧拉公式!! 欧拉函数求的就是题目要求的数. 关于欧拉函数的模板网上百度一下到处都是,原理也容易找,这里要介绍一下另一个强势模板. 在这一题的讨论里看到的. ...

  2. Win10磁盘利用率高达100%设置修改方法

    Win10磁盘利用率高达100%设置修改方法 Windows Defender关闭 Win10的Windows Defender已经变身成为安全中心,它的运行机制改成了即便是电脑中存在多个杀毒.防护软 ...

  3. oracle 基础知识(十二)----索引

    一, 索引介绍 索引与表一样,也属于段(segment)的一种.里面存放了用户的数据,跟表一样需要占用磁盘空间.索引是一种允许直接访问数据表中某一数据行的树型结构,为了提高查询效率而引入,是一个独立于 ...

  4. Python 断言的使用方法

    自动化测试常用断言的使用方法(python) 自动化测试中寻找元素并进行操作,如果在元素好找的情况下,相信大家都可以较熟练地编写用例脚本了,但光进行操作可能还不够,有时候也需要对预期结果进行判断. 这 ...

  5. 重新分析connection reset by peer, socket write error错误原因

    上次写<connection reset by peer, socket write error问题排查>已经过去大半年,当时把问题"敷衍"过去了. 但是此后每隔一段时 ...

  6. jqGrid随窗口大小变化自适应宽度

    $(function(){ $(window).resize(function(){ $("#jqgridID").setGridWidth($(window).width()); ...

  7. Javascript 简单实现鼠标拖动DIV

    http://zhangbo-peipei-163-com.iteye.com/blog/1740078 比较精简的Javascript拖动效果函数代码 http://www.jb51.net/art ...

  8. WPF - MVVM 之TreeView

    在项目中使用OnPropertyChanged方法,最简单的实例: private event PropertyChangedEventHandler PropertyChanged; protect ...

  9. Django组件——cookie与session

    一.会话跟踪技术 1.什么是会话跟踪技术 可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应. 在JavaWeb中,客户向某一服务器发出第一个请求开始,会话就开始了,直 ...

  10. LOJ#2552. 「CTSC2018」假面(期望 背包)

    题意 题目链接 Sol 多年以后,我终于把这题的暴力打出来了qwq 好感动啊.. 刚开始的时候想的是: 设\(f[i][j]\)表示第\(i\)轮, 第\(j\)个人血量的期望值 转移的时候若要淦这个 ...