[Libav-user] videorate realtime-adjusting
田浩杨
734512183 at qq.com
Mon Dec 2 10:29:22 EET 2019
I have a question. How can I modify the video-encode bitrate in real time during coding after the video encoder has been turned on? Here's what I did (take x264-encoder as an example) :
step1.
Modified the definition of structural AVCoder to add a function pointer.
int (*valid_context)(AVCodecContext*);
step2.
Added function definition to enable the codec rate of x264.
static int X264_config(AVCodecContext* avctx){
X264Context* x4 = avctx->priv_data;
if(avctx->bit_rate){
x4->params.rc.i_bitrate = avctx->bit_rate / 1000;
}
avctx->bit_rate = x4->params.rc.i_bitrate*1000;
return 0;
}
step3.
build AVCodec.
AVCodec ff_libx264_encoder = {
.name = "libx264",
.long_name = NULL_IF_CONFIG_SMALL("libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_H264,
.priv_data_size = sizeof(X264Context),
.init = X264_init,
//
.valid_context = X264_config,
//
.encode2 = X264_frame,
.close = X264_close,
.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS,
.priv_class = &x264_class,
.defaults = x264_defaults,
.init_static_data = X264_init_static,
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE |
FF_CODEC_CAP_INIT_CLEANUP,
.wrapper_name = "libx264",
};
step4.
FFmpeg interface layer.
int attribute_align_arg avcodec_valid_codec_Context(AVCodecContext* avctx){
int ret = 0;
ret = avctx->codec->valid_context(avctx);
if(ret){
av_log(avctx, AV_LOG_ERROR, "valid context error, ERROR CODE:%d\n",
ret);
}
return ret;
}
step5.
Whenever the application layer needs to modify the bit rate, then App should modify the AVCodecContext-> bit_rate, and then call the above interface to make the Context take effect in the encoder.
Because of the limited understanding of ffmpeg. So if there is a better way, also hope to give instruction.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://ffmpeg.org/pipermail/libav-user/attachments/20191202/807194aa/attachment.html>
More information about the Libav-user
mailing list