IOS之多媒体API

2024-06-13 03:18
文章标签 api ios 多媒体

本文主要是介绍IOS之多媒体API,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

12.1 播放视频

视频文件介绍

视频格式可以分为适合本地播放的本地影像视频和适合在网络中播放的网络流媒体影像视频两大类。尽管后者在播放的稳定性和播放画面质量上可能没有前者优秀,但网络流媒体影像视频的广泛传播性使之正被广泛应用于视频点播、网络演示、远程教育、网络视频广告等等互联网信息服务领域。

适合移动设备的视频文件

3GP,3GP是一种3G流媒体的视频编码格式,主要是为了配合3G网络的高传输速度而开发的,也是目前手机中最为常见的一种视频格式。 视频MP4格式,除了支持MP3所具有的音乐播放功能外,还具备强大的MPEG-4视频播放能力。

iPhone中还支持mov格式文件。

iOS播放视频 

iOS sdk为播放视频提供了非常简便方法,提供的MPMoviePlayerViewController类作为开发使用,在iOS4以前的版本是MPMoviePlayerController。

在iPhone开发规范中禁止使用私有API播放视频,因此播放画面的控制的控件都是有iPhone提供好的,我们没有别的选择。我们能做的:

  加载URL中视频

  播放、暂停视频

  用户控制行为和缩放模式

  产生通知

视频播放案例

wps_clip_image-11562

添加 MediaPlayer.framework 

MoviePlayerViewController.h

复制代码
#import <MediaPlayer/MediaPlayer.h>@interface MoviePlayerViewController : UIViewController {MPMoviePlayerViewController * moviePlayerView;
}@property (nonatomic, retain) MPMoviePlayerViewController * moviePlayerView;-(IBAction) playMovie: (id) sender;
- (void) playingDone;@end
复制代码

 

m文件的加载和卸载方法

复制代码
- (void) viewDidLoad {[[NSNotificationCenter defaultCenter] addObserver:self selector: @selector(playingDone) name:MPMoviePlayerPlaybackDidFinishNotification object:nil];
}
- (void)dealloc {[[NSNotificationCenter defaultCenter] removeObserver:self];[moviePlayerView release];[super dealloc];
}
复制代码

MPMoviePlayerViewController提供了在播放过程中的状态改变和其它事件的通知。在viewDidLoad注册了一个播放完成的通知,常用的通知有:

  MPMoviePlayerPlaybackDidFinishNotification通知接收者播放结束。

  MPMoviePlayerScalingModeDidChangeNotification改变影片的尺寸。

  MPMoviePlayerContentPreloadDidFinishNotification表示预处理以及完成,准备开始播放影片。

dealloc方法中的[[NSNotificationCenter defaultCenter]

removeObserver:self];影片播放完成要注销通知。

播放事件

复制代码
- (IBAction) playMovie: (id) sender {moviePlayerView = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"short" ofType:@"3gp"]]];moviePlayerView.moviePlayer.controlStyle = MPMovieControlStyleFullscreen;moviePlayerView.moviePlayer.scalingMode = MPMovieScalingModeAspectFit;// MPMovieControlStyleNone//MPMovieControlStyleEmbedded //MPMovieControlStyleDefault//[movieplayer play];//在当前view上添加视频的视图
    [[[UIApplication sharedApplication] keyWindow] addSubview:moviePlayerView.view];    }
复制代码

 

视频文件可以播放资源目录、沙箱目录和网络播放。本例中我们采用资源目录。

moviePlayerView.moviePlayer属性是MPMoviePlayerController类型,它有的controlStyle属性

可以控制播放行为,它的取值有:

MPMovieControlStyleFullscreen

MPMovieControlStyleNone没有播放控件

MPMovieControlStyleEmbedded 

MPMovieControlStyleDefault

MPMoviePlayerController类还有scalingMode属性用于控制影片的尺寸,它的取值有:

MPMovieScalingModeNone原始尺寸

MPMovieScalingModeAspectFit缩放到一个填充方向

MPMovieScalingModeAspectFill填充两边可能会切除一部分

MPMovieScalingModeFill填充两边可能会改变比例

播放完成

复制代码
- (void) playingDone {NSLog(@"播放完成");[moviePlayerView.view removeFromSuperview];[moviePlayerView release];moviePlayerView = nil;    
}
复制代码

 

playingDone 方法是在影片播放完成时候调用,这是因为我们在通知中心注册的方法。

播放完成需要把播放视图remove这样才可以获得上一个屏幕。

12.2 播放音频

12.2.1 音频文件介绍

有两类主要的音频文件格式: 

无损格式,例如WAV,PCM,TTA,FLAC,AU,APE,TAK,WavPack(WV) ,CAF

有损格式,例如MP3,Windows Media Audio(WMA),Ogg Vorbis(OGG),AAC 

移动音频文件

作为移动设备音频文件应该原则上比较小,一般的格式:

WAV、由于无损压缩效果最好。

MP3、有损压缩,文件比较小,由于去除的是人类无法感应到的声音,效果也很好。这是目前常用格式。

AAC、压缩比例更大,比MP3文件还要小。

CAF(Core Audio Format)是Apple专用的无损压缩格式。

12.2.2 Core Audio

wps_clip_image-7562

高级API,易用

System Sound API –播放短声音、警告音等。

AVFoundation 可以播放长时间声音,简单易用。

低级API,能够对音频有更多的控制

Audio Toolbox – 录制、播放、音频流有全面的控制。

OpenAL – 播放立体声,常用于游戏。

12.2.3 System Sound API

System Sound 可以播放“短的”声音,所谓短声音就是5秒以内。 不循环、没有声音控制、立即播放。

播放格式限制:

    线性PCM 和 IMA4

    .caf .aif 或 .wav

播放“短声音”

播放“短声音”主要就是两个步骤:

注册声音

    AudioServicesCreateSystemSoundID ((CFURLRef)fileURL, &myID);

播放声音

    AudioServicesPlaySystemSound (myID);

监听完成事件方法

    AudioServicesAddSystemSoundCompletion

清除播放sound ID

    SystemSoundID myID; 

    AudioServicesDisposeSystemSoundID (myID);  

震动

也可以通过System Sound API让iPhone震动,但是iPod touch不能震动。

震动可以通过指定一个特殊的system sound ID—— kSystemSoundID_Vibrate实现。

AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);

实例

wps_clip_image-14723

SystemSoundServices

添加AudioToolbox.framework框架

SystemSoundServicesViewController.h文件

复制代码
#import <UIKit/UIKit.h>
#include <AudioToolbox/AudioToolbox.h>@interface SystemSoundServicesViewController : UIViewController;- (IBAction) playSystemSound;
- (IBAction) vibrate;@end
复制代码

 

播放事件

复制代码
- (IBAction) playSystemSound{NSURL* system_sound_url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"BeepGMC500" ofType:@"wav"]];SystemSoundID system_sound_id;AudioServicesCreateSystemSoundID((CFURLRef)system_sound_url,&system_sound_id);// Register the sound completion callback.
    AudioServicesAddSystemSoundCompletion(system_sound_id,NULL, // uses the main run loopNULL, // uses kCFRunLoopDefaultModeMySoundFinishedPlayingCallback, // the name of our custom callback functionNULL // for user data, but we don't need to do that in this case, so we just pass NULL
    );// Play the System Sound
    AudioServicesPlaySystemSound(system_sound_id);
}
复制代码

AudioServicesAddSystemSoundCompletion方法5个参数,第一参数SystemSoundID,第二参数是是否使用循环,第三个参数是循环模式,第四个参数是回调函数,就是当播放完成时候回调的方法,第五个参数是为回调函数提供参数。

这里回调的方法是C语言风格的函数:MySoundFinishedPlayingCallback。

回调函数

复制代码
void MySoundFinishedPlayingCallback(SystemSoundID sound_id, void* user_data){AudioServicesDisposeSystemSoundID(sound_id);
}
复制代码

 

震动方法调用

复制代码
// Vibrate on action
- (IBAction) vibrate{AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
}
复制代码

 

12.3 播放和录制音频

AVFoundation控件可以实现一般音频播放和录制。

AVAudioPlayer音频播放类,用于播放大于5秒钟声音,可以播放本地声音,但是不能播放网络媒体文件。能够播放、 暂停、循环和跳过等操作。

AVAudioRecorder音频录制类。

实例AVAudioPlayer

wps_clip_image-30534

添加AVFoundation.framework框架

AvplayerViewController.h文件

复制代码
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>@interface AvplayerViewController : UIViewController <AVAudioPlayerDelegate> {AVAudioPlayer * player;}- (IBAction) stopSong: (id) sender;
- (IBAction) playSong: (id) sender;@end
复制代码

 

AvplayerViewController.m

复制代码
#import "AvplayerViewController.h"@implementation AvplayerViewController- (IBAction) playSong: (id) sender {NSError *error = nil;player = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"charleston1925_64kb" ofType:@"mp3"]] error:&error];player.delegate = self;if(error) {NSLog(@"%@",[error description]); [error release];}[player play];
}- (IBAction) stopSong: (id) sender {[player stop];
}- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {NSLog(@"播放完成。");    
}- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error {NSLog(@"播放错误发生: %@", [error localizedDescription]);    
}- (void)dealloc {[player release];[super dealloc];
}@end
复制代码

 

AVAudioPlayer委托

AVAudioPlayerDelegate委托对象提供了两个主要方法:

audioPlayerDidFinishPlaying:successfully:

audioPlayerDecodeErrorDidOccur:error:

AVAudioRecorder

新建实例:Recorder

wps_clip_image-7998

RecorderViewController.h文件

复制代码
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>@interface RecorderViewController : UIViewController
{AVAudioRecorder *recorder;AVAudioPlayer *player;UILabel *label;
}
@property (retain, nonatomic) AVAudioRecorder * recorder;
@property (retain, nonatomic) AVAudioPlayer * player;
@property (retain, nonatomic) IBOutlet UILabel *label;
-(IBAction)recordPushed:(id)sender;
-(IBAction)playPushed:(id)sender;
-(IBAction)stopPushed:(id)sender;
@end
复制代码

 

音频录制方法

复制代码
-(IBAction)recordPushed:(id)sender 
{label.text = @"recode...";if([recorder isRecording])return;if([player isPlaying])[player stop];NSError *error = nil;[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecorderror:&error];[[AVAudioSession sharedInstance] setActive:YES error:&error];
复制代码

 

AVAudioSession 是iOS提供音频会话类,音频会话是指定应用程序与音频系统如何交互。AVAudioSession 通过指定一个音频类别(Category)实现的,音频类别(Category)描述了应用程序使用音频的方式。下面是语句是设定音频会话类别:

[[AVAudioSession sharedInstance]setCategory:AVAudioSessionCategoryRecord error:&error];

AVAudioSessionCategoryRecord代表只能输入音频,即录制音频了。其效果是停止其它音频播放。

使用类别后,音频会话要设置为“活跃的”Active,这会把后台的任何系统声音关闭。

[[AVAudioSession sharedInstance]  setActive:YES error:&error];   

音频录制方法

复制代码
    NSMutableDictionary *settings = [NSMutableDictionary dictionary];[settings setValue:[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey];[settings setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; //采样率[settings setValue:[NSNumber numberWithInt:1] forKey:AVNumberOfChannelsKey];//通道的数目[settings setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];//采样位数  默认 16
    [settings setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];//大端还是小端 是内存的组织方式
    [settings setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];//采样信号是整数还是浮点数
    NSString *filePath = [NSString stringWithFormat:@"%@/rec_audio.caf", [self documentsDirectory]];NSURL *fileUrl = [NSURL fileURLWithPath:filePath];//[self setRecorder:nil];recorder = [[AVAudioRecorder alloc] initWithURL:fileUrl settings:settings error:&error];// [recorder setMeteringEnabled:YES];
    [recorder record];
}
复制代码

 

复制代码
-(NSString *)documentsDirectory{NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); return [paths objectAtIndex:0];
}
复制代码

 

音频播放方法

复制代码
-(IBAction)playPushed:(id)sender{label.text = @"play...";if([recorder isRecording])[recorder stop];if([player isPlaying])[player stop];NSString *filePath = [NSString stringWithFormat:@"%@/rec_audio.caf", [self documentsDirectory]];NSURL *fileUrl = [NSURL fileURLWithPath:filePath];NSError *error = nil;// [self setPlayer:nil];
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlaybackerror:&error];[[AVAudioSession sharedInstance] setActive:YES error:&error];player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileUrl error:&error];// [player setMeteringEnabled:YES];
    [player play];
}
复制代码

 

音频停止方法

复制代码
-(IBAction)stopPushed:(id)sender{label.text = @"stop...";if([recorder isRecording])[recorder stop];if([player isPlaying])[player stop];
}
复制代码

 

 

注: 
1 本教程是基于关东升老师的教程 
2 基于黑苹果10.6.8和xcode4.2 
3 本人初学,有什么不对的望指教 
4 教程会随着本人学习,持续更新 
5 教程是本人从word笔记中拷贝出来了,所以格式请见谅

作者: syxChina
出处: http://syxchina.cnblogs.com、  http://hi.baidu.com/syxcs123 
本文版权归作者、博客园和百度空间共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则作者会诅咒你的。
如果您阅读了我的文章并觉得有价值请点击此处,谢谢您的肯定1。

这篇关于IOS之多媒体API的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1056131

相关文章

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

一分钟带你上手Python调用DeepSeek的API

《一分钟带你上手Python调用DeepSeek的API》最近DeepSeek非常火,作为一枚对前言技术非常关注的程序员来说,自然都想对接DeepSeek的API来体验一把,下面小编就来为大家介绍一下... 目录前言免费体验API-Key申请首次调用API基本概念最小单元推理模型智能体自定义界面总结前言最

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

5分钟获取deepseek api并搭建简易问答应用

《5分钟获取deepseekapi并搭建简易问答应用》本文主要介绍了5分钟获取deepseekapi并搭建简易问答应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1、获取api2、获取base_url和chat_model3、配置模型参数方法一:终端中临时将加

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.