Entendiendo PTS y DTS en marcos de video

Tuve problemas de fps al transcodificar de avi a mp4 (x264). Finalmente, el problema estaba en los valores PTS y DTS, por lo que las líneas 12-15 se agregaron antes de la función av_interleaved_write_frame:

1.  AVFormatContext* outContainer = NULL;
2.  avformat_alloc_output_context2(&outContainer, NULL, "mp4", "c:\\test.mp4";
3.  AVCodec *encoder = avcodec_find_encoder(AV_CODEC_ID_H264);
4.  AVStream *outStream = avformat_new_stream(outContainer, encoder);
5.  // outStream->codec initiation
6.  // ...
7.  avformat_write_header(outContainer, NULL);

8.  // reading and decoding packet
9.  // ...
10. avcodec_encode_video2(outStream->codec, &encodedPacket, decodedFrame, &got_frame)
11. 
12. if (encodedPacket.pts != AV_NOPTS_VALUE)
13.     encodedPacket.pts =  av_rescale_q(encodedPacket.pts, outStream->codec->time_base, outStream->time_base);
14. if (encodedPacket.dts != AV_NOPTS_VALUE)
15.     encodedPacket.dts = av_rescale_q(encodedPacket.dts, outStream->codec->time_base, outStream->time_base);
16. 
17. av_interleaved_write_frame(outContainer, &encodedPacket)

Después de leer muchos posts todavía no entiendo:

outStream->codec->time_base = 1/25 youtStream->time_base = 1/12800. La primera fue establecida por mí, pero no puedo entender por qué y quién estableció 12800. Me di cuenta de que antes de la línea (7)outStream->time_base = 1/90000 y justo después cambia a 1/12800, ¿por qué? Cuando transcodifico de avi a avi, lo que significa cambiar la línea (2) aavformat_alloc_output_context2(&outContainer, NULL, "avi", "c:\\test.avi"; , así que antes y después de la línea (7)outStream->time_base permanece siempre 1/25 y no como en el caso de mp4, ¿por qué?¿Cuál es la diferencia entre time_base ofoutStream->codec youtStream?Para calcular los puntosav_rescale_q does: toma 2 time_base, multiplica sus fracciones en cruz y luego calcula los puntos. ¿Por qué hace esto de esta manera? Como he depurado, elencodedPacket.pts tiene valor incremental en 1, entonces ¿por qué cambiarlo si tiene valor?Al principio, el valor de dts es -2 y después de cada cambio de escala, todavía tiene un número negativo, pero a pesar de esto, el video se reproduce correctamente. ¿No debería ser positivo?

Respuestas a la pregunta(1)

Su respuesta a la pregunta