【C】借助DirectSound进行流的形式无缝播放的例子

2023-10-30

DirectSound是DirectX的一个组件。用于播放声音、BGM等。和DirectMusic不一样,DirectSound用于播放波形声音(WAV无损等),而不是midi音乐。
通常大家使用DirectSound是直接把一个声波数据全部载入到一个IDirectSoundBuffer或IDirectSoundBuffer8里面,然后直接调用IDirectSoundBuffer::Play或IDirectSoundBuffer8::Play进行播放。但是这样的话,要实现无缝播放和大文件播放就比较蛋疼。无缝播放的话就要自己计时,万一自己的表比声卡的表走着快了点或者慢了点,你就会听到奇怪的啪啪声。而大文件播放(比如一张CD专辑)也这样播放的话,这意味着你要把几十甚至几百兆的无损音乐全部载入到内存然后播放。简直是把用户当成内存超大的土豪了。
此外就是用这个你无法很好地实现类似网络电话这样的功能。(难道你recv一个8 KB的波形,你就播放它?还是把一堆8 KB的波形接起来凑够了再播放?那用户一定不爽,自己说话,对方听到的是断断续续的声音。)于是我们就需要用到流的形式来播放声音了。

原理就是建立一个IDirectSoundBuffer8缓冲区,然后让它循环播放,然后我们就不断往这个缓冲区里面写入波形,从而实现连续的流播放。这样的好处是在播放大文件的时候你不必把整个大文件全部读入内存。你只需要读取能填满整个缓冲区的声波就行了。坏处是,如果读文件的函数太慢(比如旧式的机械硬盘、记忆棒有问题的PSP等),你会听到奇怪的声音。

然后用这个就可以实现网络电话的功能。你只需要把自己recv得到的波形填入缓冲区就可以流畅播放了。当然网络很卡的话你还是会听到奇怪的声音。

代码在此。我用的是Microsoft DirectX SDK (March 2008)的头文件和lib。Src和Bin可以下载。Src有配置好的VC6工程。你可以把它升级为VS2012的工程等。

[C]  纯文本查看  复制代码
?
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
//=============================================================================
//StreamSound:
//C语言写的借助DirectSound8进行流模式无缝播放的例子。
//只能在Windows上运行。控制台程序。
//用法:
//StreamSound 声音文件
//其中声音文件需要经过特殊处理(转换格式为标准CD音质的WAV,然后去掉WAV文件头)
//也可以直接播放。
//为了便于代码复用,我以面向对象的思想来编写,并且把写波形到缓冲区的函数独立出
//来以便于用户自定义。
//作者:0xAA55
//版权所有(C) 2013-2014 技术宅的结界
//请保留原作者信息,否则视为侵权。
//-----------------------------------------------------------------------------
#define DIRECTSOUND_VERSION 0x0800
 
#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
#include<dsound.h>
 
#define V(action)           if(FAILED(hr=(action))){SSCleanup(p);fprintf(stderr,#action"==0x%08X\n",hr);return hr;}
#define VN(action)          if(!(action)){SSCleanup(p);fputs(#action" failed\n",stderr);return E_FAIL;}
 
#define SS_Channels         2       //声道数
#define SS_SampleRate       44100   //采样率
#define SS_BytesPerSecond   (SS_SampleRate*SS_BytesPerSamples)
#define SS_BytesPerSamples  (SS_Channels*SS_BitsPerSpl/8)//这是每个样本的字节数
#define SS_BitsPerSpl       16      //单个样本的位数
 
#define SS_BufDuration      100     //缓冲区时长(毫秒)
#define SS_BufSamples       (SS_SampleRate*SS_BufDuration/1000)
#define SS_BufSize          (SS_BytesPerSecond*SS_BufDuration/1000)
 
typedef void (*PFNWRITEBUFFERCALLBACK)( void *pBuffer, UINT uBufferSize); //写波形到缓冲区的函数原型
 
UINT    g_uFileSize=0;      //要播放的文件大小
UINT    g_uFilePointer=0;   //文件指针
FILE    *g_fp=NULL;         //文件流
 
int     g_Quit=0;           //是否Ctrl+C
 
//=============================================================================
//WriteBuffer:
//写波形到缓冲区
//-----------------------------------------------------------------------------
void WriteBuffer( void *pBuffer, UINT uBufferSize)
{
     UINT uBytesLast=g_uFileSize-g_uFilePointer; //从文件指针到文件尾之间的字节数
     UINT uBytesToFill=uBufferSize; //要填充的字节数
     while (uBytesToFill>0)
     {
         printf ( "Offset:0x%08X\tSize:0x%08X\n" ,g_uFilePointer,uBytesToFill);
         if (uBytesLast>=uBytesToFill) //文件指针之后的数据足够填写剩下要填充的字节数
         {
             fseek (g_fp,( long )g_uFilePointer,SEEK_SET);
             fread (pBuffer,1,uBytesToFill,g_fp);
             g_uFilePointer+=uBytesToFill;
             return ;
         }
         else //不足,则返回到头部继续读取
         {
             fseek (g_fp,( long )g_uFilePointer,SEEK_SET);
             fread (pBuffer,1,uBytesLast,g_fp);
             uBytesToFill-=uBytesLast;
             ( BYTE *)pBuffer+=uBytesLast;
             g_uFilePointer=0;
             uBytesLast=g_uFileSize;
         }
     }
}
 
//=============================================================================
//StreamSound:
//借助DirectSound以流的形式播放声音的对象。
//-----------------------------------------------------------------------------
typedef struct
{
     DSCAPS                  Caps;                   //能力表
     LPDIRECTSOUND8          pDS8;                   //中介
     LPDIRECTSOUNDBUFFER     pDSB;                   //声音缓冲区
     LPDIRECTSOUNDNOTIFY     pDSN;                   //事件产生器(提醒载入WAV)
     LPDIRECTSOUNDBUFFER8    pDSB8;                  //声音缓冲区(版本8)
     DSBPOSITIONNOTIFY       DSBPositionNotify;      //播放位置事件
     PFNWRITEBUFFERCALLBACK  pfnWriteBufferCallBack; //写波形到缓冲区的回调函数
}StreamSound;
 
//=============================================================================
//SSCleanup:
//使用完毕后清理内存
//-----------------------------------------------------------------------------
void SSCleanup
(
     StreamSound     *p              //要清理的结构体
)
{
     CloseHandle(p->DSBPositionNotify.hEventNotify);
     if (p->pDSB8)
     {
         IDirectSoundBuffer8_Stop(p->pDSB8);
         IDirectSoundBuffer8_Release(p->pDSB8);
         p->pDSB8=NULL;
     }
     if (p->pDSN)
     {
         IDirectSoundNotify_Release(p->pDSN);
         p->pDSN=NULL;
     }
     if (p->pDSB)
     {
         IDirectSoundBuffer_Release(p->pDSB);
         p->pDSB=NULL;
     }
     if (p->pDS8)
     {
         IDirectSound8_Release(p->pDS8);
         p->pDS8=NULL;
     }
}
 
//=============================================================================
//SSFillBuffer:
//填充声音数据到缓冲区
//-----------------------------------------------------------------------------
HRESULT SSFillBuffer
(
     StreamSound     *p              //要填充的结构体
)
{
     HRESULT hr;
     LPVOID //两个缓冲区指针
         pBuf1=NULL,
         pBuf2=NULL;
     DWORD //两个缓冲区大小
         dwBuf1Size=0,
         dwBuf2Size=0;
     V(IDirectSoundBuffer8_Lock(p->pDSB8,0,0,&pBuf1,&dwBuf1Size,&pBuf2,&dwBuf2Size,DSBLOCK_FROMWRITECURSOR|DSBLOCK_ENTIREBUFFER));
     if (p->pfnWriteBufferCallBack) //如果用户给出了回调函数,则使用回调函数取得声波数据来填写缓冲区
     {
         p->pfnWriteBufferCallBack(pBuf1,dwBuf1Size);
         if (pBuf2)
             p->pfnWriteBufferCallBack(pBuf2,dwBuf2Size);
     }
     else //用户没有给出回调函数,填充白噪音。
     {
         short *pBuf=( short *)pBuf1;
         UINT uSamples=dwBuf1Size/(SS_BitsPerSpl/8),i;
         for (i=0;i<uSamples;i++)
             pBuf[i ]=( short ) rand ()-( short ) rand ();
 
         if (pBuf2)
         {
             pBuf=( short *)pBuf2;
             uSamples=dwBuf2Size/(SS_BitsPerSpl/8),i;
             for (i=0;i<uSamples;i++)
                 pBuf[i ]=( short ) rand ()-( short ) rand ();
         }
     }
     V(IDirectSoundBuffer8_Unlock(p->pDSB8,pBuf1,dwBuf1Size,pBuf2,dwBuf2Size));
     return hr;
}
 
//=============================================================================
//SSInit:
//初始化StreamSound
//-----------------------------------------------------------------------------
HRESULT SSInit
(
     StreamSound             *p,                     //[输出]初始化得到的结构体
     HWND                    hWnd,                   //[输入]得到焦点的窗口
     DWORD                   dwBufferSize,           //[输入]缓冲区大小
     PCMWAVEFORMAT           *pFormat,               //[输入]波形的格式
                                                     //取得所需的参数。
     PFNWRITEBUFFERCALLBACK  pfnWriteBufferCallBack
)
{
     HRESULT hr;
     DSBUFFERDESC DSBufferDesc; //缓冲区描述符
     WAVEFORMATEX WaveFormatEx; //WAV格式
 
     p->Caps.dwSize= sizeof (p->Caps);
     p->pfnWriteBufferCallBack=pfnWriteBufferCallBack; //填充波形数据用到的回调函数
 
     V(DirectSoundCreate8(&DSDEVID_DefaultPlayback,&(p->pDS8),NULL));
     V(IDirectSound8_SetCooperativeLevel(p->pDS8,hWnd,DSSCL_PRIORITY)); //设置协作模式
     V(IDirectSound8_GetCaps(p->pDS8,&(p->Caps))); //取得硬件能力表
 
     DSBufferDesc.dwSize= sizeof (DSBufferDesc);
     DSBufferDesc.dwFlags=DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPOSITIONNOTIFY|DSBCAPS_GLOBALFOCUS; //全局播放
     DSBufferDesc.dwBufferBytes=dwBufferSize; //缓冲区大小
     DSBufferDesc.dwReserved=0;
     DSBufferDesc.lpwfxFormat=&WaveFormatEx; //波形格式
 
     WaveFormatEx.wFormatTag=pFormat->wf.wFormatTag;
     WaveFormatEx.nChannels=pFormat->wf.nChannels;
     WaveFormatEx.nSamplesPerSec=pFormat->wf.nSamplesPerSec;
     WaveFormatEx.nAvgBytesPerSec=pFormat->wf.nAvgBytesPerSec;
     WaveFormatEx.nBlockAlign=pFormat->wf.nBlockAlign;
     WaveFormatEx.wBitsPerSample=pFormat->wBitsPerSample;
     WaveFormatEx.cbSize= sizeof (WaveFormatEx);
 
     V(IDirectSound8_CreateSoundBuffer(p->pDS8,&DSBufferDesc,&(p->pDSB),NULL)); //建立缓冲区
     V(IDirectSoundBuffer_QueryInterface(p->pDSB,&IID_IDirectSoundNotify,&(p->pDSN))); //建立提醒
     V(IDirectSoundBuffer_QueryInterface(p->pDSB,&IID_IDirectSoundBuffer8,&(p->pDSB8))); //取得版本8的缓冲区
     p->pDSB->lpVtbl->Release(p->pDSB);
     p->pDSB=NULL;
 
     p->DSBPositionNotify.dwOffset=0; //每次播放指针到缓冲区开头的时候填充数据
     VN(p->DSBPositionNotify.hEventNotify=CreateEvent(NULL,FALSE,FALSE,NULL));
     V(IDirectSoundNotify_SetNotificationPositions(p->pDSN,1,&(p->DSBPositionNotify)));
     V(SSFillBuffer(p));
     return hr;
}
 
//=============================================================================
//SSPlay:
//播放
//-----------------------------------------------------------------------------
HRESULT SSPlay
(
     StreamSound     *p
)
{
     HRESULT hr;
     V(IDirectSoundBuffer8_Play(p->pDSB8,0,0,DSBPLAY_LOOPING)); //循环播放
     return hr;
}
 
//=============================================================================
//SSUpdate:
//检查是否需要填充新的数据,然后填充数据
//-----------------------------------------------------------------------------
HRESULT SSUpdate
(
     StreamSound     *p
)
{
     HRESULT hr;
     if (WaitForSingleObject(p->DSBPositionNotify.hEventNotify,0)!=WAIT_TIMEOUT) //检测状态(是否需要填充新的数据到缓冲区)
         V(SSFillBuffer(p));
     return hr;
}
 
 
void Signal( int sig)
{
     switch (sig)
     {
     case SIGINT:
         g_Quit=1;
         fputs ( "Ctrl+C\n" ,stderr);
         break ;
     }
}
 
int main( int argc, char **argv)
{
     HRESULT         hr;
     StreamSound     SS={0};
     PCMWAVEFORMAT   WAVEfmt;
 
     //先找到窗口作为焦点窗口
     HWND hWnd=FindWindow(TEXT( "ConsoleWindowClass" ),NULL);
     if (!hWnd)
     {
         fputs ( "Could not get the console window handle.\n" ,stderr);
         return 2;
     }
 
     if (argc<2)
     {
         fputs (
             "Usage: StreamSound <FILE>\n"
             "The file should be 44100 Hz, 16 bit stereo PCM file. \n"
             "You can remove the header of a WAV file to get the PCM file.\n" ,stderr);
         return 1;
     }
 
     signal (SIGINT,Signal);
 
     g_fp= fopen (argv[1], "rb" );
     if (!g_fp)
     {
         fprintf (stderr, "Could not read %s\n" ,argv[1]);
         return 2;
     }
     fseek (g_fp,0,SEEK_END);
     g_uFileSize=( UINT ) ftell (g_fp);
     fseek (g_fp,0,SEEK_SET);
 
     WAVEfmt.wf.wFormatTag=WAVE_FORMAT_PCM;
     WAVEfmt.wf.nChannels=SS_Channels;
     WAVEfmt.wf.nSamplesPerSec=SS_SampleRate;
     WAVEfmt.wf.nAvgBytesPerSec=SS_BytesPerSecond;
     WAVEfmt.wf.nBlockAlign=SS_BytesPerSamples;
     WAVEfmt.wBitsPerSample=SS_BitsPerSpl;
 
     //初始化播放器
     if (FAILED(hr=SSInit(&SS,hWnd,SS_BytesPerSecond*SS_BufDuration/1000,&WAVEfmt,WriteBuffer)))
     {
         SSCleanup(&SS);
         fclose (g_fp);
         return 2;
     }
 
     if (FAILED(hr=SSPlay(&SS))) //先开始循环播放
     {
         SSCleanup(&SS);
         fclose (g_fp);
         return 2;
     }
 
     while (!g_Quit)
     {
         hr=SSUpdate(&SS); //不断检查缓冲区是否需要填充新的数据。
     }
 
     SSCleanup(&SS);
     fclose (g_fp);
     return 0;
}
BIN:    BIN.7z (17.02 KB, 下载次数: 2, 售价: 1 个宅币) 
SRC:    SRC.7z (21.19 KB, 下载次数: 1, 售价: 10 个宅币) 
话说用DirectSound录音也很简单,用Capture就行。也是差不多的原理。

from:https://www.0xaa55.com/thread-693-1-1.html


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C】借助DirectSound进行流的形式无缝播放的例子 的相关文章

  • 怎样使用Cubase进行人声消除

    所谓分离伴奏 指的就是消除人声 通常在一首歌曲的音频文件中 混音师一般都会将人声放在声像位置的正中间再输出为一个立体声音频文件 一般情况下是这样 但不代表全是这样 因此 人声的波形在该立体声音频文件的左声道和右声道中应该是相同或相似的 所以
  • 关于安卓上pcm文件转wav全是噪音解决办法

    1 一开始发现8bit的pcm能正常转换 但换成16bit转换出来全是噪音 网上资料也不全 思考了很久 突然想起大小端的问题 进行大小端处理后再进行转换 完美播放 下面贴出大小端转换方法 public class BigorLittle p
  • 【C】借助DirectSound进行流的形式无缝播放的例子

    DirectSound是DirectX的一个组件 用于播放声音 BGM等 和DirectMusic不一样 DirectSound用于播放波形声音 WAV无损等 而不是midi音乐 通常大家使用DirectSound是直接把一个声波数据全部载
  • OGG流媒体文件格式分析

    摘自 http www studa net yingyong 080505 16283240 html 摘 要 流媒体文件格式在流媒体系统中占有重要地位 设计合理的文件格式是提高流媒体服务器工作效率最直接和最有效的办法 该文在剖析常用流媒体
  • Android Audio系统框架

    Audio System 二 之 Audio系统框架 二 Linux Audio系统框架 2 1 Application 层 2 2 Framework 层 2 3 Libraries 层 2 4 HAL 层 2 5 Tinyalsa 层
  • Ubuntu13下调试USB AUDIO的一些记录

    最近想玩玩LINUX 于是双系统装了一个Ubuntu13 04 在新系统下用着都还好 不过我自己DIY的USB DAC出了问题 在WIN7下能正常工作 但是在Ubuntu下就爆音不断 很明显是音频数据流断流引起的 这说明stm32上的固件与
  • 音频——WAV 格式详解

    文章目录 WAV 文件格式解析 概述 块解析 RIFF chunk fmt chunk data chunk 示例分析 代码解析 WAV 文件格式解析 概述 wav 文件支持多种不同的比特率 采样率 多声道音频 WAV 文件格式是 Micr
  • python:pydub模块

    一 安装 1 安装模块 pip install pydub 2 安装插件 云盘中下载文件ffmpeg 打开电脑上的控制面板 系统 高级系统设置 环境变量 然后双击path 看到如下的界面 然后点新建会出现一个新建的地址栏 你需要在这个新建地
  • A²B汽车音频总线介绍

    A B使远程I S TDM成为可能 I S是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准 该总线专责于设备之间的数据传输 广泛应用于各种多媒体系统 I C是两线式串行总线 用于连接微控制器及其外围设备 简单来说就是I C传
  • AMR文件格式分析

    最近在传输手机录音时 遇到了AMR编码的问题 开始以为可以任意截断amr文件 加个文件头就可以播放的 后来发现是有问题 这样得到的amr音频有些不能正常播放 后来参看amr格式后 才知道amr文件是一帧一帧的 如果是按照完整的帧前面添加文件
  • DirectX编程:利用 DirectSound 录音

    DirectX编程 利用 DirectSound 录音 转载 http www cnblogs com stg609 archive 2008 10 24 1318931 html 花了一阵子 把DirectX安装后自带的帮助文件中的那部分
  • 免费的包噪音网站分享

    免费的包噪音网站分享 现代生活中 噪音扰人 影响健康和情绪 白噪音可以为人们提供放松心情 提高睡眠质量和专注力的帮助 现在有很多免费的白噪音网站可以任意使用和分享 包括海浪声 雨声 蝉鸣声等等 非常适合在办公室 家里或者旅途中使用 本文为您
  • Java把V3音频文件转化为wav文件的算法的代码

    将写内容过程经常用到的内容段做个备份 如下内容内容是关于Java把V3音频文件转化为wav文件的算法的内容 import java io BufferedInputStream import java io BufferedOutputSt
  • FPGA微型板Verilog简单音频

    简单音调生成 该模块通过使用一个计数器生成一个1 kHz的信号 该计数器在CLK的每个刻度上都递增 当计数器达到32 000时 将切换输出BUZZER 并将计数器重置为0 音频输出 使用一个1 k 电阻器和一小段实心线将GPIO引脚P97和
  • Using DirectSound to Play Audio Stream Data

    Download demo project 30 5 Kb Download source 3 27 Kb Introduction This article with its code shows how to play audio st
  • 麦克输入

    如图所示 单端输入只有一个输入引脚ADCIN 使用公共地GND作为电路的返回端 ADC的采样值 ADCIN电压 GND的电压 0V 这种输入方式优点就是简单 缺点是如果vin受到干扰 由于GND电位始终是0V 所以最终ADC的采样值也会随着
  • pulseaudio使用过程中遇到的问题

    W pulseaudio main c This program is not intended to be run as root unless system is specified E pulseaudio core util c H
  • 采样位数、采样率、波特率

    实例 16bit 16K 115200 1 采样位数 即采样值或取样值 就是将采样样本幅度量化 它是用来衡量声音波动变化的一个参数 也可以说是声卡的分辨率 它的数值越大 分辨率也就越高 所发出声音的能力越强 在计算机中采样位数一般有8位和1
  • 解决:soundfile打开opus文件出错: File contains data in an unimplemented format.

    Python的soundfile库依赖于libsndfile库 需要安装最新版本 sudo apt get update sudo apt get install libsndfile1 如果之前已经安装soundfile 则可能采用了旧版
  • 免费音效素材网站,一次性介绍清楚

    不管是在游戏 电影 电视剧 短视频还是音频中 合适的音效能够更好的表达内容和渲染氛围 今天给大家分享几个免费音效素材 感兴趣的话可以接着往下看 一 制片帮素材 找音效 制片帮素材不仅有海量的优质视频素材 还有丰富的音效资源 分类清晰 更重要

随机推荐

  • 弹出框移动、放大、缩小、最大化处理

    function getViewportSize 可视区域的宽度和高度 return width document documentElement clientWidth height document documentElement cl
  • 值得一看的Linux内核—中断下半部之软中断

    软中断 软中断 softirq 是中断处理程序在开启中断的情况下执行的部分 可以被硬中断抢占 内核定义了一张软中断向量表 每种软中断有一个唯一的编号 对应一个softirq action实例 softirq action实例的成员actio
  • Linux下的用户和文件权限管理

    一 管理用户账号和组帐号 1 用户帐号和组帐号概述 1 1用户帐号 用户账号 特点 超级用户 root用户 负责系统管理和维护 普通用户 由root创建 有限的权限 一般只在自己的宿主目录中拥有完整权限 程序用户 Linux系统自带 不许登
  • goland报错:go: go.mod file not found in current directory or any parent directory; see ‘go help module

    IDE编辑器 goland 2020 1 下载链接 现象 原因 运行文件路径配置错误 解决 edit configurations 编辑配置 修改路径 将路径具体到要运行的文件 点击ok保存 再次点击 run 执行成功
  • k8s安全07--使用AppArmor限制容器访问资源

    k8s安全07 使用AppArmor限制容器访问资源 1 介绍 2 操作案例 2 1 apparmor 基础命令 2 2 通过AppArmor 限制pod访问的资源 3 注意事项 4 说明 1 介绍 AppArmor is a kernel
  • linux下logstash插件离线包的方式安装

    1 背景 我们项目研发了一块日志分析系统 之后需要去内网环境下实施 别的都好说 只是内网环境无法联网 众所周知的是logstash的插件安装在linux上需要一堆的依赖 这也是我觉得linux最麻烦的地方 所以我们想了个办法 即将在我们测试
  • 蚁群算法解决tsp问题python_蚁群算法求解TSP问题

    一 蚁群算法简介 蚁群算法是对自然界蚂蚁的寻径方式进行模似而得出的一种仿生算法 蚂蚁在运动过程中 能够在它所经过的路径上留下信息素 pheromone 的物质进行信息传递 而且蚂蚁在运动过程中能够感知这种物质 并以此指导自己的运动方向 由大
  • 解决mysqlclient 1.4.0 or newer is required; you have 0.10.1问题

    执行python manage py makemigrations生成数据库迁移文件时 报错 raise ImproperlyConfigured mysqlclient 1 4 0 or newer is required you hav
  • java中的

    java逻辑运算符 位或运算符 位与运算符 位异或运算 位非运算符 位或运算符 运算符和 这一类的运算符一样 拆解开就是 a a b 运算规则 两个数都转为二进制 然后从高位开始比较 两个数只要有一个为1则为1 否则就为0 比如 129 1
  • C++ int转换为string

    我们可以使用 C 标准库或C 库函数 类将 int 转换为字符串 现代 C 风格的方式 我们可以使用C 标准库中的std to string 这个是自11年以来添加到C 标准库中的 如果项目使用C 11 和之后的标准 建议使用这个方法 st
  • 解读RSAC 2022

    山石网科为你解读RSAC 2022 第一期 云平台的新思想 方法 第二期 深度学习的应用 深度学习的刻板印象 近年来 硬件计算能力的强大和数据量的与日俱增 推动了深度学习 Deep Learning 的发展 使深度学习的实用性和普及性都有了
  • 医疗知识中台白皮书 PDF

    链接 https pan baidu com s 1IFi NE3oWTE82 q DVUuug 提取码 3jf7
  • RuoYi若依框架的使用(新增侧边栏菜单并可以打开)

    2022 12 06今天我学习了如何使用若依框架做一个侧边栏的菜单 并且可以打开对应的页面 一 菜单管理页面 首先在菜单管理页面新增主目录 如 自己设置一个路由地址 二 新增子菜单 然后在创建好的主菜单中再新增子菜单 如 组件路径和权限字符
  • 完美解决“error rpc failed curl 18 transfer closed with outstanding read data remaining”问题【每天一个小技巧】

    本文结构 0 引言 1 解决方案 0 引言 在使用Git clone或者coinbrew fetch获得网络代码仓库的时候 经常出现类似如下错误 Cloning into remote Counting objects 20248 done
  • 大数据之数据仓库实战

    概念 什么是数据库 数据库 Database 是按照数据结构来组织 存储和管理数据的建立在计算机存储设备上的仓库 数据库是长期储存在计算机内 有组织的 可共享的数据集合 数据库中的数据指的是以一定的数据模型组织 描述和储存在一起 具有尽可能
  • 常用的C盘手动清理方法(小白教程)

    1 清理系统更新安装包 2 清理电脑用户缓存文件 同时按住 Win 键和 R 键 调出运行命令窗口 输入英文状态下的 temp 打开后选中所有删除即可 都是缓存文件 不影响正常使用 3 清理电脑用户的 Argt文件夹 具体叫什么名字找不到了
  • ARIMA模型进行销售数据预测

    ARIMA模型的预测分为以下几部分 1 导入相关库 import pandas as pd import numpy as np import matplotlib pyplot as plt import statsmodels api
  • php curl读取头,【随手记】PHP中使用curl_setopt获取响应头

    随手记 PHP中使用curl setopt获取响应头 随手记 PHP中使用curl setopt获取响应头 在项目中需要对接总部的接口文档 其中需要使用PHP发送原生RAW请求 客户将获取验证TOCKEN值放在了响应头中 如果要获取该值 提
  • AndroidStudio报Error:Execution failed for task ':app:buildInfoDebugLoader'.

    当AndroidStudio在编译的时候报错 Error Execution failed for task app buildInfoDebugLoader gt Exception while doing past iteration
  • 【C】借助DirectSound进行流的形式无缝播放的例子

    DirectSound是DirectX的一个组件 用于播放声音 BGM等 和DirectMusic不一样 DirectSound用于播放波形声音 WAV无损等 而不是midi音乐 通常大家使用DirectSound是直接把一个声波数据全部载