libmp3lame игнорирует параметры ffmpeg и не может изменять битрейт аудио
У меня есть Java-приложение для кодирования аудио и отправки его через сокет на сервер, я использую ffmpeg, чтобы получить сжатый avpacket, а затем отправить этот пакет через сокет, проблема в том, что пропускная способность больше, чем нужно, и я не могу ее контролировать, я пытаюсь установить битрейт для кодировщика (libmp3lame), но он полностью игнорируется, и я не знаю, в чем проблема из кода или потому что я не использовал ffmpeg libformat для отправки пакета в сокет?
вот как я открываю кодек
codec = avcodec_find_encoder_by_name("libmp3lame");
//codec = avcodec_find_encoder(AV_CODEC_ID_MP3);
if(codec == null)
throw new Exception("Codec not found");
context = avcodec_alloc_context3(codec);
if(context == null)
throw new Exception("Could not allocate audio codec context");
context.codec_tag(0);
context.codec_id(AV_CODEC_ID_MP3);
context.codec_type(AVMEDIA_TYPE_AUDIO);
// set sample parameter
context.bit_rate(audio_bitrate);
context.sample_rate(samples_rate);
context.channels(samples_channels);
context.channel_layout(av_get_default_channel_layout(samples_channels));
context.time_base().num(1).den(samples_rate);
context.sample_fmt(AV_SAMPLE_FMT_S16);
context.bits_per_raw_sample(16);
context.flags(context.flags() | AV_CODEC_FLAG_QSCALE);
context.global_quality((int)Math.round(FF_QP2LAMBDA * audioQuality));
if ((codec.capabilities() & AV_CODEC_CAP_EXPERIMENTAL) != 0) {
context.strict_std_compliance(AVCodecContext.FF_COMPLIANCE_EXPERIMENTAL);
}
// priv_data()
av_opt_set(context.priv_data() , "crf" , audioQuality + "" , 0);
av_opt_set(context.priv_data() , "b" , "85" , 0);
//av_opt_set(context.priv_data() , "V" , "2" , 0);
//av_opt_set(context.priv_data() , "lowpass" , "120" , 0);
av_opt_set(context.priv_data() , "abr" , "1" , 0);
AVDictionary options = new AVDictionary(null);
//av_dict_set(options, "crf", ""+audioQuality , 0);
av_dict_set(options, "b:a", "8k" , 0);
av_dict_set(options , "q:a" , "8" , 0);
//av_dict_set(options , "lowpass" , "19.5" , 0);
//av_dict_set(options, "b" , "8K" , 0);
// open codec
if (avcodec_open2(context, codec, (PointerPointer)null ) < 0)
throw new Exception("Could not open codec");
....