VB.NET hace una pregunta, cree un programa de recordatorio de tono de llamada programado, cómo hacer referencia al tono de llamada en el programa, escriba el código, ¿agrega el código en el temporizador?
deal wav . mcisendstring " open " amp; sA amp "alias wav", sB, Len(sB), 0
DealWav.mciSendString "reproducir wav ", sB, Len( sB), 0
DealWav.mciSendString "close wav ", sB, Len(sB), 0
Enviarle el módulo de transacción
Dim WAVBuffer() Como Bytes
Dim DataLenOut es largo
Dim Datapos1 es tan largo
Dim Datapos2 es largo
Dim ChunkLen tan largo
Dim factpos As Long
PCMWAVEFORMAT tipo 'definición de formato PCM estándar.
WFormatTag es un identificador de formato entero, que distingue diferentes formatos, y PCM es 1.
Nchannelas entero 'Número de canales de audio, mono es 1, estéreo es 2.
nsampleseclong 'El número de muestras por segundo, es decir, la frecuencia de muestreo.
Las frecuencias de muestreo estándar son 8.000 kHz, 11.025 kHz,
22.050 kHz, 44.100 kHz, etc.
navgbytes es el número de bytes por segundo de long ', que es la velocidad de datos.
Velocidad de datos = número de canales × frecuencia de muestreo × tamaño de muestreo/8
NBlockAlign As Integer 'Alineación de bloque, que es la unidad más pequeña de datos de forma de onda.
Alineación de bloques = número de canales × tamaño de muestreo/8
El número de bits por muestra, es decir, el tamaño de la muestra.
Hay dos tamaños de muestra: 8 bits y 16 bits.
Tipo de fin
Encabezado de onda especializado
stri riff como cadena * 4 ' 00 H4 char símbolo "riff"
LngFileLen As Long ' 04H 4 long int longitud del archivo
Strwave como cadena * 4' 08H4 símbolo "wave" de caracteres
StrFmt como cadena * 4' 0CH 4 caracteres logotipo "fmt"
Byte de conversión Lngttmpas long' 10h4 (indefinido)
El formato int es la categoría de formato 14h2int de entero (10H son datos de sonido PCM).
IntChan es un número entero de canal '16H 2 int, el canal mono es 1 y el canal dual es 2.
IntFreq As Long' 18H Frecuencia de muestreo de 2 int (número de muestras por segundo), que indica la velocidad de reproducción de cada canal.
lngsendspeed as long ' 1 La velocidad de transmisión de datos de audio de forma de onda CH4 long int es el número de canales × bits de datos por segundo × bits de datos por muestra / 8. El software de reproducción puede utilizar este valor para estimar el tamaño del búfer.
El número de ajuste de intBlock es el bloque de datos int 20H 2 de Integer (calculado en bytes), y su valor es el número de canales × el valor del bit de datos de cada muestra/8.
El software de reproducción necesita usar este valor para procesar varios bytes de datos a la vez, de modo que su valor pueda usarse para el ajuste del búfer.
IntBit As Integer' 22H 2El número de bits de datos por muestra indica el número de bits de datos por muestra en cada canal. Si hay varios canales, el tamaño de la muestra es el mismo para cada canal.
StrData As String * 4' 24H Etiqueta de datos de 4 caracteres "Data"
Datos de voz largos con una duración de 28 horas.
Tipo de finalización
Función de declaración pública sndPlaySound Lib "winmm" alias "sndPlaySoundA" (ByVal lpszSoundName es String, ByVal uFlags es Long) es Long
Movimiento de bandera
Const pública SND_SYNC = amp Hipótesis nula
Const pública SND_ASYNC = ampH1
Construcción pública SND_NODEFAULT = amp Deuterio
Const pública SND _ MEMORIA = ampH4
Const pública SND _ LOOP = ampH8
Const pública SND _ NOSTOP = ampH10
Función de declaración privada PlaySound Lib" winmm . dll" alias " PlaySoundA" (ByVal lpszName es String, ByVal hModule es Long, ByVal dwFlags es Long) es Long
Función de declaración pública mciSendString Lib "winmm dll" alias "mciSendStringA" (ByVal lpstrCommand es String, ByVal lpstrReturnString es. String, ByVal uReturnLength es Long, ByVal hwndCallback es Long) es Long
La función de declaración pública MCI ejecuta Lib " winmm . dll "(ByVal lpstrCommand As String) es Long
Declara la función PlaySound Lib "winmm . dll" alias "PlaySoundA" (ByVal lpszName es String, ByVal hModule es Long, ByVal dwFlags es Long) como Long
public Declare Sub RtlMoveMemory Lib "kernel 32" (lpv dest como cualquiera , lpvSource como cualquiera, ByVal cbCopy As Long)
Subcomando privado 1_Click()
Para evitar que dos archivos wav seleccionados aleatoriamente tengan formatos diferentes, simplemente repito el mismo archivo dos veces.
enlace wav "C:\WINNT\Media\ringout.wav", "C:\WINNT\Media\ringout.wav", "f:\temp.wav"
Conector final
Función privada getWavHead (strFileName en forma de cadena) como encabezado de onda
Obtener encabezado de archivo
Dim iFreeFile
iFreeFile = FreeFile ()
Ir al identificador de errores en caso de error
Atenuar mi cabeza hasta convertirla en una cabeza de onda
Abrir strFileName del archivo binario como #iFreeFile
p>Obtener #iFreeFile,,MyHead
Cerrar #iFreeFile
getWavHead = MyHead
Identificador de error:
Finalizar función
p>
enlace de función pública wav(str filename 1 es una cadena, strFileName2 es una cadena, strOutFile es una cadena) es un valor booleano
Atenúa la cabeza hacia adelante hasta convertirla en una cabeza de onda
p>
Oscurecer el encabezado como el encabezado de onda
El encabezado del nuevo archivo.
Dim Data1() son bytes
Dim Data2() son bytes
Dim es tan largo como yo
LinkWav = False
Obtener el título
head first = getWavHead(strfilename 1)
head next = getWavHead(strfilename 2)
Comparación de encabezados de archivos
Aquí es necesario comparar los dos cabezales. Si la frecuencia de muestreo, el número de canales, etc. son inconsistentes, no se puede establecer la conexión.
Me da pereza hacer esta comprobación. Si quieres aplicarlo en la práctica, debes completar este código.
Crear un nuevo título
HeadNew = headFirst 'Copiar un encabezado primero.
head new .lngfilelen = head first . lngdatalenth head next .lngdatalenth 37
La longitud del archivo es igual a la longitud de los datos de los dos archivos más la longitud del encabezado del archivo. ¿Por qué 37? ¡Yo tampoco lo entiendo! La longitud total del encabezado es 44, sin los 4 bytes y los indicadores de riff de 4 bytes, la longitud del archivo debe ser 36 wow. Pero abres un archivo wav y restas el campo de longitud de datos del campo de longitud del archivo, y es 37. Lo pensé durante mucho tiempo y no pude entenderlo. ¡Finalmente cedí y escribí 37 aquí! (
head new . lngdatalenth = head first . lngdatalenth head next . lngdatalenth
La longitud del segmento de datos es la suma de los datos en los dos archivos.
Lo siguiente son operaciones de archivos. Para acelerar la codificación y reducir el daño a las células cerebrales, el siguiente código es muy ineficiente y usted mismo puede optimizarlo.
Sería terrible si utilizara directamente el siguiente código para recomendarle que no lea archivos que sean demasiado grandes ~ ~
¡Lea datos de dos archivos! !
ReDim datos 1 (cabeza primero . lngdatalenth-1)
abre strfilename 1 para aleatorio como # 1 Len = 1
Abre strFileName1 para archivo binario como # 1
Para i = 0 a headFirst.lngDataLenth - 1
Obtenga #1, 45 i, Data1(i)
Luego
Cerrar #1
ReDim datos 2 (encabezar siguiente . lngdatalenth-1)
abrir strfilename 2 para aleatorio como # 1 Len = 1
Abrir strfilename 2 Para binario como # 1 ' Len = 1
Para i = 0 a headNext.lngDataLenth - 1
Obtenga #1, 45 i, Data2(i)
Luego
Cierre #1
Comience a escribir datos
Abra strOutFile para aleatorio como #1 Len = 1
Abra con #1 strOutFile para archivos binarios
' Put #1, headNew 'Escribe el encabezado del archivo en el archivo.
Cerrar #1
Abrir strOutFile para aleatorio como #1 Len = 1
Para i = 0 al límite inferior (datos 1)
"Put #1, 45 i, Data1(i)" escribe el primer registro en el archivo.
Luego
Para i = 0 al límite inferior (Datos2)
Coloque #1, Datos2(i)' escribe el primer registro en el archivo.
Entonces
' Cerrar #1 'Cierra el archivo.
Finalizar función
Fusionar dos archivos de sonido WAV.
Función pública WavMerge como variable (Wave1() como byte, Wave2() como byte)
Dim xx As Long
Dim Y$$
1. Determine el punto de partida del bloque de datos (diferentes archivos WAV pueden ser diferentes).
Y $ lt gt"data"
y $ = Chr(onda 1(xx)) amp; chr(onda 1(xx 1)) amp; xx 2)) amp; Chr (onda 1 (xx 3))
xx = xx 1
Si xx gt entonces 1000
MsgBox "Formato desconocido"
Salir de la función
Terminará si...
Anillo
Datapos1 = (xx - 1) 8
xx = 0
Y$ = " "
Y $ lt gt"data"
y $ = Chr(onda 2(xx)) amp ;chr(onda 2(xx 1)) amp;chr(onda 2(xx 2)) amp;Chr(onda 2(xx 3))
xx = xx 1
Si xx gt entonces 1000
MsgBox "Formato desconocido"
Salir de la función
Si... terminará
Bucle
Datapos2 = (xx - 1) 8
xx = 0
Y$ = " "
2. Wave1 Contiene bloques de hechos opcionales.
factpos = 0
Y $ lt gt"fact"
y $ = Chr(onda 1(xx)) amp;chr(onda 1(xx) 1)) amp;chr(onda 1(xx 2)) amp;Chr(onda 1(xx 3))
xx = xx 1
Si xx gt entonces 1000< / p>
xx = 0
Salir Do
Terminará si...
Ring
factpos = xx - 1
Si factpos = -1, entonces factpos = 36
DataLenOut = u límite (onda 1) 1 onda de datos 1 UBound(Wave2) 1 onda de datos 2
ReDim wav buffer(factpos 19 DataLenOut)
3. Escriba el fragmento repetido combinado ("wave")...fmt...[fact]...información del título.
Rtlmovememory wavbuffer (0), Wave1 (0), factpos 'Nota: La frecuencia de muestreo, la velocidad de datos promedio, el tamaño de muestreo y el canal están sujetos a los parámetros de Wave1.
búfer wav(factpos)= Asc(" f "):búfer wav(factpos 1)= Asc(" a ")
búfer wav(factpos 2)= Asc(" c "): búfer wav(factpos 3) = Asc(" t ")
ChunkLen = 4
RtlMoveMemory búfer wav(factpos 4), ChunkLen, 4
RtlMoveMemory búfer wav(factpos 8), DataLenOut, 4
búfer wav(factpos 12)= Asc(" d "):búfer wav(factpos 13)= Asc(" a ")
búfer wav(factpos 14)=Asc(" t "):búfer wav(factpos 15)= Asc(" a ")
Búfer wav RtlMoveMemory(factpos 16), DataLenOut, 4
4. Escriba el bloque de datos fusionado (es decir, todas las muestras, primero Wave1, luego Wave2).
RtlMoveMemory WAVBuffer(factpos 20), Wave1(Datapos1), UBound(wave 1)-datos pos 1 1
RtlMoveMemory WAVBuffer(factpos 20 UBound(wave 1)-datos pos 1 1), Wave2(Datapos2), UBound(Wave2) - Datapos2 1
5 Corregir la información del encabezado RIFF
ChunkLen = UBound(WAVBuffer) - 7
RtlMoveMemory WAVBuffer(4), ChunkLen, 4
6. Fin
WavMerge = WAVBuffer
Finalizar función
Fusionar varios archivos
p>Función pública booleana f_LinkWav (cFile como colección, sOutFile como cadena)
Atenuar la cabeza hacia adelante como una onda
Atenuar la cabeza como encabezado
El encabezado del archivo nuevo.
Dim byteData() es byte
Dim iFreeFile es un entero
Dim j As Long
Dim j As Long
Atenuar iA
Atenuar lData siempre
f_LinkWav = False
iFreeFile = FreeFile()
Obtener título
p>cabeza primero = getWavHead(cFile(1))
lData = cabeza primero
ReDim retiene datos de bytes (lData)
abrir strfilename 1 para aleatorio como # 1 Len = 1
Abrir cFile(1) del archivo binario como #iFreeFile
Para i = 0 a lData
Obtener #iFreeFile, 45 i, byteData(i)
Luego
Cerrar #iFreeFile
headNew = headFirst
head new. lngfilelen = cabeza primero. lngdatalenth
cabeza nueva. lngdatalenth = cabeza primero.
Para iA = 2 a cFile. Count
headNext = getWavHead(cFile(iA))
head new. lngfilelen = head new. lngdatalenth 37
head new. head new .lngdatalenth head next . lngdatalenth
ReDim retiene los datos en bytes (lData headNext.lngDataLenth)
Abra el cFile (iA) del archivo binario como #iFreeFile 'Len = 1
Para i = 1 en headNext.lngDataLenth
Obtener #iFreeFile, 44 i, byteData(lData i)
Luego
Cerrar # iFreeFile
lData = lData head next lngdatalenth
Luego
Comience a escribir datos
Abrir para aleatorio como #1 Len = 1 strOutFile.
If Dir(sOutFile, vbNormal)>""Luego elimine el archivo suter
Abra sOutFile de forma aleatoria como #iFreeFile
Ponga #iFreeFile, headNew ' Escriba el encabezado del archivo en el archivo.
Cerrar #iFreeFile
j = UBound(byte de datos) 1
Para iA = 2 en tiempo lógico
ReDim palabra reservada SecciónDatos (UBound(byteData) j)
For i = 0 to j - 1
ByteData(j i) = byteData(i)' Escribe el primer registro en el archivo.
Luego
Siguiente iA
Abra el archivo sout de forma aleatoria como # iFreeFile Len = 1
Para i = 0 a UBound( Byte Data)
Pon #iFreeFile, 45 i, byteData(i)'Escribe el primer registro en el archivo.
Entonces
j = UBound(byte de datos)
Para iA = 2 al tiempo lógico
Para i = 0 a UBound ( byte de datos)
Pon # iffree file, 45 I J 1, bytedata (I)'Escribe el primer registro en el archivo.
Entonces
j = j UBound(byte de datos)
Entonces
' Cerrar #iFreeFile 'Cierra el archivo.
f_LinkWav = True
Finalizar función
Función pública f_MciChkEnd()
Mostrar MCIStatus como cadena * 255
Dimra
f_MciChkEnd = False
lA = mciSendString(" estado modo wav ", MCIStatus, Len(MCIStatus), 0)
Ifucase ( izquierda $ ( mcistatus, 7)) = "detenido " o izquierda $ (mcistatus, 2) = " fin ", luego f_MciChkEnd = True.
Función final
Función pública SendComReturnString(com As String)As String
Dim FeedBack es largo, ReturnString es String * 255
ReturnString = String(255, Chr(0))
FeedBack = mciSendString(com, ReturnString, 255, 0)
Si hay comentarios, entonces
Marcar s para cadena * 255
mciGetErrorString comentarios, s, 255
SendComReturnString = vbNullString
Otro
SendComReturnString = Left(ReturnString,InStr (1 , ReturnString, Chr(0)) - 1)
Terminará si...
Finalizar función