2011-05-11 11 views
15

Estoy creando una aplicación para reproducir un tono de llamada y me gustaría saber la hora actual en milisegundos del tono de llamada reproducido cada vez.objetivoC/CMTime - convierte AVPlayer.duration en milisegundos

CMTime cTime = player_.currentTime; float currentTime = cTime.value/cTime.timescale;

Que currentTime aquí obtiene el valor en segundos. ¿Cómo puedo obtener el valor de CurrentTime exacto pero en milisegundos?

Respuesta

52

Hay una manera de conseguir los tiempos actuales en cuestión de segundos, se puede tomar 1000 veces eso y ther usted tiene sus milisegundos:

Float64 dur = CMTimeGetSeconds([player currentTime]); 
Float64 durInMiliSec = 1000*dur; 

desgracia que tendrá que utilizarlo como un float o Float64 se puede' t utilizar ese resultado como CMTime

+0

Pero, ¿cómo podemos pasar este valor de Float en la siguiente función? - (BOOL) insertTimeRange: (CMTimeRange) timeRange ofTrack: (AVAssetTrack *) seguimiento atTime: (CMTime) error de hora de inicio: error (NSError **); Porque toma CMTime como parámetro. – Developer

+0

Puede usar la hora original (en segundos) y crear un CMTime con ese valor utilizando la función CMTimeMake. – Samssonart

2

CMTime.value y CMTime.timescale son enteros, por lo que a juzgar por su código, el resultado se redondea y no obtiene una marca de tiempo precisa. Pruebe CMTimeGetSeconds en su lugar.

4

Creo que la respuesta aceptada pierde detalle. Una forma más precisa para obtener milisegundos sería el siguiente:

let seconds : Double = Float64(time.value * 1000)/Float64(time.timescale) 

Si convierte al segundo primero perdería precisión.

+0

Esto es incorrecto. De la documentación de Apple en CMTimeGetSeconds "La división se hace en Float64, por lo que la fracción no se pierde en el resultado devuelto". – amergin