Hi - Indeed, that’s what I’m doing. This seems to have solved the same issue for some other folks, but my guess is that some other parameter/setting is necessary, which I don’t have :-(
— Philip > On Apr 8, 2015, at 6:03 AM, Max Vlasov <[email protected]> wrote: > > I think you should set frame pts before avcodec_encode_video2. After > avcodec_encode_video2 this value is transferred to the packet by the encoder > where it should be converted into the stream time base. > > On Mon, Apr 6, 2015 at 10:10 PM, Philip Schneider <[email protected] > <mailto:[email protected]>> wrote: > Greetings - > > I’m attempting to encode a sequence of frames with libx264. For testing, I’m > using the sample code from http://www.imc-store.com.au/Articles.asp?ID=276 > <http://www.imc-store.com.au/Articles.asp?ID=276>. This is all pretty vanilla > FFmpeg API usage, and is similar to what one might write oneself. It produces > correct output with libx264, however the bitrate I specify is not honored at > all… > > I can set the bitrate (m_AVIMOV_BPS) to whatever number I choose, and the > actual bitrate used is some other value: > > AVCodec *m_video_codec = > avcodec_find_encoder(m_fmt->video_codec); > if (!(m_video_codec)) { > return; > } > AVStream *st = avformat_new_stream(m_oc, m_video_codec); > AVCodecContext *m_c = st->codec; > > m_c->codec_id = m_fmt->video_codec; > m_c->bit_rate = m_AVIMOV_BPS; > > > Googling this issue, I find that it’s the subject of a lot of discussion. > Evidently, simply setting the bit rate in the context is not sufficient — I > can set m_AVIMOV_BPS to 400 million, but the bitrate used in encoding ends up > being something like 176 Kbps (using the info inspector in one of any number > of players/utilities). As well, visually I see significant undersampling > artifacts. I assume the effective bitrate used is computed by ffmpeg or the > encoder itself, based on some other (default) parameters. But in any case, my > value is being ignored, making the output useless to me. > > One forum I post I found ( > http://libav-users.943685.n4.nabble.com/Setting-libx264-bitrate-via-API-td4655453.html > > <http://libav-users.943685.n4.nabble.com/Setting-libx264-bitrate-via-API-td4655453.html> > ) suggests that the reason the encoder (or ffmpeg itself?) is ignoring the > bit rate is because of the use of “pts” and “dts” in the encoder and output > stream writer. Specifically, the encoder’s input should use, say, integer > frame numbers, while the stream writer should use values in its own time > base: > > 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); > > However, this is not working for me. I suspect it may be due to other > differences between my code and theirs.. :-( > > In any case, surely someone out there has the understanding (and code > snippets?) of how to get the libx264 encoder to honor the specified bitrate? > Any help/pointers/advice/code would be greatly appreciated! > > Thanks! > > > > _______________________________________________ > Libav-user mailing list > [email protected] <mailto:[email protected]> > http://ffmpeg.org/mailman/listinfo/libav-user > <http://ffmpeg.org/mailman/listinfo/libav-user> > > > _______________________________________________ > Libav-user mailing list > [email protected] > http://ffmpeg.org/mailman/listinfo/libav-user
_______________________________________________ Libav-user mailing list [email protected] http://ffmpeg.org/mailman/listinfo/libav-user
