• AudioToolbox.framework框架学习


    http://quding0308.iteye.com/blog/1596710

    AudioFile

    AudioFileStream类

    提供了一个接口,用来解析一个流音频文件。

    //创建一个new stream parse

                AudioFileStreamOpen(self, AudioFileStream_PropertyListenerProc inPropertyListenerProc, AudioFileStream_PacketsProc inPacketsProc, AudioFileTypeID inFileTypeHint, AudioFileStreamID *outAudioFileStream);

                //aquire some data

                AudioFileStreamParseBytes(<#AudioFileStreamID inAudioFileStream#>, <#UInt32 inDataByteSize#>, <#const void *inData#>, <#UInt32 inFlags#>);

                //设置从流文件中读取data时的offset

                AudioFileStreamSeek(<#AudioFileStreamID inAudioFileStream#>, <#SInt64 inPacketOffset#>, <#SInt64 *outDataByteOffset#>, <#UInt32 *ioFlags#>);

                //获取完数据后,关闭该流对象

                AudioFileClose(<#AudioFileID inAudioFile#>)

                

    AudioServices

    AudioQueue

    使用一个缓冲队列来存储data,用来播放或录音。播放或录音的时候,数据以流的形式操作,可以边获取数据变播放,或者边录音,边存储。

    Resources:https://developer.apple.com/library/ios/#documentation/MusicAudio/Reference/AudioQueueReference/Reference/reference.html

    -------------------------------------------------------------------------

    NSFileHandle 用来从文件、socket中读取数据

    CFReadStream 用来读取一个字节流byte stream,该字节流可以来自于内存、一个文件、一个socket。在读bytes之前,流stream需要被打开。

    CFWriteStream用来写一个字节流

    AudioQueueRef  定义的一个不透明的数据类型,专门用来代表一个audio queue

    AudioQueueBufferRef 是AudioQueueBuffer的别名,表明该参数为一个AudioQueueBuffer对象

    AudioFileID 定义一个不透明的数据类型,代表一个audiofile的对象

    反思:以ref结尾的对象名称,一般是在参数中使用,表明这个参数的数据类型

    //===============

    AudioStreamBasicDescription 

    音频数据流格式的描述.Callback Method 回调函数,系统规定好了回调函数的参数,以及调用的地方,你只需要保证参数的格式正确,向函数里添加代码即可,函数的方法名称可以随便写,没有强制的规定。

    AudioQueueNewOutput的第三个参数:inUserData 这是由用户来自定义的,数据的来源。只需要传递一个对象进去即可。使用,当系统自动调用回调函数MyAudioQueueOutputCallback或者MyAudioQueueInputCallback时候,返回的第一个参数inUserData就是你在AudioQueueNewOutput中设置的第三个参数。然后,你需要在回调函数中使用这个对象填充buffer(播放音频,当一个buffer为空时自动调用)或者读取buffer的数据(录音,当一个buffer满时自动调用)。

    AudioFileStream_PropertyListenerProc

    当在audio stream中找到一个property value后,回调该方法。

    AudioFileStream_PacketsProc当在stream中找到audio data后回调该方法。

    在参数中的in和out个代表的意思:in代表的是这个参数需要你在外面得到然后传递进去,在这个方法中要使用;out开头的参数表示这个参数是这个方法返回的值,你一般只需要定义一个引用,然后传递进去,执行完这个方法后,这个参数就实例化了。oh,my god!坑爹的苹果。

    AudioFile类

    一个c编程接口,使用AudioFile可以从内存或硬盘中读取或写入多种格式的音频数据。

    AudioFileStream类

    提供了一个借口,用来解析流音频文件。功能:从网络中读取数据流,把数据流解析成音频文件。

    音频文件流是不容易获取的。当需要从stream中读取data时,以前的data可能已无法使用,而新的data还没有到达,而从网络中获取的data可能还包含packets数据。为了解析audio stream,parser必须记着已经获取的数据,等待剩余的数据。

    缓冲区是在哪设置的?

    AudioQueue类

    一个c编程接口,是Core Audio的一部分。功能:录音、播放音频。

    AudioQueue类播放音频时,在内存中维护着一个buffer queue。只要buffer中有数据就可以播放,因此,一般使用AudioQueue对象来播放音频流,这样可以“边下载边播放”。

    播放音频的方法:

    AudioQueueNewOutput 

    1、用来创建一个播放音频队列的对象AudioQueueRef,然后就是对该audioqueue对象进行操作。

    2、用来添加一个回调方法AudioQueueOutputCallback,调用该方法时会返回一个audioqueue的buffer,该buffer中的数据已经被使用,需要在这个方法中填充新数据。

    3、

    AudioQueueEnqueueBuffer

    想缓冲区中添加新的数据(数据一般从file或网络中获取)

    //====下载=====

    CFReadStream

    CFReadStreamClientCallBack回调函数在CFReadStreamSetClient中调用,是第三个参数。CFReadStreamClientCallBack只有在满足CFReadStreamSetClient中添加的streamEvents发生时才会别回调。

    CFReadStreamScheduleWithRunLoop方法把stream加到一个线程中。然后,CFReadStreamSetClient在设置的东西就起作用了。当各种streamEvent发生时,client都会得到通知,client判断是否执行回调方法CFReadStreamClientCallBack。

    AudioSession类

    一个c接口,用来管理应用中audio的行为。

    线程的操作,暂停后可能是县城就停止了。

    对线程的操作  让某一个线程停下来。

    AudioQueue

    一个c编程接口,是Core Audio的一部分。功能:录音、播放音频。

    AudioQueue类播放音频时,在内存中维护着一个buffer queue。只要buffer中有数据就可以播放,因此,一般使用AudioQueue对象来播放音频流,这样可以“边下载边播放”。

    audioqueue中的方法都是静态方法,使用时传递进去的参数前缀是in,传递出来的参数前缀是out播放音频的方法:

    AudioQueueNewOutput 

    1、用来创建一个播放音频队列的对象AudioQueueRef,然后就是对该audioqueue对象进行操作。

    2、用来添加一个回调方法AudioQueueOutputCallback,调用该方法时会返回一个audioqueue的buffer,该buffer中的数据已经被使用,需要在这个方法中填充新数据。

    3、

    AudioQueueEnqueueBuffer

    想缓冲区中添加新的数据(数据一般从file或网络中获取)

    AudioQueueAllocateBuffer

    为一个audioqueue分配一个queueBuffer,每调用一次创建一个缓冲区,最后所有的缓冲区组成一个缓冲队列。

    AudioQueueCreateTimeline

    创建一个与audioqueue相关的时间轴。如果想要显示audio的时间,需要熟悉uyutimeLine相关的方法。

    audioqueue的属性操作:

    具体属性类型见官方文档:https://developer.apple.com/library/ios/#documentation/MusicAudio/Reference/AudioQueueReference/Reference/reference.html#//apple_ref/c/func/AudioQueueAddPropertyListener

    AudioQueueSetProperty

    用来设置某一个audioqueue对象的属性,具体属性以 kAudioQueueProperty_*开头

    AudioQueueGetProperty 

    获取audioqueue对象的某一个属性值。首先应该先调用AudioQueueGetPropertySize方法获取value的大小(byte形式)

    AudioQueueAddPropertyListener

    添加一个属性监听器。当一个audioqueue的对应属性值改变时,会回调这个监听器。

    audioqueue的参数操作:

    AudioQueueSetParameter

    AudioQueueGetParameter

    对参数的修改和获取,具体参数parameter包括:音量的调节、声道的调节、以及音量的渐变设置

  • 相关阅读:
    SCOI2014 方伯伯的OJ onlinejudge
    【JZOJ4854】【NOIP2016提高A组集训第6场11.3】小澳的坐标系
    【JZOJ4847】【NOIP2016提高A组集训第5场11.2】夕阳
    【JZOJ4846】【NOIP2016提高A组集训第5场11.2】行走
    【JZOJ4845】【NOIP2016提高A组集训第5场11.2】寻找
    【JZOJ4841】【NOIP2016提高A组集训第4场11.1】平衡的子集
    【JZOJ4840】【NOIP2016提高A组集训第4场11.1】小W砍大树
    【JZOJ4835】【GDOI2017模拟10.31】量化交易
    【JZOJ4831】【NOIP2016提高A组集训第3场10.31】方程式
    【JZOJ4832】【NOIP2016提高A组集训第3场10.31】高维宇宙
  • 原文地址:https://www.cnblogs.com/itlover2013/p/5098988.html
Copyright © 2020-2023  润新知