ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

给WAV文件添加标签神器,添加标签支持各国语言

给WAV文件添加标签神器,添加标签支持各国语言 适用于win10 ——win11一个可以将所有WAV文件加音乐标签的工具例如AOA-뚜뚜뚜.wav,先将其命名成非unicode名称例如123.wav,然后用工具打开123.wav,就可以添加音乐标签属性了标签添加成功后会生成123_list.wav这个就是又音乐标签的文件了你可以重新命名位AOA-뚜뚜뚜.wav到此就成功了。以下是部分代码Option Explicit Unicode(UTF16) - MultiByte(UTF8) APIPrivate Declare Function WideCharToMultiByte Lib kernel32.dll (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByVal lpMultiByteStr As Long, ByVal cbMultiByte As Long, ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As LongPrivate Declare Function MultiByteToWideChar Lib kernel32 (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As Long, ByVal cbMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As LongPrivate Declare Sub RtlMoveMemory Lib kernel32 (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)Private Declare Function PathFileExistsW Lib shlwapi.dll (ByVal lpathfile As Long) As Boolean 常量定义Private Const WC_NO_BEST_FIT_CHARS As Long H400Private Const CP_UTF8 As Long 65001Dim lpWav As String 输入VB6原生字符串(UTF16) 输出UTF8编码的Byte数组Public Function UnicodeToUTF8(ByVal strUnicode As String) As Byte()Dim lngStrLen As LongDim lngBufSize As LongDim abytUTF8() As Byte 源字符串长度字符数lngStrLen Len(strUnicode)If lngStrLen 0 ThenReDim UnicodeToUTF8(-1) 返回空数组Exit FunctionEnd If 第一步获取需要的UTF8缓冲区大小lngBufSize WideCharToMultiByte( _CP_UTF8, WC_NO_BEST_FIT_CHARS, _StrPtr(strUnicode), lngStrLen, _0, 0, 0, 0)If lngBufSize 0 ThenReDim UnicodeToUTF8(-1)Exit FunctionEnd If 分配字节数组ReDim abytUTF8(1 To lngBufSize) 第二步真正转换到字节数组Call WideCharToMultiByte( _CP_UTF8, WC_NO_BEST_FIT_CHARS, _StrPtr(strUnicode), lngStrLen, _VarPtr(abytUTF8(1)), lngBufSize, _0, 0)UnicodeToUTF8 abytUTF8End FunctionPublic Function UnicodeToUTF8_BOM(ByVal s As String) As Byte()Dim raw() As ByteDim out() As ByteDim I As Long, rawLen As Longraw UnicodeToUTF8(s) 空判断If Not Not raw ThenrawLen UBound(raw)ElseReDim UnicodeToUTF8_BOM(-1)Exit FunctionEnd If BOM 3字节 raw全部字节ReDim out(1 To 3 rawLen)out(1) HEFout(2) HBBout(3) HBF 逐字节拷贝For I 1 To rawLenout(3 I) raw(I)Next IUnicodeToUTF8_BOM outEnd FunctionPublic Sub SaveAsUTF8(ByVal sText As String, ByVal sFilePath As String)Dim bUTF8() As ByteDim fNum As IntegerbUTF8 UnicodeToUTF8(sText)fNum FreeFileOpen sFilePath For Binary As #fNumPut #fNum, , bUTF8Close #fNumEnd SubPublic Function BytesToHex(bArr() As Byte) As StringDim I As LongDim sOut As StringFor I LBound(bArr) To UBound(bArr)sOut sOut Right(00 Hex(bArr(I)), 2) NextBytesToHex Trim(sOut)End FunctionForm CommndPrivate Sub CD_Click()Dim lW As String, LstD() As Byte, Dt() As String, LstStr As String, lD As StringOn Error GoTo Err_xlpWav GetFilePaths(Form1.hWnd, 打开WAVE文件, WAV文件|*.WAV|, Explorer窗口, App.Path, Chr(0))lpWav Left(lpWav, InStrRev(lpWav, Chr(0)) - 1)T.Text GetHeadInfoMsg lpWav, LstD, lW, lDDat wH.ChunkID | wH.ChunkSize | wH.Format | _wH.SubChunk1ID | wH.SubChunk1Size | _wH.AudioFormat | wH.NumChannels | wH.BitsPerSaple | wH.BlockAlign | wH.SapleRate | wH.ByteRate | _wH.SubChunk2ID | wH.SubChunk2Size//MsgBox UBound(LstD)Dt Split(lW, |)If UBound(Dt) 12 ThenLstStr 文件类型: Dt(0) vbCrLf 文件大小(字节): Dt(1) vbCrLf 文件格式: Dt(2) vbCrLf Fmt标示: Dt(3) vbCrLf _数据备注是(16)否(16): Dt(4) vbCrLf 音频编码方式(Pcm1): Dt(5) vbCrLf 声道: Dt(6) vbCrLf 采样位数: Dt(7) vbCrLf _采样字节数: Dt(8) vbCrLf 采样频率: Dt(9) vbCrLf 文件码率(kbps): (Val(Dt(10)) * 8 \ 1000) vbCrLf 架构方式: Dt(11) vbCrLf _LIST/DATA长度(字节): Dt(12) vbCrLfIf UCase(Dt(11)) DATA ThenLstStr LstStr 时间(秒): CLng(Dt(12)) / ((CLng(Dt(9)) * Val(Dt(7)) * Val(Dt(6))) / 8)ElseDim St() As StringSt Split(lD, |)If UBound(St) 0 Then LstStr LstStr lD vbCrLf 时间(秒): Val(St(1)) / ((CLng(Dt(9)) * Val(Dt(7)) * Val(Dt(6))) / 8)End IfEnd IfLIST结构信息Dim Dat() As ByteReDim Dat(UBound(LstD) - 4) As ByteGetWantData LstD, Dat, 4, UBound(LstD) - 4LstStr LstStr vbCrLf vbCrLf LIST架构信息 vbCrLf INFO vbCrLf GetWavListKey(Dat)T.Text Replace(LstStr, Chr(0), ) vbCrLf 文件路径: lpWav End IfExit SubErr_x:T.Text LstStr vbCrLf 文件路径: lpWavEnd SubPublic Function GetXFontSize(ByVal XF As Form, ByVal THeight As Long) As LongDim I As Long, X(1 To 32) As LongFor I 1 To 32XF.ScaleMode 3XF.Font.Size IIf XF.TextHeight(H) THeight ThenGetXFontSize IEnd IfNextIf GetXFontSize 0 ThenFor I 1 To 32XF.ScaleMode 3XF.Font.Size IIf XF.TextHeight(H) THeight And I 1 ThenX(I) XF.TextHeight(H)If X(I - 1) THeight ThenGetXFontSize IIf(X(I) - THeight THeight - X(I - 1), I, I - 1)End IfExit ForEnd IfNextEnd IfEnd FunctionPrivate Sub CmdI_Click()Dim LDI(2) As LSTDATAINFO, Ls(2) As VariantLDI(0).ID ICRDLDI(0).Size 26Ls(0) UnicodeToUTF8(Year(Now) - Format(Month(Now), 00) - Format(Day(Now), 00) T Format(Hour(Now), 00) : Format(Minute(Now), 00) : Format(Second(Now), 00) 08:00 Chr(0))LDI(1).ID INAMLDI(1).Size 6Ls(1) UnicodeToUTF8(XiaYU Chr(0))LDI(2).ID ISFTLDI(2).Size 13Ls(2) UnicodeToUTF8(Lavf60.4.100 Chr(0))Dim lpOut As StringlpOut Left(lpWav, InStrRev(lpWav, .) - 1) _list.wavCreateListWaveFile lpWav, lpOut, LDI, LsEnd SubPrivate Sub Command1_Click()Dim LDI(4) As LSTDATAINFO, Ls(4) As VariantIf IT(1).Text 标题 Or IT(1).Text Or IT(0).Text 艺术家 Or IT(0).Text Or IT(2).Text 专辑 Or IT(2).Text Then Exit SubIf CB(0).Text 中日英文字 ThenLs(0) UnicodeToUTF8(IT(0).Text Chr(0))LDI(0).Size Val(UBound(UnicodeToUTF8(IT(0).Text Chr(0))))ElseLs(0) UnicodeToUTF8_BOM(IT(0).Text Chr(0))LDI(0).Size Val(UBound(UnicodeToUTF8_BOM(IT(0).Text Chr(0))))End IfIf CB(1).Text 中日英文字 ThenLs(1) UnicodeToUTF8(IT(1).Text Chr(0))LDI(1).Size Val(UBound(UnicodeToUTF8(IT(1).Text Chr(0))))ElseLs(1) UnicodeToUTF8_BOM(IT(1).Text Chr(0))LDI(1).Size Val(UBound(UnicodeToUTF8_BOM(IT(1).Text Chr(0))))End IfIf CB(2).Text 中日英文字 ThenLs(2) UnicodeToUTF8(IT(2).Text Chr(0))LDI(2).Size Val(UBound(UnicodeToUTF8(IT(2).Text Chr(0))))ElseLs(2) UnicodeToUTF8_BOM(IT(2).Text Chr(0))LDI(2).Size Val(UBound(UnicodeToUTF8_BOM(IT(2).Text Chr(0))))End IfIf CB(3).Text 中日英文字 ThenLs(3) UnicodeToUTF8(IT(3).Text Chr(0))LDI(3).Size Val(UBound(UnicodeToUTF8(IT(3).Text Chr(0))))ElseLs(3) UnicodeToUTF8_BOM(IT(3).Text Chr(0))LDI(3).Size Val(UBound(UnicodeToUTF8_BOM(IT(3).Text Chr(0))))End IfLDI(0).ID IARTLDI(1).ID INAMLDI(2).ID IPRDLDI(3).ID IGNRLDI(4).ID ISFT IGNRLDI(4).Size 13Ls(4) UnicodeToUTF8(Lavf60.4.100 Chr(0)) StrConv(IT(3).Text, vbUnicode)Dim lpOut As StringlpOut Left(lpWav, InStrRev(lpWav, .) - 1) _list.wavCreateListWaveFile lpWav, lpOut, LDI, LsEnd SubPrivate Sub Command2_Click()Dim lpOut As StringlpOut Left(lpWav, InStrRev(lpWav, .) - 1) _nolist.wavCreateNoListWaveFile lpWav, lpOutEnd SubPrivate Sub Form_Load()Dim I As ByteFor I 0 To 3CB(I).AddItem 中日英文字CB(I).AddItem 其他文字CB(I).Text 中日英文字NextEnd SubJudge ID rulePrivate Function GetRuleID(ByVal ID As String) As BooleanDim I As Integer, StrX As String, Str3 As StringFor I 1 To 4StrX Mid(ID, I, 1)If I 3 ThenIf Asc(StrX) 65 Or Asc(StrX) 122 ThenGetRuleID False: Exit ForElseGetRuleID TrueEnd IfElseStr3 Left(ID, 3)If (Asc(StrX) 65 Or Asc(StrX) 122) ThenIf UCase(Str3) FMT And Asc(StrX) 32 ThenGetRuleID TrueElseGetRuleID False: Exit ForEnd IfElseGetRuleID TrueEnd IfEnd IfNextEnd FunctionGET LIST INFOPrivate Function GetWavListKey(Dat() As Byte) As StringDim wBt() As Byte, LDI As LSTDATAINFO, StepX As Integer, TmpStr As String, ID As StringOn Error GoTo Err_INFDo Until StepX UBound(Dat)GetWantData Dat, wBt, StepX, 8RtlMoveMemory LDI, wBt(0), 8Erase wBtID LDI.IDIf GetRuleID(ID) False ThenStepX StepX 1GetWantData Dat, wBt, StepX, 8RtlMoveMemory LDI, wBt(0), 8Erase wBtElseTmpStr TmpStr LDI.ID TmpStr Replace(TmpStr, Chr(0), )StepX StepX 8GetWantData Dat, wBt, StepX, Val(LDI.Size)TmpStr TmpStr Utf8ToStr(wBt, LDI.Size) vbCrLfErase wBtStepX StepX Val(LDI.Size)If StepX UBound(Dat) Then Exit DoEnd IfLoopGetWavListKey TmpStrExit FunctionErr_INF:GetWavListKey End Function--- UTF-8 Byte数组 → VB6 Unicode String ---Private Function Utf8ToStr(b() As Byte, ByVal Length As Long) As StringDim Ws As String, Rtn As LongIf Length 0 Then Exit FunctionWs Space$(Length) MultiByteToWideChar CP_UTF865001Rtn MultiByteToWideChar(65001, 0, VarPtr(b(0)), Length, StrPtr(Ws), Length)Utf8ToStr Left(Ws, Rtn)End Function工具下载https://www.0xaa55.com/forum.php?modattachmentaidODExOHw4YmUzM2E5MHwxNzg5MTE3ODY1fDkzNzd8Mjc5OTM%3D
返回列表