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.
_______________________________________________
Libav-user mailing list
[email protected]
https://ffmpeg.org/mailman/listinfo/libav-user

To unsubscribe, visit link above, or email
[email protected] with subject "unsubscribe".

Reply via email to