After digging through ffmpeg.c, I finally figured it out. My code was sending pictures into the encoder using a pts in the stream's time_base of 1/90000 (e.g. 3003, 6006, 9009). The solution was to first rescale the AVFrame's pts from the stream's time_base to the codec time_base to get a simple frame number (e.g. 1, 2, 3).
pic->pts = av_rescale_q(pic->pts, ost->time_base, enc->time_base); avcodec_encode_video2(enc, &newpkt, pic, &got_packet_ptr); Then when a packet is received from the encoder, you need to rescale pts and dts back to the stream time_base. newpkt.pts = av_rescale_q(newpkt.pts, enc->time_base, ost->time_base); newpkt.dts = av_rescale_q(newpkt.dts, enc->time_base, ost->time_base); av_interleaved_write_frame(out, &newpkt); I guess not every codec requires this to be done, but libx264 does if you want to encode CBR/ABR. -- View this message in context: http://libav-users.943685.n4.nabble.com/Setting-libx264-bitrate-via-API-tp4655453p4655531.html Sent from the libav-users mailing list archive at Nabble.com. _______________________________________________ Libav-user mailing list [email protected] http://ffmpeg.org/mailman/listinfo/libav-user
