从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
=12800分之1。 一日一被我设置,但我想不出为什么,谁设置12800? 我注意到,在该行之前(7)outStream->time_base
=九万分之一和后马上就变成12800分之1,为什么呢? 当我从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
? - 到calc下的PTS
av_rescale_q
确实:需要2那么time_base,乘以其交叉馏份,然后计算PTS。 为什么它这样做这样? 正如我调试时,encodedPacket.pts
具有值1的增量,那么,为什么改变它,如果它确实具有价值? - 在开始的DTS值为-2后重新调整各个它仍然有负数,但尽管这样的视频正常播放! 它不应该是积极的?