音视频开发

command + s 截模拟器的屏幕

MP.4只是一个容器     H.264 H.263是真正的格式 H.265正在测试中

avi H.264 H.263

 

视频解码:将H.263  H.264转换为视频和音频的格式

视频编码:

 

 解码:硬解码:GPU做的解码     CPU做除了图片以外的,其他的处理    GPU(解码的效率特别快)显卡上带的 和图片有关

      软解码:CPU做的解码(前提是GPU不能做相应的解码时)

      硬解码比软解码强一点


一 、AVPlayer

  播放视频    可以播放流媒体   导入两个库  CoreMedia  AVFoundation

单独使用AVPlayer类是无法显示视频的,要将视频层添加值AVPlayerLayer中,这样才能将视频显示出来



NSURL * url = [NSURL fileURLWithPath:path];不是规范的path(NSString)时,使用该方法初始化NSURL


CMTimeGetSeconds(currentTime)转为秒


   //AVAudioPlayer->url

    //AVPlayer-?AVPlayerItem->AVURLAsset->NSURL

    NSString * path = [[NSBundle mainBundle]pathForResource:@"敢死队3" ofType:@"mp4"];

    NSURL * url = [NSURL fileURLWithPath:path];

    AVURLAsset *asset = [AVURLAsset assetWithURL:url];

    //1、异步 检测

    [asset loadValuesAsynchronouslyForKeys:@[@"tracks"] completionHandler:^{

        //AVPlayerItem

        AVPlayerItem * item = [AVPlayerItem playerItemWithAsset:asset];

        _player = [[AVPlayer alloc]initWithPlayerItem:item];

        //关联屏幕和播放器

        [_playerView setPlayer:_player];

        

        //刷新进度

        //这个方法就是加一个监听  每隔这么长时间会再者个线程里面调用这个方法   CMTimeMake(<#int64_t value#>, <#int32_t timescale#>)  /每秒

        __weak AVPlayer * player = _player;

        __weak UISlider * slider = _slider;

       [ _player addPeriodicTimeObserverForInterval:CMTimeMake(1, 1) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {

            //当前时间 警告的原因是相互强引用

           CMTime currentTime = player.currentItem.currentTime;

           //总时间

           CMTime duration = player.currentItem.duration;

           //CMTimeGetSeconds  转为秒

           float pro = CMTimeGetSeconds(currentTime)/CMTimeGetSeconds(duration);

           [slider setValue:pro animated:YES];

        }];

        }];

    

}

//设置进度

-(void)setProgress

{

    CMTime duration = _player.currentItem.duration;//总时间

    CMTime currentTime = CMTimeMultiplyByFloat64(duration, _slider.value);

    //从当前时间播放

    [_player seekToTime:currentTime];

}

-(void)play

{

    [_player play];

}

-(void)pause

{

    [_player pause];

}




二、MPMoviePlayerController  视频播放器 不能播放流媒体

需要导入MediaPlayer库

 MPMoviePlayerViewController * _playerController;//不能播放流媒体 流媒体可以想一想直播


- (IBAction)buttonClick:(UIButton *)sender {

    NSString * path = [[NSBundle mainBundle]pathForResource:@"敢死队3" ofType:@"mp4"];

    NSURL * url = [NSURL fileURLWithPath:path];

    _playerController = [[MPMoviePlayerViewController alloc]initWithContentURL:url];

    [self presentMoviePlayerViewControllerAnimated:_playerController];

    

}





三、AVAudioPlayer  音频播放器 引入AVFoundition

- (void)viewDidLoad {

    [super viewDidLoad];


    NSString* path = [[NSBundle mainBundle] pathForResource:@"Beat It" ofType:@"mp3"];

    NSURL* url = [NSURL fileURLWithPath:path];

    _player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];

    //准备播放

    [_player prepareToPlay];

    //变速

    [_player setEnableRate:YES];

    //峰值和平均值监测

    [_player setMeteringEnabled:YES];

}


//刷新

- (void)refresh{

    //进度 = 当前时间 / 总时间

    [_proSlider setValue:_player.currentTime/_player.duration animated:YES];

    

    //刷新峰值平均值

    [_player updateMeters];

    //平均值

    float avg = [_player averagePowerForChannel:0];

    //峰值

    float peak = [_player peakPowerForChannel:0];

    //NSLog(@"%f, %f", avg, peak);

    [_pv1 setProgress: (avg + 30) / 30 animated:YES];

    [_pv2 setProgress: (peak + 30) / 30 animated:YES];

}


//播放

- (void)play:(id)sender{

    [_player play];

    if (_timer == nil) {

        _timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(refresh) userInfo:nil repeats:YES];

    }

}


//暂停

- (void)pause:(id)sender{

    [_player pause];

    if (_timer) {

        [_timer invalidate];

        _timer = nil;

    }

}


//设置进度

- (IBAction)setProgress:(id)sender{

    //当前时间 = 总时间 * 百分比

    UISlider* slider = sender;

    _player.currentTime = _player.duration * slider.value;

}

//设置音量

- (IBAction)setVolume:(id)sender{

    UISlider* slider = sender;

    _player.volume = slider.value;

}

//设置声道

- (IBAction)setPan:(id)sender{

    UISlider* slider = sender;

    _player.pan = slider.value;

}

//设置速度

- (IBAction)setRate:(id)sender{

    UISlider* slider = sender;

    _player.rate = slider.value;

}



四、AVAUdioRecorder  录音  引入AVFoundition系统库

  //录音设置

    NSMutableDictionary * recordSetting = [[NSMutableDictionary alloc]init];

    //设置录音格式  AVFormatIDKey == kAudioFormatLinearPCM

    [recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];

    //设置录音采用率(Hz)如:AVSampleRateKey == 8000/44100/96000(影响音频质量)

    [recordSetting setValue:[NSNumber numberWithFloat:44100] forKey:AVSampleRateKey];

    //录音通道数 1 2

    [recordSetting setValue:[NSNumber numberWithInt:1] forKey:AVNumberOfChannelsKey];

    //线性采样位数 8.1624.32

    [recordSetting setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];

    //录音质量

    [recordSetting setValue:[NSNumber numberWithInt:AVAudioQualityHigh] forKey:AVEncoderAudioQualityKey];

    _recorder = [[AVAudioRecorder alloc]initWithURL:url settings:recordSetting error:nil];

    [_recorder prepareToRecord];


-(void)startRecord

{

    [_button setTitle:@"录音中" forState:UIControlStateNormal];

    [_recorder record];

}

-(void)stopRecord

{

    [_button setTitle:@"录音" forState:UIControlStateNormal];

    [_recorder stop];

    NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Document/a.aac"];

    NSURL * url = [NSURL fileURLWithPath:path];

    NSLog(@"录音路径%@",path);

    _player = [[AVAudioPlayer alloc]initWithContentsOfURL:url

                                                error:nil];

    [_player prepareToPlay];

    [_player play];

}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458609.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10.11 安装pod

原文地址&#xff1a;http://www.jianshu.com/p/5fc15906c53a 感谢。 更新升级10.11 cocoapods安装出问题最简单的解决方法 这是因为10.11把cocoapods直接干掉了 sudo gem install -n /usr/local/bin cocoapods 再加一句&#xff0c;完美解决 sudo xcode-select --switch /App…

windows任务管理器中的工作设置内存,内存专用工作集,提交大小详解

通俗的讲工作设置内存是程序占用的物理内存(包含与其他程序共享的一部分), 内存专用工作集是程序独占的物理内存, 提交大小是程序独占的内存(包含物理内存和在页面文件中的内存). 注:页面文件就是存放不在物理内存中的内存,文件路径一般在C:\pagefile.sys,目的是为了能够让更…

coreData mapView #include

一、coreData 需要导入系统库CoreData 新建文件的时候选core data 中的Data Model 然后加相应的表 加完表后 在Model.xcdatamodeld中新建文件 选coredata中的第三个 即可 如果两个表有联系 就将附表放到主表中 在build Setting中&#xff0c;输入search 在Framework Searc…

浅谈 C++ 中的 new/delete 和 new[]/delete[]

来自&#xff1a;http://www.cnblogs.com/hazir/p/new_and_delete.html 在 C 中&#xff0c;你也许经常使用 new 和 delete 来动态申请和释放内存&#xff0c;但你可曾想过以下问题呢&#xff1f; new 和 delete 是函数吗&#xff1f;new [] 和 delete [] 又是什么&#xff1f…

JavaScript中的原型继承原理

在JavaScript当中&#xff0c;对象A如果要继承对象B的属性和方法&#xff0c;那么只要将对象B放到对象A的原型链上即可。而某个对象的原型链&#xff0c;就是由该对象开始&#xff0c;通过__proto__属性连接起来的一串对象。__proto__属性是JavaScript对象中的内部属性&#xf…

XMPP

XMPP不支持视频聊天 支持文字聊天 但对于图片和语音聊天支持的不好 那么就将他们转成NSData的形式 IM Instance Message 即时聊天 聊天系统中 XMPP主要做两个人的聊天和群聊&#xff0c;只用了这两个功能 还有一个HTTP的服务器 &#xff0c;他是一个旁路服务器 XMPP底层…

QT 调试

QT调试&#xff08;参考下面的说明就可以正常调试&#xff09;&#xff1a;http://blog.csdn.net/wchengshen/article/details/50254731http://blog.csdn.net/sx341125/article/details/53606534 QT调用DLL&#xff1a; Qt中调用VS编译dll的方法(一)----显式调用 qt使用动态库(…

建模元件有哪些在MapleSim中

信号库&#xff1a;包含通用信号模块、布尔、控制器、离散信号模块、信号源、线性信号模块、非线性信号模块、时间离散信号模块、查询表、信号转换器、数学运算、关系元件、特殊信号模块&#xff0c;应用案例。 电子库&#xff1a;包含电阻、运算放大器、二极管、步进电机、模拟…

iOS小笔记

controller&#xff1a;连接二者的桥梁&#xff1b;cocoa frameworks 有两个框架&#xff1a;foundationfoundation 是cocoa中最基本的一些类&#xff1b;再mac应用程序中负责对象管理&#xff0c;内存管理&#xff0c;容器等相关数据&#xff1b;uikit&#xff1a;uikit&…

【C++】VS2010将写好的程序打包成安装文件发布

参考链接&#xff1a;http://blog.csdn.net/yongh701/article/details/51326142 我们可以将自己写好的VS2010程序打包成安装文件&#xff0c;给用户安装&#xff0c;具体步骤如下&#xff1a; 1、如下图&#xff0c;同样是新建一个项目&#xff0c;但是这次是新建一个其它项目…

01_jeecms建站

一、环境安装 JDK5TOMCAT5.5MYSQL5及以上http://www.jeecms.com/tutorial/index.jhtml参考环境安装篇二、解压文件安装包jeecms-v5zip,如图图1ROOT文件夹复制放到tomcat下的webapps文件夹&#xff08;注&#xff1a;请先删除webapps下原有的默认ROOT文件夹&#xff09;如不想部…

WiFi基本知识

转自&#xff1a;http://blog.csdn.net/myarrow/article/details/7930131 1. IE802.11简介 标准号IEEE 802.11bIEEE 802.11aIEEE 802.11gIEEE 802.11n标准发布时间1999年9月1999年9月2003年6月2009年9月工作频率范围2.4&#xff0d;2.4835GHz 5.150&#xff0d;5.350GHz5.475&a…

iOS各种小理论知识

Objective-C 部分 1. 你如何理解 OC 的内存管理 OC 内存管理是基于引用计数。谁想使用某个对象 B,就要把对象 B 的计数器1,如果不 使用这个对象了,那么就把对象 B 计数器-1,如果 B 对象计数器减到 0,那么 B 对象自动会调用自己的 dealloc 函数,也就是这个对象被销毁。 一…

libev 宏展开

想看源码&#xff0c;宏太多&#xff0c;看着累&#xff0c;宏展开&#xff0c;再看&#xff0c;功力时间不够&#xff0c;先放下 放上宏展开后的代码。 libev4.20 展开方示为 ./configure 修改makefile文件&#xff0c;字符串 替换CC为 CPP 注意要把基础的CC定义保留 make mv …

FreeRTOS高级篇7---FreeRTOS内存管理分析

原文&#xff1a;http://blog.csdn.net/zhzht19861011/article/details/51606068 内存管理对应用程序和操作系统来说都非常重要。现在很多的程序漏洞和运行崩溃都和内存分配使用错误有关。 FreeRTOS操作系统将内核与内存管理分开实现&#xff0c;操作系统内核仅规定了必要的内…

笔试题

1.是不是一个父类写了一个virtual 函数&#xff0c;如果子类覆盖它的函数不加virtual ,也能实现多态? virtual修饰符会被隐形继承的。private 也被集成&#xff0c;只事派生类没有访问权限而已。virtual可加可不加。子类的空间里有父类的所有变量(static除外)。同一个函数只存…

FreeRTOS学习笔记——互斥型信号量

来自&#xff1a;http://blog.csdn.net/xukai871105/article/details/43456985 0.前言 在嵌入式操作系统中互斥型信号量是任务间资源保护的重要手段。下面结合一个具体例子说明FreeRTOS中的互斥型信号量如何使用。 【相关博文】 【FreeRTOS STM32移植笔记】 【FreeRTOS学习笔记…

JSP动态网站环境搭建应用中的详细步骤(Tomcat和Apache/IIS的整合)

链接地址&#xff1a;http://www.cnblogs.com/dartagnan/archive/2011/03/25/2003426.html JSP动态网站环境搭建应用中的详细步骤(Tomcat和Apache/IIS的整合)sun推出的JSP&#xff08;Java Server Pages&#xff09;是一种执行于服务器端的动态网页开发技术&#xff0c;它基于J…

关于JS获取select值的两种实现方法

前几天发了一篇关于javascript获取select值的方法&#xff0c;后来发现有另一种实现方法&#xff0c;所以就都发出来比较一下&#xff1a; 方法一&#xff1a;通过获取option标签的value值来确定&#xff1a; <!DOCTYPE html> <html> <head><meta charset…

c语言题库1

1. 用预处理指令#define 声明一个常数&#xff0c;用以表明1年中有多少秒&#xff08;忽略闰年问题&#xff09; #define time (365*24*60*60) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365) 2. 写一个“标准”宏MIN&#xff0c;这个宏输入两个参数并返回较小的一个。 #di…