zoukankan      html  css  js  c++  java
  • AudioToolbox学习笔记(转)

    之前公司做的是音乐播放器,用到了AudioToolbox这个音频接口,总结下,希望对需要的朋友有帮助。AudioToolbox这个库是C的接口,偏向于底层,用于在线流媒体音乐的播放,可以调用该库的相关接口自己封装一个在线播放器类,AudioStreamer是老外封装的一个播放器类,有兴趣的朋友可以研究下。 
          其实IOS库中有两个可以播放在线音乐的播放器类,AVPlayer和MPMusicPlayerController 
    这两个做简单的播放还不错,但是如果要做专业的音乐播放项目,功能还不够强大,例如:边听边存、断点续传、播放事件等等都无法满足。一下是以前做的笔记,仅供参考 

    播放流程图: 
     

    数据类型

    1.AudioFileStreamID     文件流

    2.AudioQueueRef         播放队列 

    3.AudioStreamBasicDescription   格式化音频数据

    4.AudioQueueBufferRef             数据缓冲


    回调函数

    1.AudioFileStream_PacketsProc     解析音频数据回调

    2.AudioSessionInterruptionListener 音频会话被打断

    3.AudioQueueOutputCallback   一个AudioQueueBufferRef播放完


    主要函数

    0.AudioSessionInitialize (NULL, NULL, AudioSessionInterruptionListener, self);

    初始化音频会话


    1.AudioFileStreamOpen(

    (void*)self,                          

    &AudioFileStreamPropertyListenerProc, 

    &AudioFileStreamPacketsProc,          

    0,                                    

    &audio_file_stream);

    建立一个文件流AudioFileStreamID,传输解析的数据


    2.AudioFileStreamParseBytes(

     audio_file_stream,

     datalen,

     [data bytes],

     kAudioFileStreamProperty_FileFormat);

    解析音频数据


    3.AudioQueueNewOutput(&audio_format, AudioQueueOutputCallback, (void*)self, [[NSRunLoop currentRunLoop] getCFRunLoop], kCFRunLoopCommonModes, 0, &audio_queue);

    创建音频队列AudioQueueRef


    4.AudioQueueAllocateBuffer(queue, [data length], &buffer);

    创建音频缓冲数据AudioQueueBufferRef


    5.AudioQueueEnqueueBuffer(queue, buffer, num_packets, packet_descriptions);

    把缓冲数据排队加入到AudioQueueRef等待播放


    6.AudioQueueStart(audio_queue, nil); 播放

    7.AudioQueueStop(audio_queue, true);

     AudioQueuePause(audio_queue);       停止、暂停


    断点续传

    1。在http请求头中设置数据的请求范围,请求头中都是key-value成对

    key:Range           value:bytes=0-1000

        [request setValue:range  forHTTPHeaderField:@"Range"];

    可以实现,a.网络断开后再连接能继续从原来的断点下载

    b.可以实现播放进度可随便拉动

  • 相关阅读:
    每天读一遍,坚持30天,和老外交流没问题!
    网络数据原来是这么传输的(结合动画解析)
    技术创新驱动发展 思岚科技入选“科技独角兽百人团”
    获取当前数据库所有表的外键创建脚本、获取指定表的创建脚本,包括表和字段的属性、外键
    009深入理解CPU位数和操作系统位数,总线等等关系
    008_32位系统和64位系统有什么区别?
    007_计算机总线
    006_查看window实际支持的最大内存
    005_为何64位下一个指针大小为8个字节和32/64位系统的关系
    Kotlin 委托(2)变量委托是什么、自定义变量委托
  • 原文地址:https://www.cnblogs.com/pinping/p/2185541.html
Copyright © 2011-2022 走看看