AuidioStreamPlayer简易实现

基于MATLAB的太阳能光伏电力仿真,模拟每日太阳能发电,可视化功率曲线,并通过数值积分计算总能量输出。.zip 1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 立即下载
首先可以先从下面列出的参考中进行对整个Audio Stream进行一定程度的理解

参考:

https://github.com/muhku/FreeStreamer
https://github.com/mattgallagher/AudioStreamer
http://msching.github.io/blog/2014/07/09/audio-in-ios-3/
http://msching.github.io/blog/2014/08/02/audio-in-ios-5/

主要数据结构:
typedef struct AudioStream{
    AudioFileStreamID                       mAudioFileStream;
    AudioQueueRef                           mQueue;
    AudioQueueBufferRef                     mBuffer[kNumbersOfBuffer];
    AudioStreamPacketDescription            mPacketDecs[kMaxPacketDescs];
    AudioStreamBasicDescription             mAudioStreamBasicDesc;
    unsigned int                            mFillBufferIndex;
    UInt32                                  mPacketBufferSize;
    size_t                                  mBytesFilled;
    size_t                                  mPacketsFilled;
    bool                                    mInused[kNumbersOfBuffer];
    NSInteger                               mBuffersUsed;

}AS;

typedef struct StreamFile{
    UInt32                                  mBitRate;
    NSInteger                               mFileLength;
    NSInteger                               mDataOffset;
    UInt64                                  mAudioDataByteCount;

}SF;
extern NSString * const ASStatusChangedNotification;
@interface FileStreamPlayer : NSObject{
    AS                                      audioStream;
    BOOL                                    discontinuous;
    NSThread                                *internalThread;
    NSURL                                   *url;
    NSDictionary                            *httpHeader;
    NSString                                *fileExtension;
    SF                                      streamFile;
    double                                  sampleRate;
    double                                  packetDuration;
    CFReadStreamRef                         stream;
    pthread_mutex_t                         queueBuffersMutex;
    pthread_cond_t                          queueBufferReadyCondition;
    AudioStreamState                        state;
    AudioStreamStopReason                   stopReason;
    NSNotificationCenter                    *notificationCenter;
}
首先,要实现AudioStream的获取,通过CFNetWorking的库来发送HTTP请求,并通过建立客户端接受数据将数据加入到当前RunLoop中:
CFHTTPMessageRef message= CFHTTPMessageCreateRequest(NULL,
                                                             (CFStringRef)@"GET",
                                                             (CFURLRef)url,
                                                             kCFHTTPVersion1_1);
        stream = CFReadStreamCreateForHTTPRequest(NULL, message);
        CFRelease(message);

        CFDictionaryRef proxySettings = CFNetworkCopySystemProxySettings();
        CFReadStreamSetProperty(stream, kCFStreamPropertyHTTPProxy, proxySettings);
        CFRelease(proxySettings);
        CFStreamClientContext context = {0, self, NULL, NULL, NULL};
        CFReadStreamSetClient(
                              stream,
                              kCFStreamEventHasBytesAvailable |
                              kCFStreamEventErrorOccurred |
                              kCFStreamEventEndEncountered,
                              ASReadStreamCallBack,
                              &context);
        CFReadStreamScheduleWithRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);
这里会要求实现网络流数据获取后的回调函数:ReadStreamCallBack
static void ASReadStreamCallBack(CFReadStreamRef                aStream,
                                 CFStreamEventType              eventType,
                                 void*                          inClientInfo) {

    FileStreamPlayer* this = (FileStreamPlayer *)inClientInfo;

    [this handleReadFromStream:aStream eventType:eventType];
}

函数参数中要求:当前数据流,流事件类型,以及上下文对象

成功读取数据以后,通过:AudioFileStreamOpen将数据打开,可以理解成AudioFile读取时候打开一个数据流,然后进行解析


    AudioFileStreamOpen
    AudioFileStreamParseBytes
OpenStream中要求填入两个回调函数:PropertyListenerProc和ASPacketsProc,分别作为流信息和流解析分离帧的回调之后的分离帧解析中,每次都会回调刚刚填入的回调函数
static void ASPropertyListenerProc(//callback from audioStream header
                                   void *                           inClientData,
                                   AudioFileStreamID                inAudioFileStream,
                                   AudioFileStreamPropertyID        inPropertyID,
                                   UInt32 *                         ioFlags) {

    FileStreamPlayer* this = (FileStreamPlayer *)inClientData;

    [this handleFileStreamPropertyChange:inAudioFileStream
                        fileStreamPropertyID:inPropertyID
                                     ioFlags:ioFlags];
}


static void ASPacketsProc(//callback from audioStream body
                          void *                            inClientData,
                          UInt32                            inNumberBytes,
                          UInt32                            inNumberPackets,
                          const void *                      inInputData,
                          AudioStreamPacketDescription      *inPacketDescriptions) {

    FileStreamPlayer* this = (FileStreamPlayer *)inClientData;

    [this handleAudioPackets:inInputData
                 numberBytes:inNumberBytes
               numberPackets:inNumberPackets
          packetDescriptions:inPacketDescriptions];
}
接下来的操作就是包括流信息解析后存入相应的数据结构中,利用Buffer存储塞到AudioQueue中去进行运行,设置相应的AudioQueue的回调函数对完成任务后的buffer进行再次调用:

AudioQueueNewOutput(&audioStream.mAudioStreamBasicDesc,
                        ASAudioQueueOutputCallback,
                        self, NULL, NULL, 0, &audioStream.mQueue);
static void ASAudioQueueOutputCallback(//callBack from Running Queue Buffers completed
                                       void*                    inClientData,
                                       AudioQueueRef            inAQ,
                                       AudioQueueBufferRef      inBuffer) {

    FileStreamPlayer* this = (FileStreamPlayer*)inClientData;

    [this handleCompleteBuffer:inAQ
                        buffer:inBuffer];
}

接下来就可以对AudioQueue进行各种操作了,播放暂停和停止等。另外,还要注意各个操作过程中线程资源之间的调用必须要用锁进行保护,在这里我主要参考了AudioStreamer,所以采用了互斥锁pthread_和@synchronized(self)。

最后,附上我的DEMO:

http://download.youkuaiyun.com/detail/atomic123/9323745

【电力负荷预测】项目介绍 MATLAB实现基于BO-Transformer-LSTM贝叶斯优化算法(BO)优化Transformer-LSTM组合模型进行居民用户多步电力负荷预测(含模型描述及部分示例 内容概要:本文介绍了一个基于BO-Transformer-LSTM的组合模型,用于实现居民用户多步电力负荷预测的完整项目实例。该模型融合Transformer的全局注意力机制与LSTM的局部时序记忆能力,构建能够捕捉长时依赖与周期性特征的深度学习架构,并引入贝叶斯优化(BO)自动搜索最优超参数组合,提升预测精度与训练效率。项目涵盖从原始数据清洗、特征工程、滑动窗口样本构建、模型设计到超参数优化、反归一化及多步误差评估的全流程,强调时间顺序划分以防止信息泄露,并通过周期编码、外生变量融合等方式增强数据表达能力。文中提供了详细的MATLAB代码示例,包括数据预处理、网络搭建、贝叶斯优化配置和预测结果评估等关键步骤。 适合人群:具备一定机器学习和时间序列分析基础,熟悉MATLAB编程环境,从事电力系统预测、智能电网、负荷管理等相关领域的研究人员、工程师及研究生。 使用场景及目标:①应用于居民级或多用户聚合负荷的短期至中期多步预测(如未来24小时);②服务于配电系统运行调度、需求响应基线设定、家庭能源管理系统优化、分布式能源协调控制等实际工程场景;③为科研提供可复现的深度学习+贝叶斯优化的技术路线参考。 阅读建议:此资源以实际项目为导向,建议读者结合提供的代码逐步实现并调试模型,重点关注数据质量控制、时间特征编码、组合网络结构设计与贝叶斯优化稳定性之间的协同关系,在实践中深入理解多步预测中的误差累积机制与超参数敏感性问题。 立即下载

相关推荐

国央企创新负责人如何通过平台实现科研成果的快速识别与转化?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

IOS使用ijkPlayer

前言最近要做一个视频直播的项目,刚刚进入视频坑,开始自己琢磨AVPlayer,使用起来发现还挺多限制的,虽然当然知道要先把基础打好,相关基础链接:网络播放器相关http://blog.youkuaiyun.com/Matthew_Fan/article/category/1200896HLS流媒体开发http://blog.youkuaiyun.com/sdvch/article/details/14047281HLS 比

小黑屋研究室 1万+

PotPlayer自用皮肤

自用 PotPlayer 皮肤,仅微调了字体大小与颜色,是按个人习惯调整,未做适配性调整。

IOS 使用IJKPlayer时进行Options设置方法

IOS 使用IJKPlayer时进行Options设置方法

小黑屋研究室 1万+

2-shell及常用命令-续.pdf

2-shell及常用命令-续.pdf

SPSS实战:如何用Harman单因素检验搞定共同方法偏差(附完整操作步骤)

本文提供了一份详尽的SPSS实战指南,手把手教你运用Harman单因素检验来诊断共同方法偏差。文章从核心概念讲起,逐步详解数据准备、SPSS操作步骤、结果解读与报告撰写,帮助研究者快速掌握这一关键的数据质量控制方法,确保量化研究结论的可靠性。

weixin_29263201的博客 1698

基于ijkplayer 视频流 播放

之前开始使用ijk进行了一些简单的播放器实现,不过因为项目需要,所以又重新花了一些时间完善了一个demo主要是对工具栏的逻辑进行了优化,顺便封装了一下,不过第一次做播放器,难免在一些地方有所疏漏,而且时间仓促,一些细节部分暂时还未完善。 主要的一些文件:(参考ijk自带demo) 首先在工具栏部分主要是以下的一些东西 包含了工具栏的自动消失以及工具栏上面的button的初始化(这部分还没有

小黑屋研究室 1万+

Ansys EMC Plus:用于仿真屏蔽效果的一键式工作流程

在 EMA3D 选项卡下,单击 Shielding Effectiveness 按钮下方的箭头以访问设置并使用所需数量的分割数启动工作流程,这些分割数定义了网格大小。在此示例中,设置了 35 个分段,提供了良好的 FDTD 网格,同时保持了较短的仿真运行时间。接下来,选择默认的平面波源文件,然后选择所需的分析方向。您还可以查看和调整仿真树中的仿真参数,包括定义最低和最高频率值的解域、入射平面波的极化以及探针设置。您可以控制屏蔽效果图设置,并以线性比例显示结果。仿真完成后,软件将绘制与频率相关的屏蔽效果图。

jkh920184196的博客 872

SocketIO简单教程

SocketIO socketIO之前,先可以了解清楚原本socket.h的简单说明,以及socketRocket和webSocket的一些简单说明,这样方便我们理解socketIO同时方便建立demo。 在pod的选择上,我选择的版本信息:在这之后依然是可以使用pod update进行更新,之后可以选择使用workplace或者将 然后将以下库添加进来: 
如CFNetwo

小黑屋研究室 7358

Unity 机械臂控制(二)——从碰撞检测到姿态解算:实现精准抓取

本文详细介绍了Unity中机械臂控制的实现方法,从碰撞检测到姿态解算,涵盖精准抓取的全流程。重点讲解了碰撞检测的分层处理、状态机设计、逆向运动学(IK)算法以及抓取稳定性优化等关键技术,并提供了实用的调试技巧和性能优化建议,帮助开发者实现高效的机械臂控制。

weixin_28693447的博客 304

MATLAB闪退别慌!5分钟搞定Windows系统预设文件修复(附详细截图)

本文针对MATLAB在Windows系统下频繁闪退的问题,提供了快速有效的解决方案。核心在于修复或重置损坏的MATLAB预设文件,通过图文并茂的五步法,指导用户定位AppData目录、重命名预设文件夹,从而让MATLAB自动生成全新配置以解决闪退。文章还涵盖了问题诊断、设置备份及进阶排查方法,帮助用户彻底根除启动故障。

weixin_29234423的博客 925

AudioConverterNew from AudioQueueNew returned 'fmt?'

出错原因:参数不全初始状态:aqrs.mDataFormat.mFormatID = kAudioFormatLinearPCM; aqrs.mDataFormat.mSampleRate = 44100.0; aqrs.mDataFormat.mChannelsPerFrame = 1; aqrs.mDataFormat.mBitsPerChannel = 8 * sizeof(SInt16);

小黑屋研究室 2989

从外包到转正:一个华为OD亲历者的真实工作体验与避坑指南

本文分享了一位华为OD员工从外包到转正的真实经历与实用建议。通过详细解析华为OD的日常工作、转正核心指标、机试备考技巧及职场突围策略,为读者提供了一份全面的避坑指南。特别针对机试E卷的高频考点和刷题方法,给出了具体的数据分析和实战经验。

weixin_33686714的博客 699

Carthage使用(解决部分Swift运行时的问题)

Carthage使用(解决部分Swift运行时的问题)

小黑屋研究室 2376

Unity URP 深度解析:利用Stencil与RenderFeature实现高效遮挡高亮

本文深入解析Unity URP中利用Stencil与RenderFeature实现高效遮挡高亮的技术方案。通过模板缓冲机制和自定义RenderFeature,开发者可以在保持场景完整性的同时,清晰标识被遮挡物体位置,提升游戏体验。文章详细介绍了Shader编写、URP管线配置及性能优化技巧,并提供了常见问题排查方法。

weixin_29012677的博客 478

别再手动找触点了!EPLAN线圈触点映像的3种显示方式与F键/Ctrl+B快捷键实战

本文详细解析EPLAN线圈触点映像的3种显示方式与F键/Ctrl+B快捷键实战技巧,帮助电气设计工程师提升图纸操作效率。通过精简编号、路径栏显示和元件旁可视化三种模式的应用场景对比,结合快捷键肌肉记忆训练法,实现触点快速定位与管理,大幅减少手动查找时间。

weixin_42522964的博客 481

IOS DEMO大全

Mirror of Apple’s iOS samples Name Topic Framework Description ABUIGroups Data Management(Contact Data) AddressBook ABUIGroups shows how to check and request access to a user’s address b

小黑屋研究室 2362

3dmax文件格式转换——.max 转换为 .flt(解决转换后.flt没有纹理贴图的问题)

本文主要介绍如何在3dmax中将.max格式文件转换为.flt格式文件,并解决转换后的文件没有纹理贴图的问题。 在3dmax中,将.max文件转换为.flt格式,只需导出选择.flt格式即可,但是导出的文件在osgEarth中加载后,缺少纹理和贴图。 下面是解决方案: 1、选中加载的模型,然后点击 渲染-> 渲染到纹理 2、将 渲染到纹理 子窗口往下拉,点击 添加 按钮,添加 ...

cchangcs 6168

使用AudioSession实现音乐后台播放功能

使用AudioSession实现音乐后台播放功能:首先介绍一些AudioSession的基本概念:使用AudioSession的一些作用就是:确定使用音频类型,是配设备,以及协调音频以及其他功能那么,要通过AudioSession实现一个后台播放功能我们就要先看看AudioSession的使用方法: 首先是初始化调用方法:extern OSStatus AudioSessionInitialize

小黑屋研究室 1566

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

AudioRecorder && AudioPlayer简单实现

使用到的库:均为IOS自带库,为了深入学习,我首先从Audio库开始操作学习, 而不是AVAudioPlayer/AVPlayer(AVFoundation)这一个高级库, 首先我定制的任务是:简单实现缓存下录音播放,简单完成文件读写下的录音播放 均适用AudioQueue机制(如下图):原理就是利用buffer存储内容,将buffer放入queue进行执行: 期间缓存读写更加灵活易于处理,

小黑屋研究室 1559

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

ActivatePowerMode插件,xcode版本

自上次出现了ActivatePowerMode的炫酷插件以后,有大牛自己写了xcode的版本插件,安装以后,我们可以在xcode下继续装逼,不需要使用恼人的atom了: 这里有两个不同的版本: 1、https://github.com/poboke/ActivatePowerMode 2、https://github.com/qfish/XActivatePowerMode 看个人喜好

小黑屋研究室 1227

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

ReactiveCocoa简单教程

ReactiveCocoa:首先使用Pod前,先查看一下版本信息,选择好需要的版本,特别是使用objc时候,不需要选择太新的,主要是已经不再更新了,在这里,我选择的是一个2.0版本,版本特性在大多数博文中都有详细介绍,我就不一一列举了。PodFIle文件设置:当然,只是简单的 也是可以的,我这样写无非是万无一失的,之后Pod update等待下载完成就可以。 打开工程文件夹中由pod新生成的wo

小黑屋研究室 1122

Application windows are expected to have a root view controller at the end of application launch

大概很多IOS新手都会遇到这样的问题,在使用IOS5以前的工程等时候会发生: 这样子的问题,其实就是因为在iOS5之前的版本,应用的加载是需要一个root view controller,而iOS5以前的版本会通过MainWindow启动,iOS5以后就没有了,所以我们可以通过这样子来修改:delegate.h文件中的启动函数:- (void)applicationDidFinishLaunc

小黑屋研究室 1114

数据库Sqlite-(Xcode7,ios9,objective-C)

首先,纪录一下学习的注意点:获取地址的方式和之前的版本其实没有变化,但是要注意一点 NSArray *dirPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *docsDir = [dirPath objectAtIndex:0]; N

小黑屋研究室 854

Undefined symbols for architecture x86_64: 库链接错误

例如,我这里是CFNetwork没有成功链接,虽然我已经加进去了解决方法,删除原来的库文件,重新在build phases里面添加

小黑屋研究室 712
上一篇: Application windows are expected to have a root view controller at the end of application launch
下一篇: 使用AudioSession实现音乐后台播放功能
ZerOByTes
博客等级 码龄14年 24粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值