如何使用FFMPEG管理卷

时间:2015-05-12 10:30:45

标签: ffmpeg

使用FFMPEG库播放时,有没有办法设置/修改/更改/更新音频音量。 提前谢谢。

2 个答案:

答案 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);
        }