Non importa se il codificatore codifica video a 10 FPS o 30 FPS, con il timestamp RTP si indica al ricevitore quanto è lunga la pausa tra i due fotogrammi. Quindi lo decidi al volo per ogni fotogramma. In questo modo puoi inviare 10 fotogrammi in un secondo (10 fps) e in un secondo puoi inviare 30 fotogrammi (30 fps). È sufficiente impostare correttamente il timestamp RTP. E se ricevo la tua domanda, sei nel dubbio su come farlo ...
Lascia che il timestamp iniziale sia 0, aggiungi il tempo dell'orologio a muro in millisecondi moltiplicato per 100 all'ultimo timestamp RTP, oppure puoi usa qualsiasi scala temporale che desideri. Per rendere la decodifica di video 10fps decoder a 30 fps, aggiungere 333000 alla RTP timestamp per ogni pacchetto ... ma consente di guardare il tuo esempio:
Frame # RTP Time Time between frames [ms]
[ 1] 0 0
[ 2] 50000 50
[ 3] 90000 40
[ 4] 420000 33
Quindi, se si imposta la RTP timestamp come questo (Time in ms * 100000)
si farà carico decoder e decodificare il Frame 1, quindi caricare e decodificare il Frame 2, ma dormirà per 50 ms (differenza di tempo tra Frame 1 e Frame 2) prima di disegnare il Frame 2, e così via ...
E come voi può vedere, il decoder utilizza i timestamp RTP per sapere quando visualizzarli e non importa se il video è stato codificato a 30 o 10 fps.
Inoltre, se il video è 30 fps, ciò non significa che per ogni secondo ci saranno 30 pacchetti RTP. A volte possono esserci più di 100, quindi non è possibile avere una formula che assicuri il corretto calcolo del timestamp RTP.
immagino che questo è quello che ti serve ... speranza ho aiutato, Non -1 me se non ha ancora ... =)
Non è chiaro per me. Ho un [bitstream] (http://stackoverflow.com/questions/10562549/send-android-h264-capture-over-a-rtp-stream) dove sto cercando di analizzare nalu e inviarli con rtp. Il fatto è che devo calcolare il timestamp da solo. Attualmente sono abbastanza sicuro di sbagliarmi (timestamp-lasttimestamp) * 100000. Ho impostato il nuovo timestamp ogni volta che leggo un nuovo nalu dal flusso di bit, ma tale modulo farà variare il timestamp tra i pacchetti e il pacchetto A potrebbe avere un timestamp più grande del Packet B! – FlaPer87
Il timestamp RTP indica il tempo assoluto oltre alla differenza di tempo tra i frame. In caso contrario, non può essere utilizzato per la sincronizzazione tra audio e video. –
@RioWing No, non è possibile impostare il valore del tempo assoluto a 64 bit in modo affidabile nel campo intero a 32 bit. È meglio renderlo relativo a 0. Il punto è che il timestamp dovrebbe aumentare linearmente, lo stesso valore di timestamp dovrebbe corrispondere ai frame AV, e si dovrebbe tenere a mente il valore CLOCK RATE quando si impostano i timestamp, quindi in 1 secondo AV 'last_frame_timestamp - first_frame_timestamp = CLOCK_RATE'. Hai un'intestazione dell'estensione RTP per archiviare tutti gli altri dati desiderati, come timestamp (ticks) ecc. Ecc. – Cipi