从 avi 转码为 mp4(x264) 时出现 fps 问题。最终问题出在 PTS 和 DTS 值中,因此在 av_interleaved_write_frame 函数之前添加了第 12-15 行:
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 情况下那样,为什么?outStream->codec
time_base of和有什么区别outStream
?- 要计算 pts
av_rescale_q
:需要 2 个 time_base,将它们的分数相乘,然后计算 pts。为什么会这样?正如我调试的那样,encodedPacket.pts
它的值增加了 1,那么如果它确实有值,为什么要改变它呢? - 开始时 dts 值为 -2 并且在每次重新缩放后它仍然有负数,但尽管如此视频播放正确!不应该是积极的吗?