Digamos que reproduzco un archivo WAV estéreo con 317,520,000 muestras, que es teóricamente 1 hora de duración. Suponiendo que no haya interrupciones en la reproducción, ¿terminará el archivo en exactamente una hora, o hay alguna pequeña variación ocasional en la velocidad de reproducción de modo que sea un poco más o ligeramente menor (en algunos minutos) que una hora ?¿Con qué precisión (en términos de tiempo) Windows reproduce audio?
Estoy tratando de sincronizar la animación con el audio, y estoy usando un System.Diagnostics.Stopwatch
para mantener los cuadros que coincidan con el audio. Pero si la velocidad de reproducción de audio WAV en Windows puede variar ligeramente con el tiempo, el audio se desviará de sincronización con la animación impulsada por el cronómetro.
Lo que lleva a una segunda pregunta: parece que un Stopwatch
- aunque muy granular y preciso para duraciones cortas - se ejecuta un poco rápido. En mi computadora portátil, una ejecución de Stopwatch
durante exactamente 24 horas (medida por la hora del sistema de la computadora y un cronómetro real) muestra un tiempo transcurrido de 24 horas más de aproximadamente 5 segundos (no milisegundos).
¿Es este un problema conocido con Stopwatch
? (Una pregunta relacionada sería "¿estoy loco?", Pero puedes intentarlo por ti mismo). Dado su uso como una herramienta de diagnóstico, puedo ver dónde una discrepancia como esta solo aparece cuando se miden duraciones largas, para lo cual la mayoría las personas usarían algo distinto de Stopwatch
.
Si tengo mucha suerte, tanto la Stopwatch
como la reproducción de audio son impulsadas por el mismo mecanismo subyacente y, por lo tanto, permanecerán sincronizados durante días enteros. ¿Hay alguna posibilidad de que esto sea cierto?
actualización: acabo de hacer los cálculos, y si Stopwatch
derivas por 5 segundos de más de 24 horas, esto significa que va a la deriva por 10 milisegundos después de tan sólo 172 segundos. Entonces, en 3 minutos, la animación comenzará a estar perceptiblemente fuera de sincronización.
Estoy experimentando periódicamente (cada 10 segundos más o menos) reiniciando el temporizador de la devolución de llamada waveOutWrite, pero esto no está funcionando porque el siguiente conjunto de eventos del temporizador se compensa con la inexactitud del devolución de llamada pasó a ser. Apesta ser yo.
¿Cómo sabe que su "cronómetro real" no está funcionando un poco lento? –
@Ben S: también sincronizado con un reloj de escritorio (con segundos) y otra PC. Todo tuvo el mismo tiempo de dar o tomar medio segundo, excepto el 'Cronómetro '. Solo probé esto debido a otra pregunta de StackOverflow en la que alguien mencionó que el cronómetro funcionaba aproximadamente 10 segundos cada 24 horas en su PC. Me encantaría ver esto confirmado/refutado por otros. – MusiGenesis
Aquí estaba esa pregunta: http://stackoverflow.com/questions/1416139/how-to-get-timestamp-of-tick-precision-in-net-c – MusiGenesis