使用FFMPEG库播放时,有没有办法设置/修改/更改/更新音频音量。 提前谢谢。
答案 0 :(得分:3)
您可以使用ffmpeg的volume过滤器。您可能想要搜索一下如何在您的应用程序中使用ffmpeg过滤器,但这通常是值得的。
您也可以通过将解码音频数据(AVFrame-&gt; data [0])中的PCM数据乘以您的音量倍增器(> 1.0以增加音量,<1.0以减小音量)来手动完成,但是那么你需要知道解码数据的格式。
答案 1 :(得分:0)
My code to set new volume for decoded buffer is -
void FFMpegPlayer::UpdateVolumeForFrames(uint8_t* pStartFrame, uint8_t* pEndFrame, const float kfVolume)
{
if(kfVolume <= 0.0f)
{
memset(pStartFrame, 0, pEndFrame - pStartFrame) ;
}
int16_t* pStart = (int16_t*)pStartFrame, *pEnd = (int16_t*)pEndFrame;
int32_t value = SHRT_MAX;
while(pStart <= pEnd)
{
value = *pStart * kfVolume;
if(value > SHRT_MAX)
{
value = SHRT_MAX;
}
if(value < SHRT_MIN)
{
value = SHRT_MIN;
}
*pStart = value;
++pStart;
}
}
Code to setup volume filter-
ret = avfilter_graph_create_filter(&fil_volume,
avfilter_get_by_name("volume"), "volume",
NULL, NULL, pVideoState->pAudioGraph);
if (ret < 0)
goto end;
pVideoState->fCurrentVolume = 0.5f ;
// Setting default volume value
{
AVDictionary* options_dict = nullptr;
av_dict_set(&options_dict, "volume", AV_STRINGIFY(0.5f), 0);
ret = avfilter_init_dict(fil_volume, &options_dict);
av_dict_free(&options_dict);
void *vol = (fil_volume->priv);
}