Понимание PTS и DTS в видеокадрах

У меня были проблемы с fps при перекодировании из avi в mp4 (x264). В конце концов проблема была в значениях PTS и DTS, поэтому строки 12-15 были добавлены перед функцией 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)

Прочитав много постов я так и не понял

outStream->codec->time_base = 1/25 иoutStream->time_base = 1/12800. Первый был установлен мной, но я не могу понять, почему и кто установил 12800? Я заметил это перед строкой (7)outStream->time_base = 1/90000 и сразу после него меняется на 1/12800, почему? Когда я транскодирую с avi на avi, это означает изменение строки (2) наavformat_alloc_output_context2(&outContainer, NULL, "avi", "c:\\test.avi"; так до и после строки (7)outStream->time_base остается всегда 1/25 и не как в случае mp4, почему?В чем разница между time_base изoutStream->codec а такжеoutStream?Для расчета очковav_rescale_q has: принимает 2 time_base, умножает их доли на крест и затем вычисляет баллы. Почему это так? Как я отлаживал,encodedPacket.pts имеет значение, увеличенное на 1, так зачем менять его, если оно имеет значение?В начале значение dts равно -2, и после каждого масштабирования оно по-прежнему имеет отрицательное число, но, несмотря на это, видео воспроизводится правильно! Разве это не должно быть положительным?

Ответы на вопрос(1)

Ваш ответ на вопрос