zoukankan      html  css  js  c++  java
  • 多媒体

    iOS进阶学习-多媒体

     

    一、音频

      1、iOS 里面共有四种专门实现播放音频的方式:

    • System Sound Services(系统声音服务)。
    • OpenAL(跨平台的开源的音频处理接口)。
    • Audio Queue Services(播放和录制音频服务)。
    • AVAudioPlayer(高级音频播放器)。
    • 在这里我们主要介绍一下System Sound Services和AVAudioPlayer。

      2、System Sound Services

    • System Sound Services 是最底层也是最简单的声音播放服务,通过调用 AudioServicesPlaySystemSound 这个函数就可以播放一些简单的音频文件。
    • 适用场景:适合播放一些很小的提示或者警告音,AudioToolbox.framework是一套基于C语言的框架,使用它来播放音效其本质是将短音频注册到系统声音服务(System Sound Service)。
    • 局限性:
    • 声音长度要小于30s
    • 格式:必须是PCM或IMA4
    • 不能控制播放的进度
    • 调用方法后立即播放声音
    • 没有循环播放和立体声音播放
    • 示例代码:(用storyboard创建一个按钮,关联点击事件)
    复制代码
    #import "ViewController.h"
    
    //引入头文件
    #import <AudioToolbox/AudioToolbox.h>
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    #pragma mark - 播放音乐
    - (IBAction)playAction:(id)sender {
        
        //得到的主要应用程序包
        CFBundleRef mainBundle;
        SystemSoundID soundFileObject;
        mainBundle = CFBundleGetMainBundle ();
        
        //声音文件的URL
        CFURLRef soundFileURLRef  = CFBundleCopyResourceURL (mainBundle,CFSTR ("蔡琴 - 爱断情伤"),CFSTR ("wav"),NULL);
        
        //注册声音到系统
        AudioServicesCreateSystemSoundID (soundFileURLRef,&soundFileObject);
        
        
        // AudioServicesAddSystemSoundCompletion 方法为音频播放添加 CallBack 函数,有了 CallBack 函数我们可以解决不少问题,比如可以克服 System Sound Services 本身不支持循环播放的问题。
        AudioServicesAddSystemSoundCompletion (soundFileObject, NULL , NULL ,&completionCallback,(__bridge void *) self );
        
        
        //播放注册的声音,(此句代码,可以在本类中的任意位置调用,不限于本方法中)
        AudioServicesPlaySystemSound(soundFileObject);
        
        //让手机震动
        //    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
    
    }
    
    static  void  completionCallback (SystemSoundID  ssID, void* clientData) {
        // Play again after sound play completion
        NSLog(@"播放完成-传入ID为-%u,传入的参数为%@", (unsigned int)ssID, clientData);
        
        AudioServicesPlaySystemSound(ssID);
    }
    
    void playFinished(SystemSoundID  ssID, void* clientData)
    {
    //    unsigned long ID = ssID; // ssID 不能直接作为参数打印出来,需要中转一次
    
        NSLog(@"播放完成-传入ID为-%u,传入的参数为%@", (unsigned int)ssID, clientData);
    
        AudioServicesPlaySystemSound(ssID);
    
        // 移除完成后执行的函数
    //    AudioServicesRemoveSystemSoundCompletion(ssID);
    
        // 根据ID释放自定义系统声音
    //    AudioServicesDisposeSystemSoundID(ssID);
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end
    复制代码

      3、AVAudioPlayer:是一个高级的播放器,它支持广泛的音频格式,如下:

    • AAC
    • AMR(AdaptiveMulti-Rate, aformatforspeech)
    • ALAC(AppleLossless)
    • iLBC(internetLowBitrateCodec, anotherformatforspeech)
    • IMA4(IMA/ADPCM)
    • linearPCM(uncompressed)
    • MP3(MPEG-1audiolayer3)

      4、AVAudioPlayer的优势:

    • 支持更多的格式
    • 可以播放任意长度的音频文件
    • 支持循环播放
    • 可以同步播放多个音频文件
    •  控制播放进度以及从音频的任意一点开始播放

      5、开发步骤:

    • AVAudioPlayer包含在 AVFoundation框架中,所以开发的时候首先导入音频的框架AVFoundation.framework。注意:引入头文件 #import <AVFoundation/AVFoundation.h>。
    • AVAudioPlayer的初始化的时候需要给一个播放文件:AVAudioPlayer  *avAudioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:文件路径 error:nil];
    • 重要属性:1.设置初始音量大小 audioPlayer.volume = 1;(0.0 ~ 1.0);2.设置音乐播放次数  audioPlayer.numberOfLoops = -1(只要是负数都是循环播放);3.   播放进度 audioPlayer.currentTime = 0;
    • 重要方法:1.预播放:[audioPlayer prepareToPlay];2.播放:[audioPlayer play];3.暂停:[audioPlayer pause];4.停止:[audioPlayer stop];
    • 协议(AVAudioPlayerDelegate):1.播放完成会调用的代理方法:- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag;播放解码失败:- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error。
    • 示例代码:github下载地址

    二、视频

      1、AVPlayer

      iOS 里面视频播放用到的是AVPlayer(包含在AVFoundation框架内)与AVAudioPlayer有点类似,但是AVPlayer的功能更加强大,它可以用来播放音频也可以用来播放视频。而且在播放音频方面 AVPlayer 可以直接播放网络音频。

      2、开发步骤

    • 1)导入支持视频播放的框架AVFoundation.framework,引入头文件#import <AVFoundation/AVFoundation.h>。
    • 2)获取播放的地址。
    • 3)根据播放的 URL 创建 AVPlayerItem 对象( AVPlayerItem 可以获取视频的信息,当前播放时间,总时间等)。
    • AVPlayerItem的重要属性:
    • 状态 status:
    • AVPlayerStatusUnknown,(代表视频播放出现了未知的问题)
    • AVPlayerStatusReadyToPlay,(代表视频可以播放,可以调用 play方法)
    • AVPlayerStatusFailed(代表视频无法进行播放了)
    • loadedTimeRange:代表已经缓存的进度,监听此属性可以在 UI 中更新缓存进度,也是很有用的一个属性。
    • 4)根据AVPlayerItem初始化 AVPlayer 对象。
    • 5)单纯只是使用 AVPlayer 类无法显示视频;这个类并没有真正的视图;需要将视频层添加到 AVPlayerLayer中;最后需要把AVPlayerLayer添加到需要播放页面的 Layer 层
    • 6)AVPlayerLayer 相关设置以及播放。
    • 7)在指定的时间播放。
    • 8)播放完成的通知。
    • 通过以上的六个步骤已经可以实现视频在 iOS 客户端的播放。
    • 代码示例:
    复制代码
    #import "ViewController.h"
    #import <AVFoundation/AVFoundation.h>
    #import <AVKit/AVKit.h>
    @interface ViewController ()
    /// 控制视频播放的控件
    @property (weak, nonatomic) IBOutlet UISlider *progressSlider;
    /// 声明播放视频的控件属性(也可以用于播放音频)
    @property (nonatomic, strong) AVPlayer *player;
    /// 播放的总时长
    @property (nonatomic, assign) CGFloat sumPlayOperation;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        // 设置播放的url
        NSString *playString = @"http://static.tripbe.com/videofiles/20121214/9533522808.f4v.mp4";
        NSURL *url = [NSURL URLWithString:playString];
        // 设置播放的项目
        AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:url];
        // 初始化player对象
        self.player = [[AVPlayer alloc] initWithPlayerItem:item];
        // 设置播放页面
        AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:self.player];
        // 设置播放页面的大小
        layer.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 300);
        // 设置背景颜色
        layer.backgroundColor = [UIColor cyanColor].CGColor;
        // 设置播放窗口和当前视图之间的比例显示内容
        layer.videoGravity = AVLayerVideoGravityResizeAspect;
        // 添加播放视图到self.view上
        [self.view.layer addSublayer:layer];
        // 设置播放进度的默认值
        self.progressSlider.value = 0;
        // 设置播放的默认音量值
        self.player.volume = 1.0f;
        
        
    }
    #pragma mark - 开始播放
    - (IBAction)startPlayer:(id)sender {
        [self.player play];
    }
    #pragma mark 停止播放
    - (IBAction)stopPlayer:(id)sender {
        [self.player pause];
    }
    #pragma mark 改变播放进度
    - (IBAction)changePlaye:(id)sender {
        self.sumPlayOperation = self.player.currentItem.duration.value / self.player.currentItem.duration.timescale;
        // 第一个参数是:当前时间
        // 第二个参数是:每秒钟有都少帧
        
        [self.player seekToTime:CMTimeMakeWithSeconds(self.progressSlider.value * self.sumPlayOperation, self.player.currentTime.timescale) completionHandler:^(BOOL finished) {
            [self.player play];
        }];
    }
    复制代码

      3、视频下载

    • 视频下载需要使用多线程
    • 思路:继承 NSOperation,实现下载任务类
    • 注意:开启runLoop 保证下载任务的结束
    • 使用 iOS8提供的NSURLSessionConfiguration可以实现后台下载
    • AFN 没有提供下载时候的多线程安全
    • 代码示例:github下载地址
  • 相关阅读:
    G-sensor驱动分析
    写i2c_client驱动的两种方式
    TP分析
    JAVA基础知识要点
    springboot-线程池简单使用
    java 实现好看的图形验证码
    正则表达式校验15/18位生份证-JAVA版
    springboot2.X集成HttpClient 发送HTTPS 请求
    linux-修改时区时间
    springboot2.X 在项目启动后执行一段自定义代码
  • 原文地址:https://www.cnblogs.com/mingjieLove00/p/5553046.html
Copyright © 2011-2022 走看看