音视频处理

之前介绍的系统声音服务(System Sound Services)提供了一个接口,用于播放不超过30秒的声音。要进一步使用iOS的音频功能,有两个框架:Media Player和AV Foundation。

Media Player框架

Media
Player框架用于播放本地和远程资源中的视频和音频。在应用程序中,可使用它来打开模态iPod界面、选择歌曲以及控制播放。这个框架让您能够与设备提供的所有内置多媒体功能集成。

框架有5个常用类:

MPMoviePlayerController — 电影播放器控制器。

MPMusicPlayerController — 音乐播放器控制器。

MPMediaPickerController —
向用户提供用于选择要播放的多媒体的界面。您可以筛选媒体选择器显示的文件,也可以让用户从多媒体库中选择文件。

MPMediaItem — 单个多媒体项,如一首歌曲。

MPMediaItemCollection —
多媒体项集合。MPMediaPickerController实例提供一个MPMediaItemCollection实例,可在下一个类(音乐播放器控制器)中直接使用它。

要使用任何多媒体播放器功能,都必须导入框架Media Player:


#import <MediaPlayer/MediaPlayer.h>

电影播放器(MPMoviePlayerController)示例:


#import "ViewController.h"
#import <MediaPlayer/MediaPlayer.h>

@interface ViewController ()
- (IBAction)btnPlayerClickHandler:(id)sender;
@property (strong, nonatomic) MPMoviePlayerController *moviePlayer;
@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];

NSString *strFile = [[NSBundle mainBundle] pathForResource:@"movie1" ofType:@"mp4"];

self.moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:strFile]];
self.moviePlayer.allowsAirPlay = YES;
[self.moviePlayer.view setFrame:CGRectMake(50.0, 50.0, 240.0, 200.0)];
[self.view addSubview:self.moviePlayer.view];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playMovieFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:self.moviePlayer];
}

- (IBAction)btnPlayerClickHandler:(id)sender
{
[self.moviePlayer play];
}

- (void)playMovieFinished:(NSNotification *)theNotification
{
MPMoviePlayerController *player = [theNotification object];
[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:player];
[player.view removeFromSuperview];
}

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

有两个细节需要注意:

1. MPMoviePlayerController实例要添加成属性(@property)。

2. 将视频文件添加到项目时,要勾选“add to targets”。

电影播放器播放完文件时,可能需要做些清理工作,包括将电影播放器从视图中删除。为此,可使用NSNotificationCenter类注册一个”观察者”,该观察者将监视来自对象moviePlayer的特定通知,并在收到这种通知时调用指定的方法。

音乐播放器(MPMusicPlayerController)示例:


#import "ViewController.h"

@interface ViewController ()
@property (strong, nonatomic) IBOutlet UILabel *lblPlayingSong;
@property (strong, nonatomic) IBOutlet UILabel *lblSongList;
- (IBAction)btnPlayClickHandler:(id)sender;
- (IBAction)btnPickerClickHandler:(id)sender;

@property (nonatomic, strong) MPMusicPlayerController *musicPlayer;
@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];

self.musicPlayer = [MPMusicPlayerController iPodMusicPlayer];
}

- (IBAction)btnPlayClickHandler:(id)sender
{
if(self.musicPlayer.playbackState==MPMusicPlaybackStatePaused||self.musicPlayer.playbackState==MPMusicPlaybackStateStopped)
{
[self.musicPlayer play];
}
else if(self.musicPlayer.playbackState==MPMusicPlaybackStatePlaying)
{
[self.musicPlayer pause];
}
// [self.musicPlayer stop];
// [self.musicPlayer skipToBeginning];
// [self.musicPlayer skipToPreviousItem];
// [self.musicPlayer skipToNextItem];

//列出当前播放歌曲
self.lblPlayingSong.text = [self.musicPlayer.nowPlayingItem valueForProperty:MPMediaItemPropertyTitle];

// MPMediaItemPropertyArtist -- 艺术家
// MPMediaItemPropertyGenre -- 流派
// MPMediaItemPropertyLyrics -- 歌词
}

- (IBAction)btnPickerClickHandler:(id)sender
{
MPMediaPickerController *mediaPicker = [[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeMusic];
// MPMediaTypePodcast;
// MPMediaTypeAnyAudio;

mediaPicker.prompt = @"Choose Songs";
mediaPicker.allowsPickingMultipleItems = YES;
mediaPicker.delegate = self;

[self presentViewController:mediaPicker animated:YES completion:nil];
}

- (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
{
[self.musicPlayer setQueueWithItemCollection:mediaItemCollection];

//列出选择歌曲清单
NSMutableString *strTitle = [[NSMutableString alloc] initWithString:@""];
for(MPMediaItem *item in [mediaItemCollection items])
{

[strTitle appendString:[item valueForProperty:MPMediaItemPropertyTitle]];
[strTitle appendString:@"\n"];
}
self.lblSongList.text = strTitle;

[self dismissViewControllerAnimated:YES completion:nil];
}

- (void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker
{
[self dismissViewControllerAnimated:YES completion:nil];
}

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

@end

AV Foundation框架

虽然Media Player框架可满足所有普通多媒体播放需求,但Apple推荐使用AV
Foundation框架来实现大部分系统声音服务不支持的、超过30秒的音频播放功能。另外,AV Foundation框架还提供了录音功能。

要在应用程序中添加音频播放和录音功能,只需要两个新类:

AVAudioRecorder — 以各种不同的格式将声音录制到内存或设备本地文件中。

AVAudioPlayer — 播放任意长度的音频。

要使用AV Foundation框架,必须将其加入到项目中,再导入两个接口文件:


#import <AVFoundation/AVFoundation.h>
#import <CoreAudio/CoreAudioTypes.h>

CoreAudioTypes.h定义了多种音频类型,便于在代码中通过名称引用。

播放声音文件示例:


#import <AVFoundation/AVFoundation.h>
#import <CoreAudio/CoreAudioTypes.h>

@interface ViewController : UIViewController <AVAudioPlayerDelegate>

@end


#import "ViewController.h"

@interface ViewController ()
@property (nonatomic,strong) AVAudioPlayer *audioPlayer;
@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];

NSString *strSoundFile = [[NSBundle mainBundle] pathForResource:@"mymusic" ofType:@"mp3"];

self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:strSoundFile] error:nil];
self.audioPlayer.delegate = self;
[self.audioPlayer play];
}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
NSLog(@"播放结束");
}

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

在应用程序中录制音频需要指定用于存储录音的文件(NSURL),配置要创建的声音文件参数(NSDictionary),再使用上述文件和设置分配并初始化一个AVAudioRecorder实例。

如果不想将录音文件持久性保存,可以录音存在到tmp目录,这样当app退出时,该录音可能被自动删除;否则,应存储到Documents目录。下面的代码创建了一个NSURL,它指向temp目录中的文件sound0605.caf:


NSURL *soundFileURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingString:@"sound0605.caf"]];

然后创建一个NSDictionary,它包含录制的音频的设置:


NSDictionary *soundSetting = @{AVSampleRateKey:@44100.0F,
AVFormatIDKey:@(kAudioFormatMPEG4AAC),
AVNumberOfChannelsKey:@2,
AVEncoderAudioQualityKey:@(AVAudioQualityHigh)
};

AVSampleRateKey — 录音机每秒采集的音频样本数。

AVFormatIDKey — 录音的格式。

AVNumberOfChannelsKey — 录音的声道数。例如,立体声为双声道。

AVEncoderAudioQualityKey — 编码器的质量设置。

要了解更多的设置,可以参考Xcode开发文档中的AVAudioRecorder Class
Reference(滚动到Constants部分)。

指定声音文件和设置后,就可创建AV录音机实例并开始录音了:


AVAudioRecorder *soundRecorder = [[AVAudioRecorder alloc] initWithURL:soundFileURL settings:soundSetting error:nil];

[soundRecorder record];

录制声音文件并播放示例:


#import "ViewController.h"

@interface ViewController ()

@property (strong, nonatomic) IBOutlet UIButton *btnRecord;
@property (nonatomic,strong) AVAudioRecorder *soundRecorder;
@property (nonatomic,strong) AVAudioPlayer *audioPlayer;

- (IBAction)btnRecordClickHandler:(id)sender;
- (IBAction)btnPlayRecordHandler:(id)sender;

@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];
//Setup the audio recorder
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord error: nil];

NSURL *soundFileURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingString:@"sound0605.caf"]];

NSDictionary *soundSetting = @{AVSampleRateKey:@44100.0F,
AVFormatIDKey:@(kAudioFormatMPEG4AAC),
AVNumberOfChannelsKey:@2,
AVEncoderAudioQualityKey:@(AVAudioQualityHigh)
};

NSError* error = NULL;
self.soundRecorder = [[AVAudioRecorder alloc] initWithURL:soundFileURL settings:soundSetting error:&error];
NSLog(@"Error: %@", error);
}

- (IBAction)btnRecordClickHandler:(id)sender
{
if([self.btnRecord.titleLabel.text isEqualToString:@"录制"])
{
[self.soundRecorder record];
[self.btnRecord setTitle:@"暂停" forState:UIControlStateNormal];
}
else
{
[self.soundRecorder stop];
[self.btnRecord setTitle:@"录制" forState:UIControlStateNormal];
}
}

- (IBAction)btnPlayRecordHandler:(id)sender
{
NSURL *recordFile = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingString:@"sound0605.caf"]];

self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:recordFile error:nil];

[self.audioPlayer play];
}

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

@end

P.s. 上面的代码每次点击播放时,都会分配并初始化一个新的AVAudioPlayer实例,其实不用担心带来的内存问题,因为每次新建音频播放器时,指向旧播放器的引用都将被删除,即ARC自动释放占用的内存。然后,如果您担心这一点,可实现AVAudioPlayer委托方法audioPlayerDidFinishPlaying:successfully,在其中将对象audioPlayer设置为nil。

播放包含在应用程序束中的音频时,应使用AVAudioPlayer;而播放音乐库中的文件时,应使Media
Player框架的MPMusicPlayerController。虽然MPMusicPlayerController也能够播放本地文件,但其主要用途是集成现有的音乐库多媒体。

音视频处理,布布扣,bubuko.com

时间: 2024-12-24 18:21:56

音视频处理的相关文章

网络摄像机IPCamera RTSP直播播放网络/权限/音视频数据/花屏问题检测与分析助手EasyRTSPClient

前言 最近在项目中遇到一个奇怪的问题,同样的SDK调用,访问海康摄像机的RTSP流,发保活OPTIONS命令保活,一个正常,而另一个一发就会被IPC断开,先看现场截图: 图1:发OPTIONS,摄像机立马断流 图2:但在另一个程序中发OPTIONS保活包又不断流 在大部分的摄像机上,都没什么问题,单单在海康的这一款摄像机中出现了这种问题,不仔细对比命令行中的输出,根本无法确定问题点,图2中的OPTIONS报文中携带了Authorization的头字段,将认证信息都带入了进来,而图1中只是简单将用

Android IOS WebRTC 音视频开发总结(七六)-- 探讨直播低延迟低流量的粉丝连麦技术

本文主要探讨基于WebRTC的P2P直播粉丝连麦技术 (作者:郝飞,亲加云CTO,编辑:dora),最早发表在[这里] 支持原创,转载必须注明出处,欢迎关注微信公众号blacker(微信ID:blackerteam  或 webrtcorgcn) 到目前为止,直播行业继续如预期的那样如火如荼的发展着,在先后竞争完延迟,高清,美 颜,秒开等功能后,最近各大直播平台比拼的一个热点就是连麦.什么是连麦? 简单??述 就是当主播直播期间,可以与其中某一个粉丝进行互动,并且其他粉丝能够观看到这个互动 过程

音视频SDK解决方案对比

目前音视频开发市场琳琅满目,市场占有率最大的当属于RTX,视高等大公司.但是随着科技的日新月异,一些新型的公司逐渐崭露头角,市场上用户群体的多样化,,也将使用户的选择变得多样性,同时带来的是音视频厂商之间进一步的激烈竞争. 音视频的开发区域涵盖了多个领域,如可以开发具有企业特色的即时通讯系统.视频游戏系统.视频会议系统.网络教学系统.语音视频聊天系统.专家咨询平台以及政府应急指挥平台等.进入2010年以来,音视频开发商面对着更加严格的要求,而往往的像AnyChat.华途及视高等一系列有科技实力的

转 音视频封装格式、编码格式知识

常见的AVI.RMVB.MKV.ASF.WMV.MP4.3GP.FLV等文件其实只能算是一种封装标准. 一个完整的视频文件是由音频和视频2部分组成的.H264.Xvid等就是视频编码格式,MP3.AAC等就是音频编码格式. 例如:将一个Xvid视频编码文件和一个MP3音频编码文件按AVI封装标准封装以后,就得到一个AVI后缀的视频文件,这个就是我们常见的AVI视频文件了. 由于很多种视频编码文件.音频编码文件都符合AVI封装要求,则意味着即使是AVI后缀,也可能里面的具体编码格式不同.因此出现在

html音视频标签

音视频标签是html5标签,分别为<audio></audio>和<video></video>,这两个标签用法大致相同,且都仅在IE9及以上版本和其他浏览器中使用,在ie8及以下版本不支持. 用法示例: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <video widt

android音视频点/直播模块开发

前言 随着音视频领域的火热,在很多领域(教育,游戏,娱乐,体育,跑步,餐饮,音乐等)尝试做音视频直播/点播功能,那么作为开发一个小白,如何快速学习音视频基础知识,了解音视频编解码的传输协议,编解码方式,以及如何技术选型,如何解决遇到的坑,本文抛砖引玉,欢迎大咖交流. 一. 音视频的基础知识 1.1 基本概念 视频是什么 静止的画面叫图像(picture).连续的图像变化每秒超过24帧(frame)画面以上时,根椐视觉暂留原理, 人眼无法辨别每付单独的静态画面,看上去是平滑连续的视觉效果.这样的连

各种音视频编解码学习详解

各种音视频编解码学习详解 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等.最近因为项目的关系,需要理清媒体的codec,比较搞的是,在豆丁网上看运营商的规范 标准,同一运营商同样的业务在不同文档中不同的要求,而且有些要求就我看来应当是历史的延续,也就是现在已经很少采用了.所以豆丁上看不出所以然,从 wiki上查.中文的wiki信息量有限,很短,而wiki的英文内容内多,删减版

Android IOS WebRTC 音视频开发总结(七三)-- 我为什么走上了创业这条不归路?

本文主要介绍自己为什么选择创业,文章最早发表在我们的微信公众号上,支持原创,详见这里, 欢迎关注微信公众号blackerteam,更多详见www.rtc.help 2016.06.01对公司来说是个很重要的日子,我们正式搬到了科技园(科苑北兰光科技园),意味着要正规运作了,意味着真正的创业开始了,意味着有机会迎来爆发了(这算画饼吗?呵呵呵!). 坐在办公桌前一边规划着未来,一边回忆着过去的点点滴滴,发现现在正在做的并不是当初所规划好的,但又都是水到渠成的,所以在感叹缘份的同时,又增添了对未来的信

Windows Media Foundation 音视频采集 小记

写在前面 我是个讲文明的人…… 不过有的时候实在忍不住了也要吐槽几句: 1. 我真是跟不上时代,到现在了还在研究 Windows 应用开发…… 咳: 2. DirectShow 是傻X!我只是想要获取 Camera 裸数据,尼玛却要让我学习神马各种 .ax, filter, graph... 相关资料少.又晦涩: 3. 在此祝愿 Windows XP 及其之前的版本早点退出历史舞台,这样 DirectShow 就不是必须的了! 音视频采集 Windows 7 以后, Media Foundati

采用ffmpeg和ffserver实现音视频直播和点播

一.嵌入式开发板采集音视频(远程) 音频采集程序:./audioc -i 222.222.222.222 -p 8888; 视频采集程序:./videoc -i 222.222.222.222 -p 9999; 音频采集程序利用alsa库,采集原始音频帧,发送至服务器进程(222.222.222.222,  8888); 视频采集程序利用v4l2库,采集原始视频帧,h.264硬编码后,发送至服务器进程(222.222.222.222, 9999); 二.Linux服务器接收音视频 音频接收程序: