使用音频引擎MITA处理播放器列表的源代码

20个HTML5视频播放器及代码 NULL 博文链接:https://justcoding.iteye.com/blog/1169026 立即下载

#include "../../include/mita.h" /**< @brief MITA SDK Header */
#ifdef _DEBUG
#pragma comment(lib, "../../library/mitaD.lib")
#else
#pragma comment(lib, "../../library/mita.lib")
#endif

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>

#pragma warning(push)
#pragma warning(disable:4996)

MITA_STATIC
MITA_INLINE
MITA_VOID
MITA_CheckError(MITA_VOID)
{
MITA_ERROR lastError = MITA_GetLastError();
if (lastError != MITA_ERROR_OK)
{
printf("ERROR: MITA Framework error with %u codes\n", lastError);
exit(lastError);
}
}

MITA_STATIC
MITA_INLINE
MITA_BYTE
MITA_EnterKey(MITA_VOID)
{
MITA_INT32 key = 0xFF;
do
{
if (kbhit())
{
key = getch();
break;
}
Sleep(10);
} while (1);
if (key >= 'a' && key <= 'z')
key -= 32;
return key;
}

//////////////////////////////////////////////////////////////////////////
//ChannelMask must has channel number in high 8 bits.
// | 00000000 | MMMMMMMM MMMMMMMM MMMMMMMM |
// Nums ChannelMask
//How to set number?
// MITA_CHNFMT_SetNum(Mask, 2)
//Also you can use MITA_GuessChannelMode.
//
// The channel number must equal with channel mask.
// ChannelMask = MITA_CP_FRONT_LEFT|MITA_CP_FRONT_RIGHT; //Use two speaker
// MITA_CHNFMT_SetNum(ChannelMask, 2); //Set 2
//
MITA_STATIC
MITA_INLINE
MITA_HOUTPUT
MITA_CreateDefaultOutput(MITA_HINSTANCE hInstance, MITA_DWORD ChannelMask)
{
MITA_HOUTPUT hOutput;
MITA_HDEVICE hDevice;
MITA_DEVICEPARAM Param;
MITA_SIZE i, n;
MITA_DEVICEINFO DevInfo;
MITA_BYTE Key = 'A';
MITA_DWORD Ids[10];
MITA_BYTE MaxIds = 0;

MITA_Ins_CreateObject(hInstance, &IID_DevWinMME, &hDevice);
MITA_CheckError();

MITA_Device_GetDeviceNums(hDevice, &n);
MITA_CheckError();

printf("\nSelect a output device: \n");
_try_again:
Key = 'A';
for (i = 0; i < n; i++)
{
MITA_Device_GetDevice(hDevice, i, &DevInfo);
MITA_CheckError();
if (DevInfo.Type == MITA_CT_OUTPUT)
{
Ids[Key - 'A'] = DevInfo.DevId;
printf("[%c] Device %s [%f - %f]\n", Key, MITA_Text_ToSystemS(DevInfo.DevName, MITA_TCT_DEFAULT), DevInfo.Latency[0], DevInfo.Latency[1]);
Key++;
MaxIds++;
}
}
Key = MITA_EnterKey() - 'A';
if (Key >= MaxIds)
{
printf("ERROR: Invalid input keys, please try again.\n");
goto _try_again;
}

Param.Callback = MITA_NULL;
Param.CallbackHandle = MITA_NULL;
Param.Customer = MITA_NULL; /**< @brief for future use */
Param.ChannelFmt.mask = ChannelMask; /**< @brief The mask of channels. */
Param.ChannelFmt.sfmt = MITA_SDT_F32; /**< @brief Float32 Sample */
Param.ChannelFmt.sps = 44100.0f; /**< @brief 44.1KHz */
Param.Latency = 0.1f; /**< @brief 100 ms latency */
Param.Type = MITA_CT_OUTPUT; /**< @brief For output. */
Param.DevId = Ids[Key]; /**< @brief The id of device */

MITA_Output_CreateByDevice(hInstance, hDevice, &Param, MITA_FALSE, &hOutput);
MITA_CheckError();

return hOutput;
}

MITA_STATIC
MITA_INLINE
MITA_VOID
MITA_PrintDecSupportExts(MITA_HINSTANCE hInstance)
{
MITA_HFACTORY DecFactory;
MITA_HOBJECTLIST DecList;
MITA_SIZE i, n, j, jn;
MITA_AFD afd;
MITA_HDECODER hDecoder;
MITA_Ins_GetFactory(hInstance, MITA_MT_DECODER, &DecFactory);
MITA_CheckError();
MITA_ObjectList_Build(hInstance, DecFactory, MITA_FALSE, &DecList);
MITA_CheckError();
MITA_ObjectList_Count(DecList, &n);
for (i = 0; i < n; i++)
{
MITA_ObjectList_Get(DecList, i, &hDecoder);
MITA_Decoder_GetFileDescribeNums(hDecoder, &jn);
for (j = 0; j < jn; j++)
{
MITA_Decoder_GetFileDescribe(hDecoder, j, &afd);
printf("%s;", MITA_Text_ToSystemS(afd.ext, MITA_TCT_DEFAULT));
}
}
printf("\n");
MITA_CloseHandle(DecList);
}

MITA_STATIC
MITA_INLINE
MITA_BOOL
MITA_CALLBACK
MITA_MAPL_PutInfoHeader(MITA_APLCODEC codec, MITA_HSTREAM hStream, MITA_LPAPLINFOHEADER pInfoHdr, MITA_HANDLE hHandle)
{
MITA_SIZE WriteSize;
MITA_Stream_Write(hStream, pInfoHdr, pInfoHdr->cbSize, &WriteSize);
return MITA_TRUE;
}

MITA_STATIC
MITA_INLINE
MITA_BOOL
MITA_CALLBACK
MITA_MAPL_GetInfoHeader(MITA_APLCODEC codec, MITA_HSTREAM hStream, MITA_LPAPLINFOHEADER* pInfoHdr, MITA_HANDLE hHandle)
{
MITA_SIZE cbSize;
MITA_SIZE readSize;
MITA_Stream_Read(hStream, &cbSize, sizeof(MITA_SIZE), &readSize);
MITA_Stream_Seek(hStream, -4, 0, SEEK_CUR);
*pInfoHdr = MITA_Malloc(cbSize);
if (*pInfoHdr == MITA_NULL)
return MITA_FALSE;
MITA_Stream_Read(hStream, *pInfoHdr, cbSize, &readSize);
return MITA_TRUE;
}

MITA_STATIC
MITA_INLINE
MITA_VOID
MITA_CALLBACK
MITA_MAPL_DelInfoHeader(MITA_APLCODEC codec, MITA_LPAPLINFOHEADER pInfoHdr, MITA_HANDLE hHandle)
{
MITA_Free(pInfoHdr);
}

MITA_STATIC
MITA_INLINE
MITA_BOOL
MITA_CALLBACK
MITA_MAPL_PutItem(MITA_APLCODEC codec, MITA_HSTREAM hStream, MITA_HSOUND hItem, MITA_HANDLE hHandle)
{
MITA_WORD nExtendSize;
MITA_SIZE WriteSize;
MITA_LPBYTE pExtend;
MITA_ISound* pSound = (MITA_ISound*)hItem;
MITA_SIZE cbSize = pSound->cbSize - 12;
//////////////////////////////////////////////////////////////////////////
//
MITA_Stream_Write(hStream, &cbSize, sizeof(MITA_WORD), &WriteSize);
MITA_Stream_Write(hStream, &pSound->channelInfo, sizeof(MITA_CHANNELFORMAT), &WriteSize);
MITA_Stream_Write(hStream, &pSound->fBitRate, sizeof(MITA_FLOAT), &WriteSize);
MITA_Stream_Write(hStream, &pSound->fAverBitRate, sizeof(MITA_FLOAT), &WriteSize);
MITA_Stream_Write(hStream, &pSound->fQuality, sizeof(MITA_FLOAT), &WriteSize);
MITA_Stream_Write(hStream, &pSound->sTotalTime, sizeof(MITA_TIME), &WriteSize);
MITA_Stream_Write(hStream, pSound->fileType, sizeof(pSound->fileType), &WriteSize);
MITA_Stream_Write(hStream, &pSound->coderGUID, sizeof(MITA_UUID), &WriteSize);
MITA_Stream_Write(hStream, pSound->encoding, sizeof(pSound->encoding), &WriteSize);
MITA_Stream_Write(hStream, &pSound->timeRange, sizeof(MITA_TIMEPOS), &WriteSize);
MITA_Stream_Write(hStream, pSound->szPath, sizeof(pSound->szPath), &WriteSize);
MITA_Stream_Write(hStream, &pSound->nTagIndex, sizeof(MITA_BYTE), &WriteSize);
MITA_Stream_Write(hStream, &pSound->nTagNums, sizeof(MITA_BYTE), &WriteSize);
MITA_Stream_Write(hStream, pSound->szTitle, sizeof(pSound->szTitle), &WriteSize);
MITA_Stream_Write(hStream, pSound->szArtist, sizeof(pSound->szArtist), &WriteSize);
MITA_Stream_Write(hStream, pSound->szAlbum, sizeof(pSound->szAlbum), &WriteSize);
MITA_Stream_Write(hStream, pSound->szComment, sizeof(pSound->szComment), &WriteSize);
MITA_Stream_Write(hStream, pSound->szGenre, sizeof(pSound->szGenre), &WriteSize);
MITA_Stream_Write(hStream, &pSound->nTrack, sizeof(MITA_INT32), &WriteSize);
MITA_Stream_Write(hStream, &pSound->nYear, sizeof(MITA_INT32), &WriteSize);
MITA_Sound_GetExtend(hItem, &nExtendSize, &pExtend);
if (nExtendSize)
MITA_Stream_Write(hStream, pExtend, nExtendSize, &WriteSize);
////////////////////////////////////////////////////////////////////////////////
//TODO: 添加你额外的写入数据代码

return MITA_TRUE;
}

MITA_STATIC
MITA_INLINE
MITA_BOOL
MITA_CALLBACK
MITA_MAPL_GetItem(MITA_APLCODEC codec, MITA_HSTREAM hStream, MITA_HSOUND* hItem, MITA_HANDLE hHandle)
{
//////////////////////////////////////////////////////////////////////////
//
MITA_WORD nExtendSize;
MITA_SIZE readSize;
MITA_LPBYTE pExtend;
MITA_WORD nSize;
MITA_ISound* pSound;
//////////////////////////////////////////////////////////////////////////
//
MITA_Stream_Read(hStream, &nSize, sizeof(MITA_WORD), &readSize);
if (!MITA_Sound_Create((MITA_HINSTANCE)(hHandle), nSize - sizeof(MITA_ISound) + 12, hItem))
return MITA_FALSE;
pSound = (MITA_ISound*)(*hItem);
MITA_Stream_Read(hStream, &pSound->channelInfo, sizeof(MITA_CHANNELFORMAT), &readSize);
MITA_Stream_Read(hStream, &pSound->fBitRate, sizeof(MITA_FLOAT), &readSize);
MITA_Stream_Read(hStream, &pSound->fAverBitRate, sizeof(MITA_FLOAT), &readSize);
MITA_Stream_Read(hStream, &pSound->fQuality, sizeof(MITA_FLOAT), &readSize);
MITA_Stream_Read(hStream, &pSound->sTotalTime, sizeof(MITA_TIME), &readSize);
MITA_Stream_Read(hStream, pSound->fileType, sizeof(pSound->fileType), &readSize);
MITA_Stream_Read(hStream, &pSound->coderGUID, sizeof(MITA_UUID), &readSize);
MITA_Stream_Read(hStream, pSound->encoding, sizeof(pSound->encoding), &readSize);
MITA_Stream_Read(hStream, &pSound->timeRange, sizeof(MITA_TIMEPOS), &readSize);
MITA_Stream_Read(hStream, pSound->szPath, sizeof(pSound->szPath), &readSize);
MITA_Stream_Read(hStream, &pSound->nTagIndex, sizeof(MITA_BYTE), &readSize);
MITA_Stream_Read(hStream, &pSound->nTagNums, sizeof(MITA_BYTE), &readSize);
MITA_Stream_Read(hStream, pSound->szTitle, sizeof(pSound->szTitle), &readSize);
MITA_Stream_Read(hStream, pSound->szArtist, sizeof(pSound->szArtist), &readSize);
MITA_Stream_Read(hStream, pSound->szAlbum, sizeof(pSound->szAlbum), &readSize);
MITA_Stream_Read(hStream, pSound->szComment, sizeof(pSound->szComment), &readSize);
MITA_Stream_Read(hStream, pSound->szGenre, sizeof(pSound->szGenre), &readSize);
MITA_Stream_Read(hStream, &pSound->nTrack, sizeof(MITA_INT32), &readSize);
MITA_Stream_Read(hStream, &pSound->nYear, sizeof(MITA_INT32), &readSize);
MITA_Sound_GetExtend(*hItem, &nExtendSize, &pExtend);
if (nExtendSize)
MITA_Stream_Read(hStream, pExtend, nExtendSize, &readSize);
////////////////////////////////////////////////////////////////////////////////
//TODO: 添加你额外的读取数据代码

return MITA_TRUE;
}

MITA_STATIC
MITA_INLINE
MITA_VOID
MITA_CALLBACK
MITA_MAPL_DelItem(MITA_APLCODEC codec, MITA_HSOUND hItem, MITA_HANDLE hHandle)
{
MITA_CloseHandle(hItem);
}

typedef struct MITA_TAG_LOOPPROCHANDLE
{
MITA_HINSTANCE hInstance;
MITA_HARRAY hItemArray;
MITA_HOBJECTLIST hDecoderChain;
}MITA_LOOPPROCHANDLE;

MITA_STATIC
MITA_BOOL
MITA_CALLBACK
MITA_LoopProc(MITA_HANDLE h, MITA_LPCWSTR lpPath)
{
MITA_LOOPPROCHANDLE* Handle = (MITA_LOOPPROCHANDLE*)h;
MITA_PARAMPARSESONG Param;

Param.dwTagFlag = MITA_TAGREAD_OTHER_ID3V2_APE_ID3V1;
Param.hDecoderChain = Handle->hDecoderChain;
Param.hInstance = Handle->hInstance;
Param.hItemArray = Handle->hItemArray;
Param.hStream = MITA_NULL;
Param.nStreamBeginPos = 0;
Param.lpPath = lpPath;

MITA_Ins_Action_ParseSong(&Param);

return MITA_TRUE;
}

MITA_STATIC
MITA_INLINE
MITA_HARRAY
MITA_PraseDirectory(MITA_HINSTANCE hInstance, MITA_LPCWSTR lpDir, MITA_BOOL bIncChildDir)
{
MITA_LOOPPROCHANDLE Handle;
MITA_HFACTORY hDecoderFactory;

MITA_Ins_GetFactory(hInstance, MITA_MT_DECODER, &hDecoderFactory);
MITA_ObjectList_Build(hInstance, hDecoderFactory, MITA_FALSE, &Handle.hDecoderChain);
Handle.hInstance = hInstance;
Handle.hItemArray = MITA_Array_Create(hInstance, 1, sizeof(MITA_HSOUND), MITA_FALSE);

MITA_LoopFile(hInstance, lpDir, bIncChildDir, &Handle, MITA_LoopProc, MITA_NULL);
MITA_CloseHandle(Handle.hDecoderChain);

return Handle.hItemArray;
}

MITA_STATIC
MITA_INLINE
MITA_VOID
MITA_PrintSoundArray(MITA_HARRAY hItemArray)
{
MITA_SIZE i, n;
MITA_HSOUND hSoundItem;
MITA_WCHAR szPath[MITA_MAXPATH];
MITA_UUID coderGuid;

printf("\n");
n = MITA_Array_GetCount(hItemArray);
for (i = 0; i < n; i++)
{
MITA_Array_Get(hItemArray, i, &hSoundItem);
MITA_Sound_GetPath(hSoundItem, szPath, MITA_MAXPATH);
MITA_Sound_GetCoderGUID(hSoundItem, &coderGuid);
printf("Path: %s\n", MITA_Text_ToSystemS(szPath, MITA_TCT_DEFAULT));
}
}

MITA_STATIC
MITA_INLINE
MITA_VOID
MITA_DeleteSoundArray(MITA_HARRAY hItemArray)
{
MITA_SIZE i, n;
MITA_HSOUND hSoundItem;

n = MITA_Array_GetCount(hItemArray);
for (i = 0; i < n; i++)
{
MITA_Array_Get(hItemArray, i, &hSoundItem);
MITA_CloseHandle(hSoundItem);
}
MITA_CloseHandle(hItemArray);
}

MITA_STATIC
MITA_INLINE
MITA_VOID
MITA_SaveMAPL(MITA_HINSTANCE hInstance, MITA_LPCWSTR lpPath, MITA_HARRAY hItemArray)
{
MITA_APL_ENCPARAM_IO io;
MITA_HENCODER hMAPLEncoder;
MITA_FILEPARAM FileParam;
MITA_APLINFOHEADER* InfoHeader;

memset(&io, 0, sizeof(io));
io.io.CB_DelInfoHeader = MITA_MAPL_DelInfoHeader;
io.io.CB_DelItem = MITA_MAPL_DelItem;
io.io.CB_GetInfoHeader = MITA_NULL;
io.io.CB_PutInfoHeader = MITA_MAPL_PutInfoHeader;
io.io.CB_GetItem = MITA_NULL;
io.io.CB_PutItem = MITA_MAPL_PutItem;
io.io.CB_Handle = hInstance;
InfoHeader = (MITA_APLINFOHEADER*)MITA_Calloc(1, sizeof(MITA_APLINFOHEADER));
InfoHeader->cbSize = sizeof(MITA_APLINFOHEADER);
InfoHeader->version = 0;
InfoHeader->item_pos = sizeof(MITA_APLHEADER) + sizeof(MITA_APLINFOHEADER);
InfoHeader->text_type = MITA_TCT_UTF16LE;
io.pInfoHdr = InfoHeader;

if (!MITA_Ins_CreateObject(hInstance, &IID_EncMAPL, &hMAPLEncoder))
{
printf("ERROR: Not install cdc_mapl.dll plugin.\n");
MITA_CheckError();
return;
}
MITA_Encoder_SetParam(hMAPLEncoder, MAPL_ENCPARAM_IO, &io);

///////////////////////////////////////////////////////
//你也可以选择Stream对象进行存储
FileParam.nFlag = MITA_FPF_USEPATH;
FileParam.hStream = MITA_NULL;
FileParam.lpwszPath = lpPath;

MITA_Encoder_Startup(hMAPLEncoder, &FileParam, hItemArray);
MITA_Encoder_Terminate(hMAPLEncoder);
MITA_CloseHandle(hMAPLEncoder);
}

MITA_STATIC
MITA_INLINE
MITA_HARRAY
MITA_LoadMAPL(MITA_HINSTANCE hInstance, MITA_LPCWSTR lpPath)
{
MITA_APL_DECPARAM_IO io;
MITA_HDECODER hMAPLDecoder;
MITA_FILEPARAM FileParam;
MITA_HARRAY hItemArray = MITA_NULL;

memset(&io, 0, sizeof(io));
io.io.CB_DelInfoHeader = MITA_MAPL_DelInfoHeader;
io.io.CB_DelItem = MITA_MAPL_DelItem;
io.io.CB_GetInfoHeader = MITA_MAPL_GetInfoHeader;
io.io.CB_PutInfoHeader = MITA_NULL;
io.io.CB_GetItem = MITA_MAPL_GetItem;
io.io.CB_PutItem = MITA_NULL;
io.io.CB_Handle = hInstance;

if (!MITA_Ins_CreateObject(hInstance, &IID_DecMAPL, &hMAPLDecoder))
{
printf("ERROR: Not install cdc_mapl.dll plugin.\n");
MITA_CheckError();
return MITA_NULL;
}
MITA_Decoder_SetParam(hMAPLDecoder, MAPL_ENCPARAM_IO, &io);

///////////////////////////////////////////////////////
//你也可以选择Stream对象进行存储
FileParam.nFlag = MITA_FPF_USEPATH;
FileParam.hStream = MITA_NULL;
FileParam.lpwszPath = lpPath;

hItemArray = MITA_Array_Create(hInstance, 0, sizeof(MITA_HSOUND), MITA_FALSE);

MITA_Decoder_DecodeInfo(hMAPLDecoder, &FileParam, MITA_DIF_GETINFO, hItemArray);
MITA_CloseHandle(hMAPLDecoder);

return hItemArray;
}

void main(void)
{
MITA_HINSTANCE gInstance = MITA_NULL;
MITA_CHAR szVersion[64];
MITA_SIZE PluginCount = 0;
MITA_HINPUT hCurItem = MITA_NULL;
MITA_HOUTPUT hOutput;
MITA_HENGINE hEngine;
MITA_DWORD ChannelMask;
MITA_BYTE Key = 0;
MITA_TIME CurTime;
MITA_TIME DurTime;
MITA_DWORD cur_ms, dur_ms;
MITA_CHANNELFORMAT ChannelFmt;
MITA_STATUS Status;
MITA_HARRAY hItemArray = MITA_NULL;
MITA_SIZE CurItemIndex = 0;
MITA_SIZE TotalItem = 0;

printf(";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n");
printf(";;Copyright(C) 杭州蜜柑科技有限公司 2008 - 2011. 保留所有权利。;;\n");
printf(";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n");
printf(";;Use MAPL Example ;;\n");
printf(";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n");

//////////////////////////////////////////////////////////////////////////
//1. Create a global instance handle.
gInstance = MITA_Initialize(MITA_NULL);
MITA_CheckError();

//////////////////////////////////////////////////////////////////////////
//2. Check SDK version, this was not necessary.
MITA_GetVersionStringA(szVersion, 64);
MITA_CheckError();
printf(";;MITA: Version %s\n", szVersion);

//////////////////////////////////////////////////////////////////////////
//3. Load all existed plugins.
MITA_Ins_LoadPluginFromDir(gInstance, L"../../plugins", &PluginCount);
MITA_CheckError();
printf(";;MITA: Load %u plugins\n", PluginCount);
printf(";;Support: ;;\n");
MITA_PrintDecSupportExts(gInstance);
printf(";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n");

//////////////////////////////////////////////////////////////////////////
//4. Create Engine Object
MITA_Engine_Create(gInstance, MITA_ENGINEFLAG_CHECKPREPARE|MITA_ENGINEFLAG_CHECKRENDER, &hEngine);
MITA_CheckError();

//////////////////////////////////////////////////////////////////////////
//5. Create Output Source
MITA_GuessChannelMode(8, &ChannelMask);
hOutput = MITA_CreateDefaultOutput(gInstance, ChannelMask);

//////////////////////////////////////////////////////////////////////////
//6. Add source to engine.
MITA_Engine_AddSource(hEngine, hOutput);
MITA_CheckError();
MITA_Output_Startup(hOutput);
MITA_CheckError();

//////////////////////////////////////////////////////////////////////////
//7. Load input source
{
_try_again:
printf("\nPress S to save MAPL.\n");
printf("Press L to load MAPL.\n");
printf("Press C to continue.\n");
printf("Press Esc to exit \n");
Key = MITA_EnterKey();
switch (Key)
{
case 'c':
case 'C':
break;
case 'l':
case 'L':
{
if (hItemArray)
{
MITA_DeleteSoundArray(hItemArray);
hItemArray = MITA_NULL;
}
hItemArray = MITA_LoadMAPL(gInstance, L"../Media/test.mapl");
if (hItemArray)
MITA_PrintSoundArray(hItemArray);
}break;
case 's':
case 'S':
{
if (hItemArray)
{
MITA_DeleteSoundArray(hItemArray);
hItemArray = MITA_NULL;
}
////////////////////////////////////////////////////////
//MAPL not has MITA_DF_DIRECTPARSE flag.
// So the parser will auto skip check mapl format file.
//If you want to use MAPL, then please write your own
// MAPL codec callbacks.
hItemArray = MITA_PraseDirectory(gInstance, L"..\\Media", MITA_TRUE);
if (hItemArray)
{
MITA_PrintSoundArray(hItemArray);
MITA_SaveMAPL(gInstance, L"../Media/test.mapl", hItemArray);
}
}break;
case 27:
goto _end;
break;
}
if (!hItemArray)
{
printf("ERROR: Not load item set, please try again.\n");
goto _try_again;
}
}
TotalItem = MITA_Array_GetCount(hItemArray);
{
MITA_HSOUND hSound;

/////////////////////////////////////////////////////
//阻止MITA_Engine_DeleteSource自动移除hSound对象
for (CurItemIndex = 0; CurItemIndex < TotalItem; CurItemIndex++)
{
MITA_Array_Get(hItemArray, CurItemIndex, &hSound);
MITA_Sound_ReadOnly(hSound, MITA_TRUE);
}
CurItemIndex = 0;

MITA_Array_Get(hItemArray, CurItemIndex, &hSound);
MITA_Input_LoadBySound(gInstance, hSound, &hCurItem);
MITA_Engine_AddSource(hEngine, hCurItem);
MITA_Input_Play(hCurItem, MITA_NULL);
}

printf("\n");
printf("Press O to prev sound.\n");
printf("Press P to next sound.\n");
printf("Press Esc to exit\n");
do
{
if (kbhit())
{
Key = getch();

switch (Key)
{
case 'o':
case 'O':
{
//////////////////////////////////////////////////
//To Prev
MITA_HSOUND hSound;
MITA_Engine_DeleteSource(hEngine, hCurItem); //Delete Current Source
CurItemIndex = (CurItemIndex-1+TotalItem)%TotalItem; //Move to prev source
MITA_Array_Get(hItemArray, CurItemIndex, &hSound);
MITA_Input_LoadBySound(gInstance, hSound, &hCurItem); //load new source
MITA_Engine_AddSource(hEngine, hCurItem);
MITA_Input_Play(hCurItem, MITA_NULL);
}break;
case 'p':
case 'P':
{
//////////////////////////////////////////////////
//To Next
MITA_HSOUND hSound;
MITA_Engine_DeleteSource(hEngine, hCurItem); //Delete Current Source
CurItemIndex = (CurItemIndex+1)%TotalItem; //Move to next source
MITA_Array_Get(hItemArray, CurItemIndex, &hSound);
MITA_Input_LoadBySound(gInstance, hSound, &hCurItem); //load new source
MITA_Engine_AddSource(hEngine, hCurItem);
MITA_Input_Play(hCurItem, MITA_NULL);
}break;
}
}

MITA_Source_GetStatus(hCurItem, &Status);
MITA_Source_GetCurTime(hCurItem, &CurTime);
MITA_Input_GetDuration(hCurItem, &DurTime);
MITA_Input_GetChannelFormat(hCurItem, &ChannelFmt);
MITA_Time_Cvt(&ChannelFmt, &CurTime, MITA_TIMEUNIT_MICRSECOND, &CurTime);
MITA_Time_Cvt(&ChannelFmt, &DurTime, MITA_TIMEUNIT_MICRSECOND, &DurTime);
cur_ms = (MITA_DWORD)MITA_Time_GetData(CurTime);
dur_ms = (MITA_DWORD)MITA_Time_GetData(DurTime);

printf("%10s %02u:%02u:%02u/%02u:%02u:%02u [%u channels][%u/%u]\r", Status==MITA_STATUS_RUNNING?"playing":(Status==MITA_STATUS_PAUSE?"pause":"stop"),
cur_ms / 1000 / 60,
cur_ms / 1000 % 60,
cur_ms / 10 % 100,
dur_ms / 1000 / 60,
dur_ms / 1000 % 60,
dur_ms / 10 % 100,
MITA_CHNFMT_GetNum(ChannelFmt.mask), CurItemIndex+1, TotalItem);
if (Status == MITA_STATUS_IDLE)
{
//////////////////////////////////////////////////
//To Next
MITA_HSOUND hSound;
MITA_Engine_DeleteSource(hEngine, hCurItem); //Delete Current Source
CurItemIndex = (CurItemIndex+1)%TotalItem; //Move to next source
MITA_Array_Get(hItemArray, CurItemIndex, &hSound);
MITA_Input_LoadBySound(gInstance, hSound, &hCurItem); //load new source
MITA_Engine_AddSource(hEngine, hCurItem);
MITA_Input_Play(hCurItem, MITA_NULL);
}

Sleep(10);
} while (Key != 27);

_end:
MITA_Engine_DeleteSource(hEngine, hCurItem);
MITA_DeleteSoundArray(hItemArray);
MITA_CloseHandle(hEngine); //Release Engine Object
MITA_CloseHandle(gInstance); //Release global instance handle.
}

#pragma warning(pop)

带列表的flash视频播放器带源码 里面有fla格式的源文件,可改样式 里面有媒体文件,下载直接可用 立即下载

相关推荐

易语言播放器连续播放列表源码

易语言播放器连续播放列表源码。@易语言代码编写例子。

英雄联盟LOL静态HTML网页制作模板DⅣ+CSS学生网页作品代码游戏题材大学生网页设计作业下载

HTML5期末大作业:动漫网站设计——迪斯尼公主(6页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码 常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 明星、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 军事、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他 等网页设计题目, A+水平作业, 可满

qq___365392777的博客 7487

【STM32】CubeMx系列教程之移植FreeRTOS

本文详细介绍了在STM32F429上通过CubeMX工具移植FreeRTOS的方法。主要内容包括:1)配置系统时钟源,将TIM1替换SysTick作为时钟基准;2)FreeRTOS的创建与配置,包括任务创建、堆栈大小设置等;3)关键配置参数说明,如堆大小建议设为RAM的50%-70%;4)常用函数如堆栈监控、任务挂起/恢复等。文章提供了从基础配置到深入优化的完整移植指南,适合STM32开发者参考使用。

JackieJin123的博客 785

html5实现视频列表js代码,JavaScript实现html5视频播放器列表

本文将使用HTML5提供的 VideoAPI做一个自定义的视频列表播放器(重点放在视频的顺序播放,列表切换上,并不重新定义控制条)。一、插入视频如果不加上controls属性将不会显示控制条二、HTML结构播放列表进球瞬间胜利庆祝进球瞬间胜利庆祝进球瞬间胜利庆祝 < > 三、js部分1. 首先获取或定义一些需要用到的变量var video = document.getElementB...

weixin_31083901的博客 2604

解决Cursor AI工具地域限制报错的方法与原理

地理围栏(GEO-fencing)是现代云服务常用的访问控制技术,通过IP地址库匹配、支付系统验证等方式实现区域限制。在AI编程工具领域,这种技术常导致类似Cursor出现的'unsupported country region'报错。从技术实现看,服务商会综合HTTP头信息、时区设置等多维度数据进行地理位置判断。开发者可通过调整网络出口、配置本地模型或使用企业版等方案解决。本文以Cursor为例,详细分析了AI工具地域限制的底层原理,并提供了包括Ollama本地部署在内的多种工程实践方案,特别适合需要稳定

weixin_30820077的博客 925

泛微E9表单建模查询列表勾选后带入流程明细表中

注意:参照下图各项配置,否则会有问题。

泛微二次开发后端知识总结 5307

易语言在线播放器源码php,易语言写出自绘播放器列表

播放器基本的写法顺序.程序集 窗口程序集1.程序集变量 文件号, 整数型.程序集变量 mp3, 文本型, , "0".程序集变量 选项, 文本型.子程序 __启动窗口_创建完毕.局部变量 文件名, 文本型组合框1.加入项目 (“请选歌曲”, )按钮2.标题 = “播放”选项 = “重复”文件名 = 寻找文件 (取运行目录 () + “\*.mp3”, ).循环判断首 ()文件名 = 寻找文件 (,...

weixin_39527078的博客 966

机器视觉避坑指南:为什么你的Halcon划痕检测总漏检?(附优化方案)

本文深入剖析了Halcon在表面划痕检测中漏检率高的常见原因,如灰度值波动、噪声干扰及形态学参数设置不当。针对复杂背景与低对比度划痕,提出了超越官方例程的多尺度纹理分析与特征融合优化方案,旨在帮助开发者构建更鲁棒、稳定的机器视觉检测流程,有效提升检出率。

weixin_29057163的博客 234

【前端源码】 如何用HTML CSS和JavaScript制作一个响应式视频播放列表cid1190+源码下载

【前端源码】 如何用HTML CSS和JavaScript制作一个响应式视频播放列表cid1190+源码下载 [源码下载地址](https://code.5g-o.com/archives/4797.html 在新演示地址 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=

zwxic的博客 922

基于Ansys Fluent 的颗粒分离/过滤解决方案

过滤是指通过特殊装置将颗粒移除,将流体提纯净化的过程。过滤的方式很多,应用的物系也很广泛,固-液、固-气、大颗粒-小颗粒等。

sh_djoin的博客 1852

小黄鸭机器人技术全解-第 07 章 关节自由度与行程参数

—鸭子歪着头转头时,转的平面是斜的,这正是它"灵动"感的来源。仿真里这是自动的(轴定义在父刚体系),复刻时不需要做任何事——

yolo模型训练找我,AI游戏合作找我 61

【博主推荐】html好看的音乐播放器(附源码)

html好看的音乐播放器,音乐播放器源码,html音乐播放器源码,html音乐播放器界面,html音乐播放器,音乐播放器。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 1万+

PVE虚拟机运行不流畅,出现卡顿。

🏆本文收录于《优快云问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 3061

推荐一款列表视频播放器的源码DKPlayer(包含抖音播放形式)

github地址:https://github.com/dueeeke/DKVideoPlayer 最近一个项目要求有视频播放并且指明要抖音的播放形式,于是就到github里面找找看,还真找到一款符合预期的,并且嵌入简单,不光包含抖音列表播放形式还包含列表播放类似腾讯新闻视频播放的列表形式,功能图: ...

冰天糖葫芦的博客 9090

akamai3简单分析

akamai流程的简单分析

记录一些web逆向的过程 916

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

css 视频播放列表,jquery结合CSS实现的多样式多视频列表连播效果源码

jquery结合CSS实现的多样式多视频列表连播效果源码是一段实现了右侧缩略图片+文字列表显示所有视频、右侧文字列表显示所有视频及底部缩略图片+文字列表显示所有视频三种样式的视频连播效果代码,本段代码适应于所有网页使用,有需要的朋友们可以前来下载使用。本段代码兼容目前最新的各类主流浏览器,是一款非常优秀的特效源码。如果大家非常好奇该段代码所带来的动画效果的话,可以点击【演示地址】进行预览哦,小编建...

weixin_27210125的博客 1714

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C/C++ 循环语句的优化

主题:for,do while,while的使用C代码:void test_for_and_while(){ int i, j = 0; for (i = 0; i {  d_printf(""); } for (i = 100; i>=0; i--) {  d_printf(""); } i=100; do {  d_printf(""); }while (--i); i =

D-Y-W-DIY-? 2841

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

关于2D游戏编程-粒子系统(雪)的实现

读了那篇文章后自己也去动手,嘿嘿,没想到真的做出来了,可惜不是很好,但是还算可以看的过去…… 下雪,对于我们北方的朋友来说一定很熟悉了,南方的朋友也一定从电视等等看过了吧,嘿嘿,下雪的时候还是挺美的,这么大了,还没有仔细的看过下雪呢,=。=,请勿见笑!好了开始正题了…… (-)特征描述 (1)雪花有不同的形状或大小 (2)雪花不是直线落下的,受空气阻力会到处飘荡 (3)雪花受空气阻力不同,其下落速

D-Y-W-DIY-? 2393

游戏中bmp图片文件的读取

用DirectX SDK 显示图片,一个是从文件读取BMP文件,一个是从内存中读取文件(为了打包文件读取文件的实现),我曾经测试过,调用这个函数读取图片文件比系统自带的要速度快,可惜我没有写完整,现在只支持24真彩色bmp图片,因为我的游戏是在32位下运行的,以后在添加了…… 参数说明:lpDDSTemp 目标页面 filename 文件名 isColorKey 是否有透明色 color_key

D-Y-W-DIY-? 2336

让你的代码在 main 或者 WinMain 之前执行!

Initialize your framework before main and WinMain, release your function after main and WinMain.

D-Y-W-DIY-? 2219

AT24C02,04,08... 系列MC51单片机驱动程序

头文件: #ifndef _AT24C_EEPROM_Driver_H#define _AT24C_EEPROM_Driver_H#include #include #include "IIC_BUS_Driver.h" //Depended I2C Bus Driver #define uchar unsigned char#define ushort unsigned sh

D-Y-W-DIY-? 1999

用ogre做图像引擎,用MITA做音频引擎做游戏的源代码1(附完整工程代码资源下载地址)

BaseApplication.h和mitademo.h两个头文件的源代码,里面有注释,有什么问题给我留言。/*-----------------------------------------------------------------------------Filenam

D-Y-W-DIY-? 1973

使你的代码变得更加美观,易读

  无意中看了很多代码,大家往往为了更加方便,轻松,而使代码的可读性下降,可读性很重要,无论是对你或者是看你代码的别人。可以这样想,假如过了几年,无意中翻到以前写的代码,你能确保在读懂它的意思吗?同样,也要确保别人也能读懂。在软件工程中,团队合作是很重要的,成员之间的交流更为之重,交流当中也包含了代码的浏览,所以一定要保证代码的美观。 第一: 熟练使用typedef 1. type

D-Y-W-DIY-? 1616

用ogre做图像引擎,用MITA做音频引擎做游戏的源代码3(附完整工程代码资源下载地址)

关键的处理代码都写在mitademo.cpp里面了。里面有注释,大家有什么问题给我留言。/*-----------------------------------------------------------------------------Filename: mita

D-Y-W-DIY-? 1468

谈谈C,C++内存申请器 [1]

谈谈C,C++内存申请器 之 一

D-Y-W-DIY-? 1354

对某个女孩“恋爱”代码的改进

曾经一个女孩写的代码: result love(boy, girl) {-   if ( boy.有房() and boy.有车() )    {-     boy.set(nothing);     return girl.嫁给(boy);   }   if ( girl.愿意等() )   {-    while( ! (boy.赚钱 > 100,000 and girl.感情 > 8 )  

D-Y-W-DIY-? 1288
上一篇: 使用音频引擎MITA处理音频文件tag的源代码
下一篇: 计算机设备常用词汇
Debug_Today
博客等级 码龄19年 31粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值